Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

ActionStack y Layout

Estas en el tema de ActionStack y Layout en el foro de Frameworks y PHP orientado a objetos en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 20/11/2009, 05:25
 
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!!
  #2 (permalink)  
Antiguo 20/11/2009, 07:03
 
Fecha de Ingreso: noviembre-2007
Ubicación: Lanus, Buenos Aires
Mensajes: 178
Antigüedad: 16 años, 5 meses
Puntos: 14
Respuesta: ActionStack y Layout

Yo generalmente cuando tengo que hacer algo asi uso ViewHelpers para las distintas columnas, crear un controlador para armar ese tipo de cosas no me gusta mucho, y el view helper me resulta mas limpio, ademas se evita el uso del actionStack que no es taaan bueno en cuanto a rendimiento

Código PHP:
<?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->siteHeader(); ?>    
    </div>

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

</body>
</html>

Personalmente, mi layout quedaria asi, con 4 view helpers (siteHeader, sidebarLeft, sidebarRight, siteFooter)

y es mucho mas simple y limpio que andar haciendo todo lo anterior
  #3 (permalink)  
Antiguo 20/11/2009, 07:12
 
Fecha de Ingreso: junio-2005
Mensajes: 11
Antigüedad: 18 años, 10 meses
Puntos: 0
Respuesta: ActionStack y Layout

Y como haría de hacerlo así, para ir llenando las distintas columnas con los action que quiero??. Estoy muy muy verde aún con Zend y quizás este preguntando algo muy obvio. ;D
  #4 (permalink)  
Antiguo 20/11/2009, 07:13
 
Fecha de Ingreso: junio-2009
Mensajes: 156
Antigüedad: 14 años, 11 meses
Puntos: 3
Respuesta: ActionStack y Layout

Yo lo hago con action view helper

<div id="menuderecha">
echo $this->action('action', 'controller','modulo');
</div>

Aca tienes un link muy bien explicado por Pablo Morales:

h t t p://blog.pablo-morales.com/2008/05/action-view-helper/
  #5 (permalink)  
Antiguo 20/11/2009, 07:22
 
Fecha de Ingreso: noviembre-2007
Ubicación: Lanus, Buenos Aires
Mensajes: 178
Antigüedad: 16 años, 5 meses
Puntos: 14
Respuesta: ActionStack y Layout

el action view helper tiene casi las mismas contras que el actionStack, es mas creo haber leido que en prox versiones de ZF quizas lo saquen, ya que en su lugar siempre se pueden usar view helpers, partials, etc

http://www.rmauger.co.uk/2009/03/why...stack-is-evil/

ademas volviendo sobre lo mismo, no me parece crear un controlador para ese tipo de cosas (aunque todo depende del gusto de cada uno :P)

lee sobre view helpers en el manual de zend http://framework.zend.com/manual/en/...helpers.custom, basicamente crearas un view helper que retorne el HTML correspondiente a la cabecera, otro correspondiente a cada sidebar, etc

a modo de ejemplo el header quedaria asi

Código PHP:
class Zend_View_Helper_SiteHeader extends Zend_View_Helper_Abstract
{

    public function 
siteHeader()
    {
       return 
"<div><h1>Mi Sitio</h1></div>";
    }

y luego en el layout lo llamas simplemente
Código PHP:
echo $this->siteHeader(); 
  #6 (permalink)  
Antiguo 20/11/2009, 07:52
 
Fecha de Ingreso: octubre-2009
Mensajes: 240
Antigüedad: 14 años, 6 meses
Puntos: 6
Respuesta: ActionStack y Layout

Esta interesante hacer todo esto desde los helpers.
Ahora me pregunto si lo correcto no sería traer los datos desde los helpers y el html crearlo directamente en la vista.

Conocen algun tutorial sobre esto?
Saludos.
  #7 (permalink)  
Antiguo 20/11/2009, 08:01
 
Fecha de Ingreso: junio-2005
Mensajes: 11
Antigüedad: 18 años, 10 meses
Puntos: 0
Respuesta: ActionStack y Layout

Muchas gracias chicos, investigo y reporto mis andanzas, gracias de verdad por toda la ayuda.
  #8 (permalink)  
Antiguo 20/11/2009, 08:08
 
Fecha de Ingreso: noviembre-2007
Ubicación: Lanus, Buenos Aires
Mensajes: 178
Antigüedad: 16 años, 5 meses
Puntos: 14
Respuesta: ActionStack y Layout

Cita:
Iniciado por principianteZF Ver Mensaje
Esta interesante hacer todo esto desde los helpers.
Ahora me pregunto si lo correcto no sería traer los datos desde los helpers y el html crearlo directamente en la vista.

Conocen algun tutorial sobre esto?
Saludos.
La funcion de los view helpers es ni mas ni menos que crear html y devolverlo, asi que esta perfecto :)
  #9 (permalink)  
Antiguo 20/11/2009, 10:49
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: ActionStack y Layout

Exacto, adentrando más en el tema, esa es la razón por la cual el actionstack o el action helper son malas ideas, la idea del patrón MVC es que el controlador solamente reaccione a los inputs que vienen desde el usuario.

Para lo que quieren hacer es más limpio un viewHelper que instancie un modelo y devuelva los datos.

Recuerden no sobrecargar sus controllers, estos deben de estar limpios y solo reaccionar en base a inputs de la aplicación y luego pasar el control a la capa de la vista. Ahora sí que las únicas capas que tienen comunicación bidireccional es Model <-> View, Controller solo informa al Model y pasa el control al View.

Saludos.
  #10 (permalink)  
Antiguo 20/11/2009, 17:24
 
Fecha de Ingreso: diciembre-2007
Mensajes: 178
Antigüedad: 16 años, 4 meses
Puntos: 1
Respuesta: ActionStack y Layout

Que tal, yo no lo he utilizado, pero tengo entendido que Zend_Navigation tambien sirve para esto.
  #11 (permalink)  
Antiguo 21/11/2009, 03:28
 
Fecha de Ingreso: junio-2005
Mensajes: 11
Antigüedad: 18 años, 10 meses
Puntos: 0
Respuesta: ActionStack y Layout

Pues siguiendo el ejemplo de Rodrigo, he creado los view helper para cada una de las secciones de la página.

Código:

<?php

class Zend_View_Helper_SidebarLeft
{
	function sidebarLeft()
	{	
    
	echo "Left";   	
    		    	    	
	    	    	    	    	      
    }
}
Código:

<?php

class Zend_View_Helper_SidebarRight
{
	function sidebarRight()
	{	
    
	echo "Right";   	
    		    	    	
	    	    	    	    	      
    }
}
Y así con Header y Footer también.

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'); ?>
    <?php echo $this->headLink()->prependStylesheet($this->baseUrl().'/css/estilo.css'); ?>
    <?php echo $this->headScript()->appendFile($this->baseUrl().'/js/jquery-1.3.2.js')?>
             
</head>
<body>

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

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

</body>
</html>
Y desde la vista en el index intento llamar a dos acciones de UserController

Código:
<p>Esto es una prueba de la vista</p>

<p><a href="<?php echo $this->url(array('controller'=>'index', 
        'action'=>'add'));?>">Add new album</a></p>
<table>
<tr>
    <th>Nombre</th>
    <th>Password</th>
    <th>&nbsp;</th>
</tr>
<?php foreach($this->users as $user) : ?>
<tr>
    <td><?php echo $this->escape($user->username);?></td>
    <td><?php echo $this->escape($user->password);?></td>
    <td>
        <a href="<?php echo $this->url(array('controller'=>'index', 
            'action'=>'edit', 'id'=>$album->id));?>">Edit</a>
        <a href="<?php echo $this->url(array('controller'=>'index', 
            'action'=>'delete', 'id'=>$album->id));?>">Delete</a>
    </td>
</tr>
<?php endforeach; ?>

</table>



 

<?php echo $this->action('register', 'user'); ?>
<?php echo $this->action('list', 'user'); ?>
Pero no consigo mostrar nada. Lo que si se ve cuando este mismo código lo coloco directamente en el layout por defecto.

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'); ?>
    <?php echo $this->headLink()->prependStylesheet($this->baseUrl().'/css/estilo.css'); ?>
    <?php echo $this->headScript()->appendFile($this->baseUrl().'/js/jquery-1.3.2.js')?>
             
</head>
<body>

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

	<div id="content">
		<div id="sidebarLeft">
		<?php echo $this->sidebarLeft(); ?>  		
	    </div>
	 			
		<div id="sidebarRight">    
  		<?php echo $this->sidebarRight(); ?>
  		
		<?php echo $this->action('register', 'user'); ?>
		<?php echo $this->action('list', 'user'); ?>
  		
  		
  		  		    	
	 	</div>
 	</div>
 	
	<div id="footer">    
	<?php echo $this->footer(); ?>
	</div>

</body>
</html>
Saben a que se puede deber??
  #12 (permalink)  
Antiguo 21/11/2009, 04:45
 
Fecha de Ingreso: noviembre-2007
Ubicación: Lanus, Buenos Aires
Mensajes: 178
Antigüedad: 16 años, 5 meses
Puntos: 14
Respuesta: ActionStack y Layout

en el layout debes poner, donde quieras mostrar el contenido

Código PHP:
echo $this->layout()->content 
  #13 (permalink)  
Antiguo 24/11/2009, 09:46
 
Fecha de Ingreso: octubre-2009
Mensajes: 240
Antigüedad: 14 años, 6 meses
Puntos: 6
Respuesta: ActionStack y Layout

Hola, este mismo ejemplo pero hecho con Zend Navigation, alguien sabe como sería?

Saludos.
  #14 (permalink)  
Antiguo 24/11/2009, 10:01
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: ActionStack y Layout

Son dos cosas muy distintas, una es el Layout, y el componente Zend_Navigation sirve para mantener la navegación.

Saludos.
  #15 (permalink)  
Antiguo 07/12/2009, 17:07
Avatar de oswaldochc  
Fecha de Ingreso: octubre-2009
Ubicación: Ecuador
Mensajes: 41
Antigüedad: 14 años, 6 meses
Puntos: 1
Respuesta: ActionStack y Layout

Hola
Leyendo el comentario del compañero ramonw....

Y encontrandome en la situacion que explica Pablo Morales como en su articulo
h t tp://blog.pablo-morales.com/2008/05/action-view-helper/

Y debido a las contrariedades que presenta
echo $this->action('action', 'controller','modulo');
Como podria cargar varios modulos en diferentes posiciones, existe algun otra manera de hacerlo...si cada modulo tiene su propia vista y esta se dibujara en la seccion en la que se llame el action...
  #16 (permalink)  
Antiguo 07/12/2009, 19:40
 
Fecha de Ingreso: noviembre-2007
Ubicación: Lanus, Buenos Aires
Mensajes: 178
Antigüedad: 16 años, 5 meses
Puntos: 14
Respuesta: ActionStack y Layout

view... helpers... la vida es un... view... helper...

:P
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 06:51.