24

我的所有视图都使用了一个布局,我需要将一个变量从控制器分配给这个布局,如果我在控制器上使用这个方法它不起作用:

public function indexAction()
{
    return new ViewModel( array(
        'testvar' => 'bla',
    ));
}

任何人都可以帮助我吗?

谢谢

4

6 回答 6

67

在 ZF2 中(在您的控制器中)有三种方法可以实现此目的:

第一的:

$this->layout()->someVariableName = 'Some value for the variable';

第二:

$this->layout()->setVariable('someVariableName', 'Some value for the variable');

第三:

$this->layout()->setVariables(array(
    'someVariableName' => 'Some value for the variable',
    'anotherVariable'  => 'Some value for another variable',
);
于 2013-01-24T10:26:34.057 回答
39

Rob Allen 发表了一篇关于如何在另一个视图模型中访问视图变量的精彩文章(例如:布局)

基本上,放置在 layout.phtml 中的以下代码将满足您的需求:

<?php
$children = $this->viewModel()->getCurrent()->getChildren();
$child = $children[0];
?>
<!-- some HTML -->
<?php echo $this->escape($child->myvar);?>
于 2012-11-13T12:24:29.230 回答
8

你有没有尝试过:

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

使用layout控制器插件,您可以检索在layout.phtml.

于 2012-11-13T13:50:11.607 回答
3

因为ZF2 ViewModel是树形结构,所以layout其实是ViewModel的根节点,你控制器中的ViewModel会被添加为layout的子节点。

你可以通过访问 MvcEvent 来访问布局 ViewModel,在你的控制器中试试这个:

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',
    ));
}
于 2012-11-14T06:14:33.340 回答
1

请参阅下面的添加视图变量部分

将它添加到你的 module.php 文件中。

您也可以使用视图助手来执行此操作。

/**
     * 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) 
{

}

并且在您的布局中,您可以根据上面的示例使用它们的名称简单地访问这些变量,例如 $module、$action、$controller

于 2012-11-13T12:31:11.943 回答
0

如果您想在全局范围内将值传递给您的布局,那么您可以参考:https ://stackoverflow.com/a/21455737/2190889

于 2014-01-30T11:52:55.657 回答