Zend:action helper的init方法是否将变量传递给布局视图?

时间:2011-05-21 14:21:26

标签: php zend-framework layout controller helpers

问题:我无法通过动作帮助程序的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;
  • 因此,控制器动作回显的“繁荣”变量显示正确。

  • 未显示“翻转”变量(传递给我的布局)。

    问题:为什么传递给控制器​​操作的变量是正确输出的,而另一个传递给布局视图的变量不是?

由于

卢卡

2 个答案:

答案 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();