Ci się wszystkie moduły mają onBootstrap() sposób wszystkie kontrolery rozciągające AbstractController mieć onDispatch() metoda.
Zważywszy chcesz zastosować inny układ dla jednego konkretnego sterownika, wystarczy wykonać następujące czynności:
<?php
namespace MyModule\Controller;
use Zend\Mvc\Controller\AbstractActionController; // Or AbstractRestfulController or your own
use Zend\View\Model\ViewModel; // Or JsonModel or your own
use Zend\Mvc\MvcEvent;
class MyController extends AbstractActionController
{
public function onDispatch(MvcEvent $e)
{
$this -> layout('my-layout'); // The layout name has been declared somewhere in your config
return parent::onDispatch($e); // Get back to the usual dispatch process
}
// ... Your actions
}
Można to zrobić dla każdego kontrolera, który posiada specjalny układ. Dla tych, którzy tego nie robią, cóż, nie musisz nic pisać.
Jeśli często trzeba zmienić układ (na przykład trzeba obsługiwać nie jeden kontroler, ale kilka), można dołączyć MvcEvent do swojego modułu.php, aby uzyskać kod ustawienia układu w jednym miejscu.
Aby zachować prostotę, nie używam tutaj niestandardowego detektora, ale można również użyć jednego z nich.
<?php
namespace MyModule;
use Zend\Mvc\MvcEvent;
class Module
{
public function onBootstrap(MvcEvent $e)
{
$eventManager = $e -> getApplication() -> getEventManager();
$eventManager -> attach(
MvcEvent::EVENT_DISPATCH,
// Add dispatch error event only if you want to change your layout in your error views. A few lines more are required in that case.
// MvcEvent::EVENT_DISPATCH | MvcEvent::EVENT_DISPATCH_ERROR
array($this, 'onDispatch'), // Callback defined as onDispatch() method on $this object
100 // Note that you don't have to set this parameter if you're managing layouts only
);
}
public function onDispatch(MvcEvent $e)
{
$routeMatch = $e -> getRouteMatch();
$routeParams = $routeMatch -> getParams();
switch ($routeParams['__CONTROLLER__']) {
// You may use $routeParams['controller'] if you need to check the Fully Qualified Class Name of your controller
case 'MyController':
$e -> getViewModel() -> setTemplate('my-first-layout');
break;
case 'OtherController':
$e -> getViewModel() -> setTemplate('my-other-layout');
break;
default:
// Ignore
break;
}
}
// Your other module methods...
}
Dzięki, pomogło mi to w moim przypadku. –