Zend Framework从Zend_View_Helper调用视图助手

时间:2009-11-25 22:23:28

标签: php zend-framework zend-view

我有一个名为Zend_View_Helper_FormVars的助手,我的一个模块使用过它。 我在application/common/helpers/GeneralFunctions.php

中也有一个共同帮助者

我正在尝试拨打来自Zend_View_Helper_FormVars的{​​{1}}的功能。

以下是GeneralFunctions.php的简短版本:

Zend_View_Helper_FormVars

以下是class Zend_View_Helper_FormVars { public $reqFieldVisual='<span class="req">*</span>'; public $roles=array('admin'=>'admin', 'user'=>'user'); public $paymentMethods=array('1'=>'Check', '2'=>'Credit Card', '3'=>'Cash', '4'=>'Other'); public function formVars(){ $this->baseUrl=Zend_Controller_Front::getInstance()->getBaseUrl(); return $this; } public function mkCategoryCodeSelectGroup($codeTypeArr=array(), $codesArr=array()) { $html=''; $html.=Zend_View_Helper_GeneralFunctions::generalFunctions()->progressMeter(); return $html; } } 中的代码:

GeneralFunctions.php

另外,忘了提一下我在Bootstrap中自动加载了class Zend_View_Helper_GeneralFunctions { public function generalFunctions(){ $this->baseUrl=Zend_Controller_Front::getInstance()->getBaseUrl(); return $this; } public function progressMeter() { $html=''; $html.='<span id="progressWrapper">'; $html.='<span id="progressMeter"></span>'; $html.='</span>'; $html.=''; return $html; } } 帮助器,它已经可用于我的所有模块了:

GeneralFunctions

这是我尝试过的,但是收到了错误:

$view->addHelperPath(APPLICATION_PATH .'/common/helpers', 'View_Helper');

我收到错误消息:

  

致命错误:第2行的/Applications/MAMP/htdocs/mysite/application/modules/dashboard/views/helpers/DashboardHelper.php中找不到“Common_Helper_General”类

4 个答案:

答案 0 :(得分:14)

调用另一个View Helper实际上非常简单。

确保您的视图助手扩展Zend_View_Helper_Abstract,以便它可以访问$view。然后你可以像在视图中那样简单地调用助手,即

$this->view->generalFunctions()->progressMeter();

根据您的上述示例:

<?php

class Zend_View_Helper_FormVars extends Zend_View_Helper_Abstract {

    /* ... */

    public function mkCategoryCodeSelectGroup($codeTypeArr=array(),
        $codesArr=array()) {
        $html='';
        $html. $this->view->generalFunctions()->progressMeter();
        return $html;
    }
}

答案 1 :(得分:0)

您可能尚未将自动加载器配置为从application/common/helpers/文件夹加载类。

有关默认路径,请参阅Zend_Application_Module_Autoloader。您应该将新文件夹添加到此。

答案 2 :(得分:0)

你在没有实例化的情况下调用你的类。

您的generalFunctions()函数使用$this指针,该指针不起作用;它也不是一种静态方法。

一个选项是将进度表设置为静态函数并直接调用它:

Zend_View_Helper_GeneralFunctions::progressMeter();

另一个选择是首先实例化你的课程。

答案 3 :(得分:0)

我发现您提供的代码存在一些问题。

  1. 当你将Zend_View_Helper_GeneralFunctions::generalFunctions()省略{{1}时,你试图将static作为一个静态方法调用它被声明为类方法(即你必须实例化一个类的实例才能使用它)关键字。
  2. 如果你实际上想要使用generalFunctions()作为静态方法并更正这个,那么你需要将baseUrl设为静态属性,否则你必须实例化该类的实例然后返回那个实例。
  3. GeneralFunctions类用作直接调用的静态方法的容器的想法实际上是更深层次问题的症状,并且正确标记为代码气味。如果您认为我在说谎,请查看Zend Framework 2.0的高优先级项目(提示:它涉及从框架中删除所有静态方法)。或者你可以随时询问他们对静态方法的看法:-)。
  4. 查看一般函数类Zend_View_Helper_GeneralFunctions的给定类名,并给出当前场景,您尝试在另一个帮助器中使用GeneralFunctions帮助器,我猜想您确实需要这样做两件事之一。

    1. 您需要让每个辅助类都为GeneralFunctions类子类,以便所有助手都可以使用这些函数。基本上,问问自己,你的帮助者是否都以GeneralFunction帮助者开始生活,其中包括扩展功能。此解决方案使用继承来解决您的问题。
    2. 每个视图助手都应包含要对其执行的View对象的实例。因此理论上你应该能够通过魔法__call方法访问任何其他视图帮助器(我认为还有一个显式方法,但我总是使用魔术方法)。在你的场景中可能看起来像这样:

      public function mkCategoryCodeSelectGroup($codeTypeArr=array(), $codesArr=array()) 
      {
          $html='';
          $html.= $this->generalFunctions()->progressMeter();
          return $html;
      }
      

      在这种情况下,__call方法会加载GeneralFunctions帮助程序,然后从progressMeter()帮助程序调用{​​{1}}方法。

      现在你的GeneralFunctions助手类可能如下所示:

      GeneralFunctions