问题:我无法通过动作帮助程序的init方法将我的变量传递给我的自定义布局。
我有这个动作助手“My_Action_Helper_Initializer”:
class My_Action_Helper_Initializer extends Zend_Controller_Action_Helper_Abstract
{
public function init()
{
$controller=$this->getActionController();
//variable passed to controller's view
$controller->view->flop="FLOOP!!";
//variable passed to controller
$controller->boom="BOOM!!";
}
}
在我的控制器“IndexController”中:
class IndexController extends Zend_Controller_Action
{
public function indexAction()
{
//print the variable passed from action helper
echo $this->boom;
}
}
然后在我的“layout.phtml”中:
//print variable passed from action helper
echo $this->flop;
因此,控制器动作回显的“繁荣”变量显示正确。
未显示“翻转”变量(传递给我的布局)。
问题:为什么传递给控制器操作的变量是正确输出的,而另一个传递给布局视图的变量不是?
由于
卢卡
答案 0 :(得分:2)
调用动作助手是因为它们是避免动作中代码重复的一种方法。您在动作助手中执行的所有操作均可用于操作,但不适用于视图。这是动作的正常行为,只要你没有将某些东西传递给视图,视图就不会知道它。如果要避免视图中的代码重复,请创建视图助手。
有时创建动作助手和相应的视图助手是有意义的。
-
preDispatch works()而init()没有,因为使用init你实际上并没有挂钩到调度过程。
答案 1 :(得分:2)
当你的助手的init()被调用时,ViewRenderer的init()还没有。这是因为帮助器堆栈的顺序。
如果您启用严格标准错误报告,您应该在帮助程序中看到类似的内容“在...中从空值创建默认对象”
您应该考虑将代码移动到preDispatch()挂钩,因为init()方法应该用于帮助初始化。
获取控制器的视图实例:
function getView()
{
$controller = $this->getActionController();
if($view = $controller->view) {
return $view;
}
if($this->getFrontController()->getParam('noViewRenderer') {
return $controller->initView();//this view instance will not be used in Zend_Layout!
}
$vr = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
return $vr->initView();
}
如果要将参数传递给布局,请使用
$view = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->initView();