web-dev-qa-db-fra.com

Zend Framework 2 - Disposition et variable

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 

24
Juck

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);?>
39
Sam

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',
);
65
Josias Iquabius

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

8
DrBeza

É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',
    ));
}
3
AlloVince

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

1
Developer

Si vous souhaitez transmettre des valeurs globalement à votre mise en page, vous pouvez vous référer à ceci: https://stackoverflow.com/a/21455737/2190889

0
KumarA