Zend Framework:如何从Zend_View_Helper中调用视图助手

8

我有一个助手叫做Zend_View_Helper_FormVars,它被我的一个模块使用。 我还有一个常用的助手在application/common/helpers/GeneralFunctions.php中。

我试图从GeneralFunctions.php中调用Zend_View_Helper_FormVars中的一个函数。

这是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 中的代码:

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

这是我尝试过的方法,但是出现了错误:
// 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行中未找到“Common_Helper_General”类,路径为/Applications/MAMP/htdocs/mysite/application/modules/dashboard/views/helpers/DashboardHelper.php。

我建议在视图助手中使用您自己的前缀(不是Zend!)进行命名空间管理,并为此添加助手路径。 - David Snabel-Caunt
4个回答

14

调用另一个视图助手其实非常简单。

确保您的视图助手继承了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;
    }
}

谢谢David。那个也起作用了。使用Zend框架似乎有很多方法可以做事情。我喜欢它,但有时可能会感到困惑。 - EricP
这里的技巧是对Zend_View_Helper_Abstract进行子类化,这在手册中很难发现。一旦你有了视图引用,你就会意识到可以像平常一样调用函数。在ZF中,通常有多种检索对象引用的方法。在这种情况下,你可以从ViewRendered或注册表中技术上检索视图。我的例子最简洁。 - David Snabel-Caunt

0

你正在调用未实例化的类。

你的generalFunctions()函数使用了$this指针,这是行不通的;而且它也不是一个静态方法。

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

Zend_View_Helper_GeneralFunctions::progressMeter();

另一种选择是先实例化你的类。


我忘了提到,我已经在Bootstrap中自动加载了GeneralFunctions助手,并且它已经对所有我的模块可用:$view->addHelperPath(APPLICATION_PATH .'/common/helpers', 'View_Helper');嗨Jai,我按照你说的方式实现了它:$genFun=new Zend_View_Helper_GeneralFunctions(); $html.=$genFun->progressMeter(); - EricP

0

我看到你提供的代码存在几个问题。

  1. 你试图调用 Zend_View_Helper_GeneralFunctions::generalFunctions() 作为静态方法,但它被声明为类方法(即你必须实例化一个类的实例才能使用它),因为你省略了 static 关键字。
  2. 如果你确实想将 generalFunctions() 作为静态方法使用并进行更正,那么你需要将 baseUrl 设为静态属性或者你必须实例化一个类的实例,然后返回该实例。
  3. 将你的 GeneralFunctions 类用作直接调用的静态方法的容器的想法实际上是更深层次问题的症状,并且被正确地标记为代码异味。如果你认为我在撒谎,请查看 Zend Framework 2.0 的高优先级项目(提示:它涉及从框架中删除所有静态方法)。或者你可以随时问 SO 他们对静态方法的看法 :-).

看到您提供的通用函数类名称 Zend_View_Helper_GeneralFunctions,以及当前情况下您正在尝试在另一个辅助程序中使用 GeneralFunctions 辅助程序,我认为您确实需要做以下两件事之一。

  1. 你需要让每个帮助类继承自GeneralFunctions类,这样所有的帮助类都可以使用这些函数。简单说,就是问自己所有的帮助类是否都以GeneralFunction帮助类为起点,在此基础上扩展功能。这种解决方案使用了继承来解决问题。
  2. 每个视图帮助类都应该包含一个被操作视图的实例。因此理论上您应该能够通过魔术方法__call访问任何其他视图帮助类(我认为也有一个显式方法,但我总是使用魔术方法)。在您的情况下可能看起来像这样:

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

    在这种情况下,__call方法将加载GeneralFunctions帮助程序,然后将调用GeneralFunctions帮助程序中的progressMeter()方法。

    现在您的GeneralFunctions帮助类可能看起来像这样:

    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_View_Helper_FormVars extends Zend_View_Helper_GeneralFunctions 当我需要在视图脚本中调用任一类的函数时,例如,我会调用 $this->formVars()->someFunction(); 而 someFunction() 可以在 FormVars 类或 GeneralFunctions 类中吗?谢谢 - EricP
@EricP - 你可以像你建议的那样,将GeneralFunctions视图助手类与所有视图助手类扩展。或者,你可以像我在示例代码中指示的那样,仅将GeneralFunctions视图助手作为单独的视图助手使用。使用这种方法,你的其他视图助手仍然继承默认的抽象类,然后通过魔术__call()方法调用GeneralFunctions视图助手的方法。 - Noah Goodrich

0

你可能还没有配置自动加载器来从application/common/helpers/文件夹中加载类。

请参考默认路径Zend_Application_Module_Autoloader。你应该将你的新文件夹添加到其中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接