将variables发送到Zend Framework中的布局

在我的项目中,我有许多dynamic元素,每个页面都一致。 我已经把这些放在我的layout.phtml中

我的问题是:如何从我的控制器发送variables到我的布局?

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

$this->view->whatever = "foo"; 

并在视图中接收它

 echo $this->whatever; 

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

布局一个视图,因此分配variables的方法是相同的。 在你的例子中,如果你要在你的布局中回显$ this->,你应该看到相同的输出。

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

 <?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'; } } 

然后注册这个插件与前端控制器,例如

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

不使用助手或插件做:

 Zend_Layout::getMvcInstance()->assign('whatever', 'foo'); 

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

 <?php echo $this->layout()->whatever; ?> 

这将打印“foo”。

我有一个所有其他控制器扩展的基础控制器。

所以我有一个控制器…

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

并在布局和/或视图中

 <?= $this->foo ?> 

如果您在MVC中使用布局,则可以使用标准视图variables。 在引导文件中,包含这个:

 Zend_Layout::startMvc(); 

然后你必须告诉每个控制器(甚至每个动作,如果你想要精确控制几个不同的布局),使用哪个布局。 我把我的每个控制器的init()。 这是一个例子,如果你的布局文件名为layout.phtml:

 $this->_helper->layout->setLayout('layout'); 

那么我想你可以通过创build视图助手有另一种解决scheme..在应用程序/视图/助手中创build一个文件,并命名它什么你想要abc.php然后把下面的代码在那里。

 class Zend_View_helper_abc { static public function abc() { $html = 'YOUR HTML'; return $html; } } 

所以你可以在布局中使用这个助手

 <?= $this->abc() ?> 
 class IndexController extends Zend_Controller_Action { public function init() { $this->_layout = $this->_helper->layout->getLayoutInstance(); $this->_layout->whatever = $this->view->render('test.phtml); } } 

在布局文件中,您可以调用

 <p><?php echo $this->layout()->whatever ?> 

如果在某些行动中,如果你不想要那个部分,那么:

 public function viewAction() { $this->_layout->whatever = null; } 

作为一个方面说明,如果您在应用程序的某个时刻发送json,请注意全局视图variables不会与响应一起发送。

查看帮手也是一个好主意。 我有一个电子商务网站,我有一个layout.phtml,带有需要从数据库中提取的类别和子类别的菜单。

为此,我做了以下工作:

bootstrap.php中:

 protected function _initHelperPath() { $view = $this->bootstrap('view')->getResource('view'); $view->setHelperPath(APPLICATION_PATH . '/views/helpers', 'View_Helper'); } 

的application.ini:

 resources.view[]= 

在视图/帮助程序中,我有一个名为菜单的文件:

 class View_Helper_Menus extends Zend_View_Helper_Abstract { public function categories(){ $categories = new Application_Model_DbTable_Categories(); return $categories->fetchAll(); } public function subCategories(){ $subCategories = new Application_Model_DbTable_SubCategories(); return $subCategories->fetchAll(); } } 

在layout.phtml中,我只需要调用特定的帮助器,然后调用它的方法:

 $menu = $this->getHelper('Menus'); $categories = $menu->categories(); $subCategories = $menu->subCategories(); 

希望它能帮助需要从数据库中提取数据来呈现布局的人。