如何禁用一些Zend View Helpers

时间:2012-05-02 17:33:57

标签: zend-framework helper bootstrapping view-helpers zend-view

我正在尝试禁用“application / views / helpers”中的一些视图助手......

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

关于application.ini的示例:

helpers.Helper1=on
helpers.Helper2=off

现在问题是当Helper关闭时,我想重写这个帮助器的一些函数,以便在视图上返回不同的结果。这样,我不需要在视图脚本中更改任何内容。

我想在不同位置为每个助手提供2个不同的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;
}

Application_Plugin_ViewPlugins

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;
    }

}

在/public/index.php上将APPLICATION_HELPERS定义为“../ application / views / helpers /".

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

3 个答案:

答案 0 :(得分:1)

我认为您想要的是Dependency Injection zf2,但在zf1中不可用。

虽然你可以得到你所需要的一些修补。

在引导程序

中配置帮助程序

(假设默认项目结构)

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

resources.view.helperPath.Zf_View_Helper_ = "Zf/View/Helper"

一个简单的可配置帮助程序(允许禁用/启用但显然可以添加您需要的任何方法(将此作为需要该行为的帮助程序的基类)

class Zf_View_Helper_Configurable extends Zend_View_Helper_Abstract
{
    protected $isEnabled = true;

    public function configurable()
    {
        return $this;
    }

    public function disable()
    {
        $this->isEnabled = false;
        return $this;
    }


    public function enable()
    {
        $this->isEnabled = true;
        return $this;
    }

    public function __toString()
    {
        if ($this->isEnabled) {
            return 'Configurable is enabled';
        } else {
            return 'Configurable is disabled';
        }
    }
}

并在bootstrap中配置帮助程序:

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

    $configurableHelper = $view->configurable();
    $configurableHelper->disable();
}

您可以在.ini文件中添加选项,并在bootstrap initConfigureHelpers()方法中获取它们。

如果你想从任何默认的zf帮助程序中获取此行为,请执行@Ratzo所说的并扩展这些帮助程序并添加所需的行为,然后在引导程序中对它们进行配置。

答案 1 :(得分:1)

请查看以下链接Zend_View link

以下是您应该从Zend文档中考虑的重点。

  

注意:默认帮助程序路径

     

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

这意味着您无法真正关闭帮助程序,除非您想要扩展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助手并使用THAT代替 原始baseUrl助手。在上面的例子中它应该回应 'testurl'而不是正常的baseUrl行为。

答案 2 :(得分:0)

您可以制作扩展原始助手的自定义助手,例如

class My_Helper_Url extends Zend_View_Helper_Url
{}

并根据需要重写方法。