【问题标题】:Zend:does action helper's init method passes variables to layout view?Zend:动作助手的init方法是否将变量传递给布局视图?
【发布时间】:2011-08-30 06:04:30
【问题描述】:

问题:我无法通过操作助手的 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;
  • 所以控制器动作回显的“boom”变量显示正确。

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

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

谢谢

卢卡

【问题讨论】:

  • 回声 $this->boom;在布局脚本中?
  • 我的错误是 $this->flop 谢谢

标签: php zend-framework layout controller helpers


【解决方案1】:

当你的助手的 init() 被调用时,ViewRenderer 的 init() 还没有被调用。这是因为帮助程序堆栈中的顺序。

如果您启用严格标准的错误报告,您应该会在您的帮助程序“从...中的空值创建默认对象”中看到类似的内容

您应该考虑将代码移动到 preDispatch() 挂钩,因为 init() 方法应该用于 helper 初始化。

获取控制器的视图实例:

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

【讨论】:

  • “当你的助手的 init() 被调用时,ViewRenderer 的 init() 还没有......你应该考虑将你的代码移动到 preDispatch()”。你的意思是如果我使用 predispatch()我的动作助手代替.. ViewRenderer 的 init 已经被调用了??
  • @luca 是的,但前提是 noViewRender = true 未设置为前端控制器参数。 ps:检查更新的代码。删除的部分不属于那里。
  • @Xerkus predispatch 不会比 init 先运行吗?不明白对不起!我认为问题在于,当动作助手设置视图变量时,视图本身已经设置好了..所以通过预调度我的动作助手的代码,一切正常..
  • 我还尝试在引导程序中的 _initView 之前定位 _initActionHelpers,并且我的操作助手的 init() 方法再次起作用!..
  • 动作助手 init() 在 Zend_Controller_Action_HelperBroker 的构造函数中调用。查看 Zend_Controller_Action 中的字符串 132。这就是起点。
【解决方案2】:

调用动作助手是因为它们是一种避免动作中代码重复的方法。您在动作助手中所做的一切都对动作可用,但对视图不可用。这是动作的正常行为,只要你不将某些东西传递给视图,视图就不知道它。如果您想避免视图中的代码重复,请创建视图助手。

有时创建一个动作助手和一个相应的视图助手是有意义的。

--

preDispatch 有效() 而 init() 无效,因为使用 init 你实际上并没有挂钩到调度过程。

【讨论】:

  • 我编辑了我的问题 floop 被传递给了布局。视图助手不见了,但我注意到将我的 'init()' 方法更改为 'predispatch' 一切正常..?为什么?
  • +1 用于操作助手和相应的视图助手。这种方法比几周后找出那些该死的视图参数的来源要好得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-30
  • 2016-01-07
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
  • 2011-04-01
相关资源
最近更新 更多