2

我正在尝试一种方法来禁用“应用程序/视图/助手”中的一些视图助手......

我真正想要的是在 application.ini 上放置一些选项来启用或禁用一些 Helpers。

application.ini 上的示例:

helpers.Helper1=on
helpers.Helper2=off

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

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

}

APPLICATION_HELPERS 在 /public/index.php 上定义为“../application/views/helpers/”。

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

4

3 回答 3

1

我认为您想要的是zf2中的依赖注入,但在zf1 中不可用。

通过一些修补,虽然你可以得到你需要的东西。

在引导程序中配置助手

(假设默认项目结构)

查看助手路径配置: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';
        }
    }
}

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

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

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

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

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

于 2012-05-02T20:24:28.893 回答
1

请看下面的链接Zend_View 链接

下面是您应该从 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 助手并使用它而不是原始的 baseUrl 助手。在上面的示例中,它应该回显“testurl”而不是正常的 baseUrl 行为。

于 2012-05-02T21:23:32.093 回答
0

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

class My_Helper_Url extends Zend_View_Helper_Url
{}

并根据需要重写方法。

于 2012-05-02T19:59:47.690 回答