Foros del Web » Programando para Internet » PHP » Zend »

Zend Framework + Layouts: Se pueden usar Controllers?

Estas en el tema de Zend Framework + Layouts: Se pueden usar Controllers? en el foro de Zend en Foros del Web. Holaaaaaaaaaaaaaa Llevo dos días exactamente usando Zend Framework... así que es posible que mi pregunta sea muy obvia... pero no lo veo ..... : ¿Se ...
  #1 (permalink)  
Antiguo 20/05/2009, 04:00
 
Fecha de Ingreso: octubre-2008
Mensajes: 69
Antigüedad: 16 años, 1 mes
Puntos: 1
Zend Framework + Layouts: Se pueden usar Controllers?

Holaaaaaaaaaaaaaa

Llevo dos días exactamente usando Zend Framework... así que es posible que mi pregunta sea muy obvia... pero no lo veo ..... :

¿Se pueden usar los Controllers para los Layouts? Me explico:

He hecho unos layouts tal que así:

Código PHP:
         <div id="page">
        <div id="header">
        <?php echo $this->layout()->header ?>
        </div>
        <div class="clear"></div>
        
        <div id="content">
        <?php echo $this->layout()->content ?>
        </div>
        
        <div id="footer">
        <?php echo $this->layout()->footer ?>
        </div>
    </div>

y dentro del header tengo que escribir unas pocas lineas en php, por lo que hice su respectivo HeaderController, etc. Pero no aparece los resultados....
Para probar que mi código era correcto he copiado&pegado la misma porción del controlador del header en el del index y, en este, sí funciona. Entonces me pregunto, es posible que los Controllers no funcionen en los layouts? los he de registrar de alguna manera distinta? he buscando info al respecto y las layouts siempre las he encontrado "planas", es decir, sin código php por el medio.......


Bueno, nada más, graciaasss..
  #2 (permalink)  
Antiguo 20/05/2009, 08:26
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Zend Framework + Layouts: Se pueden usar Controllers?

No es nadamas hacer un $this->layout()->header, si quieres tener su propio controlador tienes que hacer un plugin para el FrontController y usar el ActionStack para poder llenar ese segmento e inyectarlo en el layout por ejemplo:
Código php:
Ver original
  1. <?php
  2. class MyPlugin extends Zend_Controller_Plugin_Abstract {
  3.     protected $_stack;
  4.    
  5.     public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) {
  6.         $stack = $this->getStack();
  7.         $menuRequest = new Zend_Controller_Request_Simple();
  8.         $menuRequest->setControllerName('head')
  9.                     ->setActionName('index');
  10.         $stack->pushStack($menuRequest);
  11.     }
  12.    
  13.     public function getStack() {
  14.         if (null === $this->_stack) {
  15.             $front = Zend_Controller_Front::getInstance();
  16.             if (!$front->hasPlugin('Zend_Controller_Plugin_ActionStack')) {
  17.                 $stack = new Zend_Controller_Plugin_ActionStack();
  18.                 $front->registerPlugin($stack);
  19.             } else {
  20.                 $stack = $front->getPlugin('ActionStack');
  21.             }
  22.             $this->_stack = $stack;
  23.         }
  24.        
  25.         return $this->_stack;
  26.     }
  27. }

Lo registras en tu FrontController y cada que hagas una llamada a X controller se va a ser el llamado a ese plugin y por ende a ese controller, luego dentro del controller solo haces un render a el response segment "header" o "footer" dependiendo del stack y como lo manejes.

Saludos.
  #3 (permalink)  
Antiguo 20/05/2009, 08:50
 
Fecha de Ingreso: octubre-2008
Mensajes: 69
Antigüedad: 16 años, 1 mes
Puntos: 1
Respuesta: Zend Framework + Layouts: Se pueden usar Controllers?

Holaa,

primero gracias por la respuesta. Entiendo que me has explicado dos formas, la primera poniendo $this->layout()->header.... pero dónde? y la segunda es haciendo el plugin... Por ahora me quedo con la primera, pero dónde tengo que poner esa linea? en principio ya la tengo puesta en el layout.phtml...

gracias, bye
  #4 (permalink)  
Antiguo 20/05/2009, 09:06
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Zend Framework + Layouts: Se pueden usar Controllers?

No, solo hay una forma (si quieres llamar al controller) y es usando el plugin, eso era lo que te explicaba, por defecto no se llama a ningún controller, tienes que forzosamente hacer el plugin con el actionStack para llamar al controller.

Saludos.
  #5 (permalink)  
Antiguo 20/05/2009, 10:00
 
Fecha de Ingreso: octubre-2008
Mensajes: 69
Antigüedad: 16 años, 1 mes
Puntos: 1
Respuesta: Zend Framework + Layouts: Se pueden usar Controllers?

ok, pues me pongo a ello, ¡ gracias !
  #6 (permalink)  
Antiguo 29/09/2009, 08:49
 
Fecha de Ingreso: septiembre-2009
Mensajes: 27
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Zend Framework + Layouts: Se pueden usar Controllers?

Hola que tal!!

Estuve intantando hacer que el layout reaccione con un controlador pero eso ejemplo de MyPlugin ese php donde lo guardo?? en los layout/scripts?? o en controladores??. y siguiendo con lo de frontcontroller donde se registra???

quiero saber porque estoy intentando hacer el ejemplo que esta en la pagina oficial:
layout.phtml

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>My Site</title>
</head>
<body>

<?php
// fetch 'content' key using layout helper:
echo $this -> layout ()-> content ;

// fetch 'foo' key using placeholder helper:
echo $this -> placeholder ( 'Zend_Layout' )-> foo ;

// fetch layout object and retrieve various keys from it:
$layout = $this -> layout ();
echo $layout -> bar ;
echo $layout -> baz ;
echo $this->layout()->title;
?>
</body>
</html>


y el fooController.php es:
<?php
class FooController extends Zend_Controller_Action
{
public function fooAction()
{
$this->view->title = 'Validaci&oacute;n';
}
public function barAction()
{
$this->view->title = 'Validaci&oacute;n';
// disable layouts for this action:
$this->_helper->layout->disableLayout();
}

public function bazAction()
{
$this->view->title = 'Validaci&oacute;n';
// use different layout script with this action:
$this->_helper->layout->setLayout('foobaz');
}
}

Pero no me hace nada, solamente me muestra el contenido... como hago???
  #7 (permalink)  
Antiguo 29/09/2009, 09:09
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Zend Framework + Layouts: Se pueden usar Controllers?

El plugin es para poder registrar un stack de actions en un mismo request, para lo que tu quieres hacer, debes de ejecutar todas esas actions en un mismo request para que cada una llene la parte del layout que sea necesaria.

Saludos.
  #8 (permalink)  
Antiguo 29/09/2009, 09:42
 
Fecha de Ingreso: septiembre-2009
Mensajes: 27
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Zend Framework + Layouts: Se pueden usar Controllers?

Hola, gracias por la respuesta pasa que empece con ese ejemplo pero en realidad lo que quiero hacer es como lo que te pregunto yakukubu...

Siguiendo con la respuesta de MyPluyin, si tengo los controladores del header y footer, con el MyPluyin srive para llamar a cada controlador que necesite?? porque en el ejemplo que pusiste en el setControllerName('head') llamas al head no???

Lo que quiero hacer ejemplo: es que en el header se sumen dos numeros y me aparezcan el la cabecera de todas las vistas... es algo sencillo pero si logro hacer eso pues se hace mas facil lo demas... Como lo haria si tengo el layout.phtml asi:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<?php echo $this->headLink()->appendStylesheet('/css/grid.css') ?>
<?php echo $this -> headTitle () ?>
<?php echo $this -> headScript () ?>
<?php echo $this -> headStyle () ?>
</head>
<body>

<h1><?php echo $this->title; ?></h1>

<?php echo $this -> render ( 'header.phtml' ) ?>

<div id="nav"> <?php echo $this -> placeholder ( 'nav' ) ?> </div>

<div id="bcss-sidebar-1"> <?php //echo $this->render ( 'sidebarLeft.phtml' ) ?> </div>

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

<div id="bcss-sidebar-2"> <?php //echo $this->render ( 'sidebarRight.phtml' ) ?> </div>

<?php echo $this -> render ( 'footer.phtml' ) ?>
</body>
</html>
  #9 (permalink)  
Antiguo 29/09/2009, 12:45
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Zend Framework + Layouts: Se pueden usar Controllers?

Exacto lo que haces es crear el plugin, lo registras en el frontController para que se ejecute en cada request, y con eso puedes cambiar el responseSegment en el controller e inyectar el resultado en el layout.

Saludos.
  #10 (permalink)  
Antiguo 29/09/2009, 13:28
 
Fecha de Ingreso: septiembre-2009
Mensajes: 27
Antigüedad: 15 años, 1 mes
Puntos: 0
Sonrisa

Hola yo otra vez! Gracias por responder estuve probando pero no me resulto... Te muestro lo que hice en el index.php coloque:

Código php:
Ver original
  1. require_once 'Zend/Layout.php';  
  2. Zend_Layout::startMvc(array('layoutPath' => ROOT_DIR.'/application/layouts/scripts'));
  3.  
  4. // Run!
  5. $frontController = Zend_Controller_Front::getInstance();
  6. $frontController->addControllerDirectory(ROOT_DIR.'/application/controllers');
  7. $frontController->throwExceptions(true);
  8. /*try {
  9.     $frontController->dispatch();
  10. } catch(Exception $e) {
  11.     echo nl2br($e->__toString());
  12. }*/

el layout tiene:

Código php:
Ver original
  1. <html>
  2.  <head>
  3.      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  4.      <link rel="stylesheet" type="text/css" href="<?php echo $this->baseUrl();?>/css/grid.css" />
  5.      <?php //echo $this->headLink()->appendStylesheet('/css/grid.css') ?>
  6.      <?php echo $this -> headTitle () ?>
  7.      <?php echo $this -> headScript () ?>
  8.      <?php echo $this -> headStyle () ?>
  9.  </head>
  10.  <body>
  11.      <div id="bcss-header"> <?php echo $this->render ( 'header.phtml' ) ?> </div>
  12.  
  13.      <div id="nav"> <?php echo $this -> placeholder ( 'nav' ) ?> </div>
  14.  
  15.      <div id="bcss-sidebar-1"> <?php echo $this->render ( 'sidebarLeft.phtml' ) ?> </div>
  16.  
  17.      <div id="bcss-content"> <?php echo $this -> layout ()-> content ?> </div>
  18.  
  19.      <div id="bcss-sidebar-2"> <?php echo $this->render ( 'sidebarRight.phtml' ) ?> </div>
  20.  
  21.      <div id="bcss-footer"> <?php echo $this -> render ( 'footer.phtml' ) ?> </div>
  22.  </body>
  23.  </html>

creer un controlador con esto:

Código php:
Ver original
  1. <?php
  2. class HeaderController extends Zend_Controller_Action
  3.  {
  4.     public function init()
  5.         {
  6.         // Render sidebar for every action
  7.         $response = $this->getResponse();
  8.         $response->insert('header', $this->view->render('header.phtml'));
  9.         //$this->view->title = 'Validaci&oacute;n';
  10.         }
  11.  
  12.     public function headerAction()
  13.     {
  14.         $this->view->title = 'Validaci&oacute;n';
  15.         $a=2;
  16.         $b=3;
  17.         $suma=$a+$b;
  18.         $this->view->suma = $suma;
  19.     }
  20. }

el header.phtml tiene:

Código php:
Ver original
  1. --------------------------------------------------------------------------
  2. <b>Fecha:</b> <?php echo date('d-m-Y'); ?>
  3. --------------------------------------------------------------------------
  4. <?php echo $this->suma; ?>
Nota: la fecha si me la muestra pero la suma no.

y cree el plugin que se encuentra en los controladores

Código php:
Ver original
  1. <?php
  2. class MyPlugin extends Zend_Controller_Plugin_Abstract {
  3.     protected $_stack;
  4.    
  5.     public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
  6.     {
  7.         $stack = $this->getStack();
  8.         $menuRequest = new Zend_Controller_Request_Simple();
  9.         $menuRequest->setControllerName('header')
  10.             ->setActionName('header');
  11.         $stack->pushStack($menuRequest);
  12.     }
  13.        
  14.     public function getStack()
  15.     {
  16.         if (null === $this->_stack) {
  17.             $front = Zend_Controller_Front::getInstance();
  18.             if (!$front->hasPlugin('Zend_Controller_Plugin_ActionStack')) {
  19.                 $stack = new Zend_Controller_Plugin_ActionStack();
  20.                 $front->registerPlugin($stack);
  21.             } else {
  22.                 $stack = $front->getPlugin('ActionStack');
  23.             }
  24.         $this->_stack = $stack;
  25.         }
  26.         return $this->_stack;
  27.     }
  28. }

Pero igual sigue sin mistrarme lo que quiero....

Disculpa tanta molestia, Gracias nuevamente

sera que me falta algo???...

Última edición por jam1138; 29/09/2009 a las 13:48
  #11 (permalink)  
Antiguo 29/09/2009, 14:00
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Zend Framework + Layouts: Se pueden usar Controllers?

Si, tu estas usando render en el método init() eso llama directamente al código y lo asigna. Posteriormente tu asignas suma en el método headerAction() por lo que ahí ya no existe para el scope de header.phtml.

Aparte de que en tu layout estas volviendo a renderear header.phtml.

Lee bien todo el post, tienes que a) crear el plugin y b) registrarlo, es muy importante que lo registres con el frontController de lo contrario nunca va a ser llamado.

Saludos.
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




La zona horaria es GMT -6. Ahora son las 10:45.