在我的项目中,我有许多动态元素,每个页面都是一致的。我把这些放在我的layout.phtml
中我的问题是:如何从控制器向我的布局发送变量?
如果我想从我的控制器发送东西,我可以使用:
$this->view->whatever = "foo";
在
视图中接收它echo $this->whatever;
我无法弄清楚如何对我的布局做同样的事情。也许有更好的解决方法吗?
答案 0 :(得分:46)
布局是视图,因此分配变量的方法是相同的。在您的示例中,如果您要回显$ this->在布局中的任何内容,您应该看到相同的输出。
一个常见问题是如何将您在每个页面上使用的变量分配给布局,因为您不希望在每个控制器操作中复制代码。一个解决方案是创建一个插件,在渲染布局之前分配这些数据。 E.g:
<?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());
答案 1 :(得分:43)
不使用帮助器或插件:
Zend_Layout::getMvcInstance()->assign('whatever', 'foo');
在此之后,您可以在布局中使用以下内容:
<?php echo $this->layout()->whatever; ?>
这将打印“foo”。
答案 2 :(得分:7)
我实现了一个基本控制器,所有其他控制器都可以扩展。
所以我有一个控制器......
<?php
class BaseController extends Zend_Controller_Action
{
public function init()
{
$this->view->foo = "bar";
}
}
并在布局和/或视图中
<?= $this->foo ?>
答案 3 :(得分:3)
如果在MVC中使用布局,则可以使用标准视图变量。在bootstrap文件中,包括:
Zend_Layout::startMvc();
然后,您必须告诉每个控制器(甚至每个操作,如果您想要对几个不同的布局进行精细控制)要使用哪个布局。我把我放在每个控制器的init()中。这是一个例子,如果您的布局文件名为layout.phtml:
$this->_helper->layout->setLayout('layout');
答案 4 :(得分:1)
嗯,我想你可以通过创建视图帮助器来创建另一个解决方案..在application / views / helper中创建一个文件并将其命名为abc.php
然后将以下代码放在那里。
class Zend_View_helper_abc {
static public function abc() {
$html = 'YOUR HTML';
return $html;
}
}
所以你可以在布局中使用这个帮助器,比如..
<?= $this->abc() ?>
答案 5 :(得分:1)
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;
}
答案 6 :(得分:0)
作为旁注,如果您在应用中的某个位置发送json,请注意不会随响应一起发送全局视图变量。
答案 7 :(得分:0)
查看助手也是一个好主意。我有一个电子商务网站,我有一个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[]=
在views / helpers中,我有一个名为Menus的文件:
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();
希望它可以帮助需要从数据库中提取数据的人来呈现布局。