2016-12-16 2 views

Antwort

1

Sie können für einen bestimmten Controller-Aktion zwischen Layouts umschalten, indem Sie den folgenden Code verwenden:

// 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'); 

    //... 
} 

Neben dem Layout Controller Plugin gibt die Layout Ansicht Helfer, die die gleichen Funktionen zur Verfügung stellt. Mit den Layout-Ansicht Helfern, können Sie zum Beispiel wechseln Layout aus der „statischen“ Seite , die keine spezifische Controller-Aktion hat.

Einstellung Layout für alle Aktionen eines Controllers

Wenn alle Aktionsmethoden einer Controller-Klasse müssen die gleiche alternative Layout verwenden, können Sie die onDispatch() Methode der AbstractActionController Klasse außer Kraft setzen und rufen Sie die setTemplate() Verfahren dort, wie im Beispiel unten gezeigt:

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

Reference

1

Zend Framework - Issue

> Sie können das Layout auf dem aktuellen Modul basiert ändern. Dies erfordert, (a) Erfassen, wenn der Controller in Routing abgestimmt zu diesem Modul gehört, und dann (b) die Vorlage von dem Ansicht Modell zu ändern.

Der Ort, um diese Aktionen zu tun, ist in einem Zuhörer. Es sollte entweder auf das "route" -Ereignis mit niedriger (negativer) Priorität oder auf das "dispatch" -Ereignis mit beliebiger Priorität zuhören. In der Regel registrieren Sie diese während des Bootstrap-Ereignisses.

namespace Content; 
 

 
class Module 
 
{ 
 
    /** 
 
    * @param \Zend\Mvc\MvcEvent $e The MvcEvent instance 
 
    * @return void 
 
    */ 
 
    public function onBootstrap($e) 
 
    { 
 
     // Register a dispatch event 
 
     $app = $e->getParam('application'); 
 
     $app->getEventManager()->attach('dispatch', array($this, 'setLayout')); 
 
    } 
 

 
    /** 
 
    * @param \Zend\Mvc\MvcEvent $e The MvcEvent instance 
 
    * @return void 
 
    */ 
 
    public function setLayout($e) 
 
    { 
 
     $matches = $e->getRouteMatch(); 
 
     $controller = $matches->getParam('controller'); 
 
     if (false === strpos($controller, __NAMESPACE__)) { 
 
      // not a controller from this module 
 
      return; 
 
     } 
 

 
     // Set the layout template 
 
     $viewModel = $e->getViewModel(); 
 
     $viewModel->setTemplate('content/layout'); 
 
    } 
 
}

Das Handbuch sagt oben, aber wenn Sie diesen Code verwenden mögen, werden Sie brauchen:

// module/Content/config/module.config.php 
 

 
return [ 
 

 
    /* whatever else */ 
 

 
    'view_manager' => [ 
 
     'template_map' => [ 
 
      'content/layout' => __DIR__ . '/../view/layout/layout.phtml'
 
 
     ] 
 
    ] 
 
];

In Kürze, wenn alle Module initialisiert (bootstrap) erfolgreich, Zend wird onBootstrap() automatisch aufrufen, die "Dispatch" -Ereignis an setLayout() Methode, wo der Controller-Name mit aktuellen Namespace des Moduls übereinstimmt, und wenn Erfolg, verwenden Sie setTemplate() Layout festlegen Vorlage.

z.B.(! Erfolg)

Module/Namespace: Content,

Controller: Content\Controller\MatchMeController,

Controller: Other\Controller\DontMatchMeController,(nicht!)

Aber es gibt einen kleinen Nachteil: setLayout() Verwendung

strpos(controller, __NAMESPACE__) === false

um das aktuelle Modul zu identifizieren, aber was, wenn ich ein ContentController in einem anderen Modul hatte? So verwenden

strpos(controller, __NAMESPACE__) !== 0

statt.

----------

Zend Framework - Issue

Das Handbuch recht detailliert ist, erwähnt sie auch viele andere Dinge, wie setzen verschiedene Layouts für verschiedene Controller (oder Aktionen).

Verwandte Themen