festlegen Wie kann ich verschiedene Layouts für unterschiedliche Module in Zend Framework 3 anstelle von einzelnen gleiche Layout-Vorlage auf der ganzen Website eingestellt?Wie verschiedene Layouts für unterschiedliche Module in Zend Framework 3
Antwort
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 dieLayout
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;
}
}
> 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.
----------
Das Handbuch recht detailliert ist, erwähnt sie auch viele andere Dinge, wie setzen verschiedene Layouts für verschiedene Controller (oder Aktionen).
- 1. Wie verwendet man verschiedene Bootstrap für verschiedene Module in Zend Framework
- 2. Verwenden Sie differents Layouts zu differents Module zend Framework 2
- 3. Zend Framework application.xml Module laden
- 4. Zend Framework paginator verschiedene
- 5. Wie Module bekommen im Zend Framework arbeitet
- 6. Zend Framework 3 Xampp Datenbankverbindung
- 7. Zend Framework 3 Singletons
- 8. zend framework 3 tutorial
- 9. Zend Framework 3 Installation
- 10. Bootstrap-Module mit Zend Framework 1.8
- 11. Definieren von mehreren Layouts in Zend Framework 2
- 12. Wie Cookie mit Zend Framework 3 hinzufügen?
- 13. Zend/Db funktioniert nicht in Zend Framework 3?
- 14. Zend Framework 3 Sheet in partials
- 15. erstellen dynamische navigation in zend framework 3
- 16. Verschiedene untergeordnete Layouts für verschiedene Gruppen ExpandableListView
- 17. Wie man verschiedene Tabhosts für verschiedene Layouts in Android
- 18. Zend Framework Modules Probleme
- 19. Wie in Zend Framework
- 20. Capybara-Treiber für verschiedene Layouts
- 21. Kann ich mehrere Layouts im Zend Framework haben?
- 22. Unterschiedliche Altersberechnung für verschiedene Zeilen
- 23. DataGrid für Zend Framework
- 24. application.css für verschiedene Layouts wie richtig eingestellt?
- 25. Wie CSRF-Schutz in Zend Framework 3 implementieren?
- 26. PHP 7 Zend Framework 2 Einführung der Zend Framework Version
- 27. Zend Framework 3 AJAX reagierende Daten
- 28. Zend Framework 3 Übersetzer aus DB
- 29. Zend Framework - Multiplattform Navigationsblöcke
- 30. Zend Framework 2 für ein Zend Framework Neuling
Antwort ist die gleiche wie in ZF2 ... https://github.com/EvanDotPro/EdpModuleLayouts überprüfen Module.php – tasmaniski