j'ai une mise en page utilisée par toutes mes vues et j'ai besoin d'affecter une variable d'un contrôleur à cette mise en page. Si j'utilise cette méthode sur un contrôleur, cela ne fonctionne pas:
public function indexAction()
{
return new ViewModel( array(
'testvar' => 'bla',
));
}
est-ce que quelqu'un peut m'aider ?
merci
Rob Allen a publié un excellent article sur la façon d’accéder aux variables de vue dans un autre modèle de vue (par exemple, la mise en page)
Fondamentalement, le code suivant, placé dans votre layout.phtml, correspond à vos besoins:
<?php
$children = $this->viewModel()->getCurrent()->getChildren();
$child = $children[0];
?>
<!-- some HTML -->
<?php echo $this->escape($child->myvar);?>
Il existe trois façons d’y parvenir dans ZF2 (dans votre contrôleur):
Premier:
$this->layout()->someVariableName = 'Some value for the variable';
Seconde:
$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',
);
As-tu essayé:
$this->layout()->testvar = 'bla';
À l'aide du plug-in du contrôleur layout
, vous pouvez récupérer l'objet ViewModel utilisé dans layout.phtml
.
Étant donné que ZF2 ViewModel est une structure arborescente, la présentation est en réalité le nœud racine de ViewModel. Le ViewModel de votre contrôleur sera ajouté en tant que nœud enfant de la présentation.
Vous pouvez accéder à la disposition ViewModel en accédant à MvcEvent, essayez ceci dans votre contrôleur:
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 add View View ci-dessous
ajoutez-le dans votre fichier module.php.
Vous pouvez également le faire en utilisant view helper.
/**
* 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 présentation, vous pouvez simplement accéder à ces variables en utilisant leur nom tel que $ module, $ action, $ controller selon l'exemple ci-dessus
Si vous souhaitez transmettre des valeurs globalement à votre mise en page, vous pouvez vous référer à ceci: https://stackoverflow.com/a/21455737/2190889