问题:我无法将变量从操作助手的 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!!";
}
}
在我的控制器"索引控制器"中:
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;
因此,控制器动作回显的"繁荣"变量正确显示。
"flop"变量(传递给我的布局)未显示。
问:为什么传递给控制器操作的变量正确输出,而传递给布局视图的另一个变量却没有?
谢谢
卢卡
当助手的 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();
之所以这样称呼操作帮助程序,是因为它们是避免操作中代码重复的一种方法。在操作帮助程序中执行的所有操作都可用于操作,但不适用于视图。这是操作的正常行为,只要你不向视图传递某些内容,视图就不知道它。如果要避免视图中的代码重复,请创建视图帮助程序。
有时,创建操作帮助程序和相应的视图帮助程序是有意义的。
--
preDispatch works() 而 init() 则不工作,因为使用 init 你实际上并没有挂接到调度过程。