2009-08-21 16 views
8

Quiero generar un sitio dinámico usando Zend_Layout.Zend Framework: renderizar múltiples vistas en un diseño

Mi diseño (/application/layouts/scripts/layout.phtml) contiene las siguientes líneas:

...   
<body> 

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

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

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

    </body> 
... 

Si hojeo a mi índice acción index del controlador - Zend hace que la vista de índice (application/views/scripts/index/index.phtml) dentro de $ this-> layout() -> content automatically.

Ahora quiero representar las vistas de diferentes acciones del controlador en el diseño. Así que genero una nueva autorización de controlador con un inicio de sesión de acción que muestra un formulario de inicio de sesión.

me cambio de diseño a:

...   
    <body> 

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

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

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

     </body> 
    ... 

Cuando hojeo al indice/índice, quiero definir en esta acción que deben emitir Zend vista auth/login en el interior $ this-> layout() -> inicio de sesión y, por ejemplo, noticias/lista dentro de $ this-> layout() -> content.

index/índice es de un tipo de un diseño de página - y auth/login y noticias/anota el tipo de control

Cómo hacer esto?

+0

En realidad, otra pregunta, ¿qué prefieres utilizar ver ayudantes o ver scripts? – basstradamus

Respuesta

8

primer consejo es evitar la vista ayudante de acciones en absoluto costos, probablemente será eliminado en ZF 2.0 de todos modos. (ZF-5840) (Why the actionstack is evil)

Esto se relaciona con un question I asked - y la respuesta de bittarman es bastante útil. La mejor manera de implementar algo así es tener un asistente de visualización que pueda generar su área de "inicio de sesión". My_View_Helper_Login por ejemplo. Entonces su diseño puede llamar al $this->login(), y también lo puede hacer la secuencia de comandos de vista para user/login. En cuanto a tener index/index renderizar el contenido desde news/list solo reenvía la solicitud al otro controlador/acción desde el controlador. $this->_forward('list', 'news');

+0

gracias, todavía he pensado en el problema de rendimiento. – opHASnoNAME

3

También desaconsejaría usar el action view helper. A menos que tenga un montón de lógica en su controlador, probablemente no necesite enviar otra solicitud a otro controlador solo para renderizar una vista parcial.

Yo recomendaría el simple uso de una vista parcial al igual que ha hecho con su header.phtml y footer.phtml:

<body> 

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

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

     <div id="login"><?php echo $this->render('auth/login.phtml') ?></div> 

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

</body> 

Y tal vez su auth/login.phtml script de vista es el siguiente:

<div id="login_box"> 
    <?php if (empty($this->user)): ?> 
     Please log in 
    <?php else: ?> 
     Hello <?php echo $this->user->name ?> 
    <?php endif; ?> 
</div> 

Mientras usted configura las variables de su vista en algún punto de su controlador, puede llamar al render view helper desde dentro de una vista (o incluso un controlador si lo desea).

#index controller 
public function indexAction() 
{ 
    $this->view->user = Model_User::getUserFromSession(); 
} 
+0

¿Qué pasa si no estamos en índice/índice (controlador de índice, acción de índice), vista-> usuario no se definirá, cómo hacer que la lógica detrás de vista-> usuario se aparte de la acción actual? Parece que la respuesta que he encontrado en mi investigación es una ayuda para la vista, ¿verdad ...? – Tangocoder

0

llegué a esta página en la búsqueda de una respuesta a mi propio problema, que es que mi diseño fue llamado varias veces. Esto sucedió debido a múltiples razones:

1) he hecho una mala llamada AJAX, tenía/ayuda en vez de/módulo/Ayuda

2) Llamé a una acción, exampleAction(), que tenía que poner un

$this->_helper->layout->disableLayout(); 

Para evitar que el diseño se represente nuevamente.

3) Hice una redirección, intente usar un reenvío o una ruta.

Cuestiones relacionadas