Ver Mensaje Individual
  #1 (permalink)  
Antiguo 20/11/2009, 05:25
malakana
 
Fecha de Ingreso: junio-2005
Mensajes: 11
Antigüedad: 18 años, 10 meses
Puntos: 0
ActionStack y Layout

Llevo un par de días partiendome la cabeza y leyendo información por todos lados intentando poder organizar mi proyecto Zend Framework.

Mi objetivo es cargar la acción que quiera del controlador que quiera en el lugar que quiera de mi proyecto. Por ejemplo cargar en un layout a 3 columnas, en la columna de la derecha 3 acciones de controladores diferentes que haga cada una una cosa.

Buscando información creo que llego a entender que para realizar esta tarea lo que necesito es usar actionStack y un plugin.

Enlace donde explican un poco el tema dentro del foro

" forosdelweb.com/f68/zend-framework-layouts-pueden-usar-controllers-701219/ "

(No me deja poner el enlace completo)

Pongo mi código por si pudiesen orientarme un poco.


Mi layout

Código:
<?php echo $this->doctype(); ?>
<html xmlns="" xml:lang="es" lang="es"> 
<head>
    <?php echo $this->HeadMeta(); ?> 
    <?php echo $this->headTitle(); ?> 
    <?php echo $this->headLink()->prependStylesheet($this->baseUrl().'/css/estilo.css'); ?> 
</head>
<body>

	<div id="header">
	<?php echo $this->layout()->header; ?>    
	</div>

	<div id="content">
		<div id="sidebarLeft">
		<?php echo $this->layout()->sidebarLeft; ?>
	    </div>
	 			
		<div id="sidebarRight">    
		<?php echo $this->layout()->sidebarRight; ?>    	
	 	</div>
 	</div>
 	
	<div id="footer">    
	<?php echo $this->layout()->footer ?>
	</div>

</body>
</html>

Tengo la plantilla divida en header, sidebarLeft, sidebarRight y footer.

Dentro de la carpeta library a parte de la carpeta Zend con los controladores tengo otra carpeta llamada plugins donde se encuentra el fichero de plugin llamado MyPlugin.php. Os pongo el código

Código:
<?php
class MyPlugin extends Zend_Controller_Plugin_Abstract {
    protected $_stack;
    
    public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) 
    {
        $stack = $this->getStack();
        $userlistRequest = new Zend_Controller_Request_Simple();

        
        $menuRequest->setControllerName('user')
            ->setActionName('list');
            
        $stack->pushStack($userlistRequest);
        
        
        $userregisterRequest = new Zend_Controller_Request_Simple();        
        
        $menuRequest->setControllerName('user')
            ->setActionName('register');
                        
        $stack->pushStack($userregisterRequest);        
        
   
        
        
        
    }
        
    public function getStack() 
    {
        if (null === $this->_stack) {
            $front = Zend_Controller_Front::getInstance();
            if (!$front->hasPlugin('Zend_Controller_Plugin_ActionStack')) {
                $stack = new Zend_Controller_Plugin_ActionStack();
                $front->registerPlugin($stack);
            } else {
                $stack = $front->getPlugin('ActionStack');
            }
        $this->_stack = $stack;
        }
        return $this->_stack;
    }
}
Ahora mismo para probar, estoy tratando de cargar acciones de userController, llamadas register y list en el indexController . Una es un formulario y la otra es una lista de usarios.

Os pongo el código
Código:
<?php

class UserController extends Zend_Controller_Action
	{
	function init()
		{
		$this->initView();
		$this->view->baseUrl = $this->_request->getBaseUrl();
		
	    $response = $this->getResponse();
	    $response->insert('sidebarLeft', $this->view->render('sidebarLeft.phtml'));
	    $response->insert('sidebarRight', $this->view->render('sidebarRight.phtml'));
	    $response->insert('header', $this->view->render('header.phtml'));
	    $response->insert('footer', $this->view->render('footer.phtml'));    	   	
		}		
		
	function indexAction()
		{			
		$this->_redirect('/');
		}
			
		

	function registerAction(){			
	    	$this->_helper->viewRenderer->setResponseSegment('sidebarRight');

			 	    	
	    	    	
	        $this->view->title = "Registro Usuario";
	        $this->view->headTitle($this->view->title, 'PREPEND');
	
	        $form = new Form_User();
	        $form->submit->setLabel('Registrar');
	        $this->view->form = $form;

	       			
	        if ($this->getRequest()->isPost()) {
	            $formData = $this->_request->getPost();

			            
	            if ($form->isValid($formData)) {
	                $nick = $form->getValue('nick');
					$email = $form->getValue('email');	                
	                $password = $form->getValue('password');
	                	                
	                $users = new Model_DbTable_Users();
	                $users->addUser($nick, $email, $password);		                							
					$this->_redirect('/');
	            } else {
	                $form->populate($formData);
	            }
	        }
				
							
		}

	function listAction(){

						
		$this->_helper->viewRenderer->setResponseSegment('sidebarRight');
				
        $this->view->title = "Listado de usuarios";
        $this->view->headTitle($this->view->title, 'PREPEND');
        $users = new Model_DbTable_Users();
		$users = $users->fetchAll();
        


		// obtenemos la página actual
		$page = $this->_getParam('pagina', 2);
		// número de registros a mostrar por página
		$registros_pagina = 2;
		// número máximo de páginas a mostrar en el paginador
		$rango_paginas = 5;



		$paginador = Zend_Paginator::factory($users);
		$paginador->setItemCountPerPage($registros_pagina)
				  ->setCurrentPageNumber($page)
				  ->setPageRange($rango_paginas);
	
				 			 				  
		$this->view->users = $paginador;

        
        

		
		
	}			
		
		
		

		
		
		

	}
Y ahora en el indexController he probado a añdir con los helper actionStack las acciones.

Código:
    public function indexAction()
    {        	     	
	$this->_helper->actionStack ('register', 'user');
	$this->_helper->actionStack ('list', 'user');
    }

Así tal y como lo pongo, se me muestra solo la acción register del controlador user y me gustaría que se pudiesen mostrar las dos acciones contiguas o poder mostrarla cada una en un parte diferente del index. La verdad he probado mil cosas pero no doy con la tecla. Si pudiesen mostrarme un poco de luz se los agradecería. Saludos!!