A free and open-source book on ZF3 for beginners

Translation into this language is not yet finished. You can help this project by translating the chapters and contributing your changes.

6.4. Cambiar entre Maquetas

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 vista Layout que nos provee con la misma capacidad. Por ejemplo, con el ayudante de vista Layout podemos cambiar la maqueta de una página "estática" que no tiene una acción de controlador especifica.

6.4.1. Colocar una Maqueta para todas las Acciones de un Controlador

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;
  }
}

Top