Por defecto ZF3 provee una sola plantilla de maqueta layout.phtml. En las aplicaciones de la vida real probablemente necesitaremos tener varias maquetas y cambiar de maqueta en determinados controles o acciones.
Por ejemplo, podemos tener un front-end y un back-end como partes de nuestro sitio. La parte del front-end consistiría en páginas web visibles públicamente para todos los usuarios y utilizaría la maqueta por defecto en todas sus páginas. La parte del back-end consistiría de páginas visibles solo al usuario administrador y utilizaría otra plantilla de maqueta que contiene el menú administrativo.
Primero preparamos otro archivo para la plantilla de maqueta. Por ejemplo, lo podemos llamar layout2.phtml. Para simplificar la preparación del archivo copiamos el contenido del archivo por defecto layout.phtml y hacemos los cambios necesarios.
Cuando la segunda plantilla de maqueta está lista podemos cambiar entre maquetas desde una determinada acción del controlador usando el siguiente código:
// A controller's action method that uses an alternative
// layout template.
public function indexAction()
{
//...
// Use the Layout plugin to access the ViewModel
// object associated with layout template.
$this->layout()->setTemplate('layout/layout2');
//...
}
Arriba el método de acción usa el complemento para controladores Layout
(línea 9) que permitir acceder a una instancia de la clase ViewModel
asociada
con la plantilla de maqueta. Para cambiar una plantillad de maqueta desde un
método de acción llamamos al método setTemplate()
provisto por la clase
ViewModel
.
Además del complemento para controladores
Layout
existen el ayudante de vistaLayout
que nos provee con la misma capacidad. Por ejemplo, con el ayudante de vistaLayout
podemos cambiar la maqueta de una página "estática" que no tiene una acción de controlador especifica.
Si todos los métodos de acción de una clase controladora usan la misma maqueta
alternativa podemos sobrescribir el método onDispatch()
de la clase
AbstractActionController
y llamar al método setTemplate()
como se
muestra en el ejemplo siguiente:
// Add this alias in the beginning of the controller file
use Zend\Mvc\MvcEvent;
// ...
class IndexController extends AbstractActionController
{
/**
* We override the parent class' onDispatch() method to
* set an alternative layout for all actions in this controller.
*/
public function onDispatch(MvcEvent $e)
{
// Call the base class' onDispatch() first and grab the response
$response = parent::onDispatch($e);
// Set alternative layout
$this->layout()->setTemplate('layout/layout2');
// Return the response
return $response;
}
}