1

这是一个简单的视图助手(注意 pass-by-reference 参数):

class Zend_View_Helper_MyViewHelper extends Zend_View_Helper_Abstract
{
  public function MyViewHelper(&$array)
  {
    unset($array['someExistingKey']);
  }
}

这在视图中不起作用。$array['someExistingKey']仍然设置(除了在方法的直接上下文中)。Zend 必须做一些事情来防止数组通过引用传入。关于解决方案的任何想法?

4

2 回答 2

2

当您$this->MyViewHelper($array)从您的模板调用时,您实际上并没有直接调用帮助程序类,Zend_View 正在实例化该类并为您调用它。因此,我认为您可能无法正常工作。您最好的选择可能是使用 Zend_Registry,或者重构以采用不需要全局的不同方法。

于 2011-12-06T22:20:02.787 回答
1

我只是想到了一个解决方法。您只需要手动调用帮助程序,而不是让 ZF 通过call_user_func_array.

参考.php

class Zend_View_Helper_Ref extends Zend_View_Helper_Abstract
{
    public function removeFromRef(&$ref)
    {
        // change your var value here
        unset($ref['key']);
    }

    /**
     * ZF calls this for us, but we'll call what we want, so you can skip this.
     */
//    public function ref()
//    {}
}

如您所见,您可以跳过必须将 main 方法命名为文件名的约定,但我仍然推荐它。现在,您可以在视图/控制器中传递引用:

// in view:
$this->getHelper('Ref')->removeFromRef($someVar2Change);
// in controller
$this->view->getHelper('Ref')->removeFromRef($someVar2Change);

基本上,这就是$this->ref():获取助手,然后调用call_user_func_array.

有些人可能在使用$this->getHelper('Ref')->ref()而不是$this->ref()虽然有问题,但它确实有效。

于 2011-12-07T08:14:24.340 回答