Zend Framework 2-Layout et variable
j'ai un layout utilisé par toutes mes vues et j'ai besoin d'assigner une variable d'un controller à ce layout , si j'utilise cette méthode sur un controller il ne fonctionne pas :
public function indexAction()
{
return new ViewModel( array(
'testvar' => 'bla',
));
}
quelqu'un peut m'aider ?
merci
6 réponses
Rob Allen a posté un excellent article sur la façon d'accéder aux variables de vue dans un autre modèle de vue (par exemple: layout)
en gros le code suivant, placé dans votre mise en page.phtml, correspond à vos besoins:
<?php
$children = $this->viewModel()->getCurrent()->getChildren();
$child = $children[0];
?>
<!-- some HTML -->
<?php echo $this->escape($child->myvar);?>
il y a trois façons d'y parvenir dans ZF2 (dans votre controller):
le Premier:
$this->layout()->someVariableName = 'Some value for the variable';
Deuxième:
$this->layout()->setVariable('someVariableName', 'Some value for the variable');
Troisième:
$this->layout()->setVariables(array(
'someVariableName' => 'Some value for the variable',
'anotherVariable' => 'Some value for another variable',
);
Avez-vous essayé:
$this->layout()->testvar = 'bla';
layout
plugin controller vous pouvez récupérer L'objet ViewModel utilisé dans layout.phtml
.
parce que ZF2 ViewModel est une structure d'arbre, le layout est en fait le noeud racine de ViewModel, le ViewModel dans votre controller sera ajouté comme un noeud enfant de layout.
Vous pouvez accéder à layout ViewModel en accédant à MvcEvent, essayez ceci dans votre controller:
public function indexAction()
{
$events = $this->getServiceLocator()->get('Application')->getEventManager();
$events->attach(MvcEvent::EVENT_RENDER, array($this, 'setVariableToLayout'), 100);
}
public function setVariableToLayout($event)
{
$viewModel = $this->getEvent()->getViewModel();
$viewModel->setVariables(array(
'testvar' => 'bla',
));
}
voir la section ajouter une Variable de vue ci-dessous
l'ajouter dans votre module.fichier php.
Vous pouvez également faire cela en utilisant l'aide de vue.
/**
* Remember to keep the init() method as lightweight as possible
*
* @param \Zend\ModuleManager\ModuleManager $moduleManager
*/
public function init(ModuleManager $moduleManager)
{
$events = $moduleManager->getEventManager();
$events->attach('loadModules.post', array($this, 'modulesLoaded'));
$events->attach('onBootstrap', array($this, 'bootstrap'));
$sharedEvents = $events->getSharedManager();
$sharedEvents->attach(__NAMESPACE__, 'bootstrap', array($this, 'bootstrap'), 100);
$sharedEvents->attach(__NAMESPACE__, 'bootstrap', array($this, 'initializeView'), 100);
$sharedEvents->attach(__NAMESPACE__, 'dispatch', array($this, 'addViewVariables'), 201);
}
/**
*
* @param \Zend\Mvc\MvcEvent $e
*/
public function loadConfiguration(MvcEvent $e)
{
$e->getApplication()->getServiceManager()
->get('ControllerPluginManager')->get('AclPlugin')
->checkAcl($e); //Auth/src/Auth/Controller/AclPlugin
}
/**
*
* @param \Zend\EventManager\EventInterface $e
*/
public function bootstrap(Event $e) {
$eventManager = $e->getParam('application')->getEventManager();
//$app->getEventManager()->attach('dispatch', array($this, 'checkAcl'), 100);
}
/**
* pass variables to layout
*
* @param \Zend\EventManager\EventInterface $e
*/
public function addViewVariables(Event $e)
{
$route = $e->getRouteMatch();
$viewModel = $e->getViewModel();
$variables = $viewModel->getVariables();
if (false === isset($variables['controller'])) {
$viewModel->setVariable('controller', $route->getParam('controller'));
}
if (false === isset($variables['action'])) {
$viewModel->setVariable('action', $route->getParam('action'));
}
$viewModel->setVariable('module', strtolower(__NAMESPACE__));
}
/**
*
* @param \Zend\Mvc\MvcEvent $e
*/
public function initializeView(Event $e)
{
}
et dans votre mise en page vous pouvez simplement accéder à ces variables en utilisant leur nom comme $module, $action, $controller selon l'exemple ci-dessus
si vous voulez passer des valeurs à votre layout globalement, alors vous pouvez renvoyer ceci:https://stackoverflow.com/a/21455737/2190889