Zend framework 如何禁用某些Zend View帮助程序

Zend framework 如何禁用某些Zend View帮助程序,zend-framework,helper,bootstrapping,view-helpers,zend-view,Zend Framework,Helper,Bootstrapping,View Helpers,Zend View,我正在尝试禁用“应用程序/视图/帮助程序”中的一些视图帮助程序 我真正想要的是在application.ini上添加一些选项来启用或禁用一些帮助程序 application.ini上的示例: helpers.Helper1=on helpers.Helper2=off 现在的问题是,当助手关闭时,我想重写这个助手的一些函数,以便在视图上返回不同的结果。这样,我就不需要更改视图脚本中的任何内容 我想在不同的位置为每个助手提供两个不同的php文件。一个使用真实的助手,另一个使用更改的助手(在app

我正在尝试禁用“应用程序/视图/帮助程序”中的一些视图帮助程序

我真正想要的是在application.ini上添加一些选项来启用或禁用一些帮助程序

application.ini上的示例:

helpers.Helper1=on
helpers.Helper2=off
现在的问题是,当助手关闭时,我想重写这个助手的一些函数,以便在视图上返回不同的结果。这样,我就不需要更改视图脚本中的任何内容

我想在不同的位置为每个助手提供两个不同的php文件。一个使用真实的助手,另一个使用更改的助手(在application.ini上关闭时工作)

问题是我不知道如何告诉视图它应该加载哪一个

有人知道怎么做吗

最终代码

好的,经过多次尝试,我将其与以下代码一起使用:

自举

protected function _initConfigureHelpers(){
    $this->bootstrap('view');
    $view = $this->getResource('view');

    $view->addHelperPath("./../library/ConfigHelpers","Configurable_Helper");
    $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
        'ViewRenderer'
    );
    $viewRenderer->setView($view);
    $front  = Zend_Controller_Front::getInstance();
    $front->registerPlugin(new Application_Plugin_ViewPlugins());
    return $view;
}
应用程序\u插件\u视图插件

class Application_Plugin_ViewPlugins extends Zend_Controller_Plugin_Abstract
{

    public function preDispatch(Zend_Controller_Request_Abstract $request){

        $front=Zend_Controller_Front::getInstance();
        $bootstrap=$front->getParam('bootstrap');
        $options=$bootstrap->getOption("helpers");
        if (is_array($options)){
            $view = $bootstrap->getResource('view');

            foreach($options as $option => $value){
                $helper=$view->getHelper($option);
                if ($helper){
                    if ($value=="off")
                        $helper->__disable();
                    else if ($value!="on")
                        throw new Exception('The value of helpers.'.$option.' must be "on" or "off" on application.ini.');
                } else {
                    throw new Exception("Inexistent Helper");
                }
            }
        }
    }

}
修改的帮助器示例

require_once APPLICATION_HELPERS."CssCrush.php";

class Configurable_Helper_CssCrush extends Zend_View_Helper_CssCrush {

    protected $__config_enabled = true;

    public function __disable(){
        $this->__config_enabled = false;
        return $this;
    }


    public function __enable(){
        $this->__config_enabled = true;
        return $this;
    }

    public function cssCrush(){
        if ($this->__config_enabled){
            return parent::cssCrush();
        } else{
            return new Modified_CssCrush();
        }
    }

}

class Modified_CssCrush {

    public static function file ( $file, $options = null ) {
        return $file;
    }

}
APPLICATION\u HELPERS在/public/index.php上定义为“./APPLICATION/views/HELPERS/”


现在,当我想添加一个可配置的帮助程序时,我将原始帮助程序放在“/application/views/helpers/”上,然后使用上面示例的结构在“/library/ConfigHelpers”上创建它的修改版本。

例如,您可以创建一个扩展原始帮助程序的自定义帮助程序

class My_Helper_Url extends Zend_View_Helper_Url
{}
然后根据需要重写这些方法。

我认为您需要的是即将推出但在zf1中不可用的方法

不过只要稍加修补,你就能得到你需要的东西

在引导中配置帮助程序 (假定为默认项目结构)

查看帮助程序路径配置:application/configs/application.ini:

resources.view.helperPath.Zf_View_Helper_ = "Zf/View/Helper"
一个简单的可配置帮助程序(允许禁用/启用,但显然可以添加所需的任何方法(将其用作需要该行为的帮助程序的基类)

并在引导中配置帮助程序:

public function _initConfigureHelpers()
{
    $this->bootstrap('view');
    $view = $this->getResource('view');

    $configurableHelper = $view->configurable();
    $configurableHelper->disable();
}
您可以在.ini文件中添加选项,并在bootstrap initConfigureHelpers()方法中获取它们


如果您想从任何默认的zf帮助程序中获得此行为,请按照@Ratzo所说的操作,扩展这些帮助程序,添加所需的行为,然后在引导程序中配置它们。

请查看以下链接

下面是ZeND文档中应该考虑的要点。 注意:默认辅助路径

默认助手路径始终指向Zend Framework视图 helpers,即“Zend/View/Helper/”。即使调用setHelperPath() 要覆盖现有路径,将设置此路径以确保 默认的助手可以工作

这意味着您无法真正关闭helpers,除非您想扩展Zend_View对象并覆盖setHelperPath方法。但这不是方法

这可能是你想要做的。不过,首先,这是我的假设

假设:您希望编写自己的视图帮助程序,通过在此处或此处更改一些方法,稍微改变当前视图帮助程序的功能

下面是你应该做什么来实现这一点

首先,编写视图帮助程序。确保类名的最后一部分与要“覆盖”的视图帮助程序相同。不必这样做,但这样可以确保无法再使用原始帮助程序

class My_View_Helper_BaseUrl extends Zend_View_Helper_BaseUrl

{   
    private $_enabled = true;
    public function setEnabled( $bool ){ $this->_enabled = (boolean) $bool; }
    public function baseUrl(){ 
        if( $this->_enabled ){
             return 'testUrl'; //other code 
        }
        else return parent::baseUrl();
}
现在您已经有了,请执行以下操作

$view->setHelperPath('/path/to/my/helpers', 'My_View_Helper'); //1
echo $view->baseUrl();  //2
很好。现在您已经有效地跟踪了原始的BaseUrl帮助程序。 上面的代码将使视图扫描您的目录 在扫描默认的zend目录之前查找任何帮助程序 2视图将首先找到您的baseUrl帮助程序,并使用它而不是 原始baseUrl帮助程序。在上面的示例中,它应该
“testurl”而不是正常的baseUrl行为。

那么,我是否需要在所有扩展助手上设置启用和禁用功能,或者是否有一种方法只定义一次,然后“导入”它们您只需要在可配置的帮助程序中定义方法。所有其他帮助程序都可以扩展它,因此它们将继承相同的行为。因此,假设您有一个名为
Zf\u View\u helper\u HelloWorld
的新帮助程序,并且希望它是可配置的,那么您将扩展可配置的帮助程序:
类Zf\u View\u Helper_HelloWorld扩展了Zf_View_Helper_可配置{…}
。如果您指的是默认的zf帮助程序,那么可能是的,您需要在所有扩展帮助程序类中定义启用/禁用。除非您使用的是php5.4,否则您可以利用traits:。因此,我需要在可配置帮助程序中更改我想要的所有函数。如果是,如果我在视图中有此代码,该怎么办:
$this->minifyHeadScript()->appendFile(“some_js.js”)
?是的。你的minifyHeadScript帮助程序是一个自定义的,太好了!只要让你的minifyHeadScript帮助程序扩展可配置的帮助程序,就可以启用和禁用它。在你的可配置帮助程序中,u toString()上方对于所需的输出,具体取决于启用或禁用。换句话说,您将有如下内容:if enabled call
return parent::\uu toString()
else返回其他值。好的,但我想像@BullfrogBlues所说的那样使用它。换句话说,我想有一个变量来控制当变量设置为true或false时助手的某些函数应该返回什么。问题是我的助手在“应用程序/视图/助手”中,当我执行“扩展Zend_View_Helper_MinifyHeadScript”(例如,它找不到“Zend_View_Helper_MinifyHeadScript”)“…如果你想使用原始的帮助程序,那么你可以删除最后一行。在这种情况下,它会找到普通的zend帮助程序。或者你可以进行我在编辑中添加的更改。你可以将启用/不启用的方法添加到基类。这是BullfrogBlues正在做的一个变体。看起来
$view->setHelperPath('/path/to/my/helpers', 'My_View_Helper'); //1
echo $view->baseUrl();  //2