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

24
demandé sur Juck 2012-11-13 15:34:35

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);?>
39
répondu Sam 2012-11-13 12:24:29

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',
);
65
répondu Josias Iquabius 2013-04-15 02:06:30

Avez-vous essayé:

$this->layout()->testvar = 'bla';

layout plugin controller vous pouvez récupérer L'objet ViewModel utilisé dans layout.phtml.

8
répondu DrBeza 2012-11-13 13:56:02

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',
    ));
}
3
répondu AlloVince 2012-11-14 06:14:33

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

1
répondu Developer 2012-11-13 12:31:11

si vous voulez passer des valeurs à votre layout globalement, alors vous pouvez renvoyer ceci:https://stackoverflow.com/a/21455737/2190889

0
répondu KumarA 2017-05-23 12:03:09