Php Zend框架从Zend_视图_辅助程序调用视图辅助程序

Php Zend框架从Zend_视图_辅助程序调用视图辅助程序,php,zend-framework,zend-view,Php,Zend Framework,Zend View,我有一个名为Zend\u View\u helper\u FormVars的助手,我的一个模块使用它。 在application/common/helpers/GeneralFunctions.php 我试图从GeneralFunctions.php中的Zend\u View\u Helper\u FormVars调用一个函数 以下是Zend\u View\u Helper\u FormVars的简短版本: class Zend_View_Helper_FormVars { public

我有一个名为
Zend\u View\u helper\u FormVars
的助手,我的一个模块使用它。 在
application/common/helpers/GeneralFunctions.php

我试图从
GeneralFunctions.php
中的
Zend\u View\u Helper\u FormVars
调用一个函数

以下是Zend\u View\u Helper\u 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
helper,如下所示,我的所有模块都可以使用它:

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

以下是我尝试过的内容,但出现了一个错误:

// application/Bootstrap.php ----------->
function _initViewHelpers() {
    // add a helper for use for all modules
    $view->addHelperPath(APPLICATION_PATH .'/Common/Helper', 'Common_Helper');
}
//-------------------->


// application/common/helpers/General.php ----------->
class Zend_View_Helper_General extends Zend_View_Helper_Abstract
{
    public function general(){
        return $this;
    }   
    public function test(){
        return 'test 123';
    }
}
//-------------------->

// application/modules/dashboard/views/helpers/DashboardHelper.php ----------->
class Zend_View_Helper_DashboardHelper extends Common_Helper_General
{

    public function dashboardHelper(){
        return $this;
    }

    public function dashboardTest(){
        return 'from dashboard';
    }

}
//-------------------->

// application/modules/dashboard/views/scripts/index/index.phtml ----------->
echo $this->dashboardHelper()->test();
//-------------------->
我收到的错误消息:

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


您可能尚未将自动加载程序配置为从
应用程序/common/helpers/
文件夹加载类


有关默认路径,请参见
Zend\u应用程序\u模块\u自动加载程序
。您应该将新文件夹添加到此文件夹。

您正在调用您的类,而没有实例化它

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

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

Zend_View_Helper_GeneralFunctions::progressMeter();
class Zend_View_Helper_GeneralFunctions
{
    public function __construct()
    {
        $this->baseUrl = Zend_Controller_Front::getInstance()->getBaseUrl();
    }

    public function progressMeter() {
        $html='';
        $html.='<span id="progressWrapper">';
        $html.='<span id="progressMeter"></span>';
        $html.='</span>';
        $html.='';
        return $html;
    }
}

另一个选择是首先实例化类。

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

  • 由于省略了
    static
    关键字,您试图将
    Zend\u View\u Helper\u GeneralFunctions::GeneralFunctions()
    声明为类方法时,将其作为静态方法调用(即必须实例化类的实例才能使用)
  • 如果您确实希望将
    generalFunctions()
    用作静态方法并更正此问题,则需要将
    baseUrl
    设置为静态属性,或者必须实例化该类的实例,然后返回该实例
  • 使用
    GeneralFunctions
    类作为直接调用的静态方法的容器的想法实际上是更深层次问题的征兆,并且被正确地标记为代码气味。如果您认为我在撒谎,请看一看Zend Framework 2.0的高优先级项(提示:它涉及从框架中删除所有静态方法)。或者你可以问他们对静态方法的看法:-) 查看常规函数类
    Zend\u View\u Helper\u general functions
    的给定类名,并考虑到当前的场景,您试图在另一个助手中使用
    general functions
    Helper,我猜想您确实需要做以下两件事之一

  • 您需要使每个助手类都具有
    GeneralFunctions
    类的子类,以便所有助手都具有这些可用的函数。基本上,问问你自己,你的助手们是否都是以
    GeneralFunction
    助手的身份开始生活的,他们的功能扩展了很多。此解决方案使用继承来解决您的问题
  • 每个视图辅助对象都应该包含所操作的视图对象的实例。因此,从理论上讲,您应该能够通过magic
    \uuu调用
    方法访问任何其他视图辅助对象(我认为还有一个显式方法,但我总是使用magic方法)。在您的场景中可能是这样的:

    public function mkCategoryCodeSelectGroup($codeTypeArr=array(), $codesArr=array()) 
    {
        $html='';
        $html.= $this->generalFunctions()->progressMeter();
        return $html;
    }
    
    在这种情况下,
    \u调用
    方法将加载
    通用函数
    帮助程序,然后从
    通用函数
    帮助程序调用
    进度表()
    方法

    现在,您的
    GeneralFunctions
    helper类可能如下所示:

    Zend_View_Helper_GeneralFunctions::progressMeter();
    
    class Zend_View_Helper_GeneralFunctions
    {
        public function __construct()
        {
            $this->baseUrl = Zend_Controller_Front::getInstance()->getBaseUrl();
        }
    
        public function progressMeter() {
            $html='';
            $html.='<span id="progressWrapper">';
            $html.='<span id="progressMeter"></span>';
            $html.='</span>';
            $html.='';
            return $html;
        }
    }
    
    class Zend\u View\u Helper\u通用函数
    {
    公共函数构造()
    {
    $this->baseUrl=Zend_Controller_Front::getInstance()->getBaseUrl();
    }
    公共功能进度表(){
    $html='';
    $html.='';
    $html.='';
    $html.='';
    $html.='';
    返回$html;
    }
    }
    

  • 实际上,调用另一个视图助手非常简单

    确保视图帮助程序扩展了
    Zend\u view\u helper\u 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;
        }
    }
    

    我建议使用您自己的前缀(而不是Zend!)命名视图帮助程序,并为此添加帮助程序路径。我忘了提到,我在引导程序中自动加载了GeneralFunctions帮助程序,就像这样,它已经可用于我的所有模块:$View->addHelperPath(APPLICATION_path./common/Helpers”,“View_helper”);嗨,Jai,我让它像你说的那样工作,首先像这样实例化:$genFun=new-Zend\u-View\u-Helper\u-GeneralFunctions()$html.=$genFun->progressMeter();但是我对你说的话感兴趣Noah。所以,你的意思是,我可以像这样扩展我所有的视图帮助程序:类Zend_view_Helper_FormVars扩展了Zend_view_Helper_general函数,当我需要视图脚本中任何一个类的函数时,我会调用$this->FormVars()->someFunction();someFunction()可以在FormVars类或GeneralFunctions类中?感谢you@EricP-您可以按照您的建议,使用所有视图帮助器类扩展GeneralFunctions视图帮助器类。或者,您可以简单地将GeneralFunctions视图帮助器单独用作视图帮助器,正如我在示例代码中指出的那样。使用此方法,您的其他视图帮助程序仍然会继承默认的抽象类,然后您可以通过magic _call()方法从GeneralFunctions视图帮助程序调用方法。谢谢David。这也起了作用。使用Zend框架似乎有很多方法。我喜欢它,但有时它会让人困惑。这里的诀窍是将Zend_View_Helper子类化