在Zend Framework中将变量发送到布局

38 layout zend-framework zend-view

在我的项目中,我有许多动态元素,每个页面都是一致的.我已将这些放在layout.phtml中

我的问题是:如何从控制器向我的布局发送变量?

如果我想从我的控制器发送东西,我可以使用:

$this->view->whatever = "foo";
Run Code Online (Sandbox Code Playgroud)

并在视图中接收它

echo $this->whatever;
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何对我的布局做同样的事情.也许有更好的方法解决这个问题?

Tim*_*ain 46

布局一个视图,因此分配变量的方法是相同的.在您的示例中,如果您要回显$ this->布局中的任何内容,您应该看到相同的输出.

一个常见问题是如何将在每个页面上使用的变量分配给布局,因为您不希望在每个控制器操作中复制代码.一个解决方案是创建一个插件,在渲染布局之前分配这些数据.例如:

<?php

class My_Layout_Plugin extends Zend_Controller_Plugin_Abstract
{
   public function preDispatch(Zend_Controller_Request_Abstract $request)
   {
      $layout = Zend_Layout::getMvcInstance();
      $view = $layout->getView();

      $view->whatever = 'foo';
   }
}
Run Code Online (Sandbox Code Playgroud)

然后使用前端控制器注册此插件,例如

Zend_Controller_Front::getInstance()->registerPlugin(new My_Layout_Plugin());

  • 我在哪里放这个插件(哪个文件夹?)以及我在哪里设置`Zend_Controller_Front :: getInstance() - > registerPlugin(new My_Layout_Plugin());`? (4认同)

10u*_*0us 43

不使用帮助器或插件做:

Zend_Layout::getMvcInstance()->assign('whatever', 'foo');
Run Code Online (Sandbox Code Playgroud)

在此之后,您可以在布局中使用以下内容:

<?php echo $this->layout()->whatever; ?>
Run Code Online (Sandbox Code Playgroud)

这将打印"foo".

  • 对于简单的作业,这是一个非常优雅的解决方案!爱它.1+ (4认同)

小智 7

我有一个基本控制器,所有其他控制器都扩展.

所以我有一个控制器......

<?php
class BaseController extends Zend_Controller_Action
{
  public function init()
  {
    $this->view->foo = "bar";
  }
}
Run Code Online (Sandbox Code Playgroud)

并在布局和/或视图中

<?= $this->foo ?>
Run Code Online (Sandbox Code Playgroud)