Zend framework 是否在全局应用程序级别更改默认Zend表单装饰器?

Zend framework 是否在全局应用程序级别更改默认Zend表单装饰器?,zend-framework,plugins,zend-form,bootstrapping,zend-decorators,Zend Framework,Plugins,Zend Form,Bootstrapping,Zend Decorators,当然,我不想改变library/Zend。 我知道我可以创建类My_表单,它扩展Zend_表单并设置自定义装饰器。然后,每个表单都扩展了新的类我的表单 有没有办法在一些插件或引导程序中设置Zend Form Decorator(更改默认装饰),而不更改现有的表单 或者,什么是覆盖所有表单的默认表单装饰器的最佳方法?很多人都尝试过,据我所知,没有一个在不扩展Zend_表单的情况下成功地实现了这一点。请参阅和,以获得次优解决方案。我不确定我的答案是否有帮助,但给你。 有一种方法可以用自己的装饰器替换

当然,我不想改变library/Zend。 我知道我可以创建类My_表单,它扩展Zend_表单并设置自定义装饰器。然后,每个表单都扩展了新的类我的表单

有没有办法在一些插件或引导程序中设置Zend Form Decorator(更改默认装饰),而不更改现有的表单


或者,什么是覆盖所有表单的默认表单装饰器的最佳方法?

很多人都尝试过,据我所知,没有一个在不扩展Zend_表单的情况下成功地实现了这一点。请参阅和,以获得次优解决方案。

我不确定我的答案是否有帮助,但给你。 有一种方法可以用自己的装饰器替换ZF装饰器,而无需编辑表单本身

解决方案#1:

描述的方法。简言之:

假设你有一张表格:

class Form extends Zend_Form
{
    function init ()
    {
        $this->addElement ('text', 'a', array (
            'label' => 'Name'
        ));
    }
}
然后在application.ini中使用

resources.view.helperPath.Default_View_Helper = APPLICATION_PATH "/views/helpers"
添加一个新文件application/views/helpers/FormText.php

class Default_View_Helper_FormText extends Zend_Form_Decorator_Abstract
{
    function formText ()
    {
        return 'It is I.';
    }
}
就这样

解决方案#2:

让我们使用这个抽象类:

abstract class Application_Style
{
    private $_object;



    function __construct ($object = null)
    {
        if (isset ($object))
        {
            $this->apply ($object);
        }
    }


    function apply ($object)
    {
        $this->setObject ($object);
        if ($this->filter ())
        {
            $this->onApply ();
        }

        return $object;
    }


    function __call ($method, $arguments)
    {
        return call_user_func_array (array ($this->getObject (), $method), $arguments);
    }


    abstract protected function onApply ();


    protected function filter ()
    {
        return true;
    }


    function setObject ($_object)
    {
        $this->_object = $_object;
    }


    function getObject ()
    {
        return $this->_object;
    }
}
然后是一个后代

class Application_Style_AdminForm extends Application_Style
{
    function onApply ()
    {
            $this->addElement ($submit = new Zend_Form_Element_Submit ('submit', array(
            'label' => 'Submit',
            )));

            $submit
            ->removeDecorator ('DtDdWrapper')
            ->addDecorator ('HtmlTag', array (
            'placement' => Zend_Form_Decorator_HtmlTag::PREPEND,
            'tag' => 'p',
            'openOnly'  => 1,
            ))
            ->addDecorator ('Custom', array ('text' => '     '))
            ;
        }
}
在onApply()方法中,可以是适合您的任何内容。例如,添加或删除装饰器。然后,您可以在表单上调用此样式,如下所示:

new Application_Style_AdminForm ($this);

它允许您操作表单表示,但不直接更改它。

我有一个解决方案。您可以在bootsrap中定义装饰器

例如:

现在您可以将其用于所有表单文本字段

例如:


所以你可以使用一些全局的装饰器

这里是完整的解决方案

在“.ini”文件中为装饰程序设置文件夹:

接下来,为您的decorator使用相同的名称来覆盖默认的decorator。 例如,要替换默认的“DtDdWrapper”装饰器, 您可以使用应用程序\窗体\装饰程序\ DtDdWrapper:

class Application_Form_Decorator_DtDdWrapper extends Zend_Form_Decorator_DtDdWrapper

Decorator将由该名称的最后一部分加载。

这样,您不必更改应用程序中每个
n
表单中的
1
行,而是将
m
行(对于每个元素)乘以
n
表单。这比扩展Zend_表单更好吗?更不用说@akond的解决方案了,它似乎与OP想要的最接近。@bububaba实际上,您可以使用该变量使用setDecorators()为整个表单设置decorators;要在全局范围内覆盖默认的表单装饰器,他需要扩展Zend_表单,因为它的设计目的是……;)这似乎是一个很好的解决办法。因此,formText()方法将返回字符串类型。该字符串替换表单上的每个文本字段,然后我应该返回类似“”或类似的字符串,对吗??我无法返回Zend_Form_Element_Text类型。好的,这是一个很好的做法,但对我的问题没有帮助,谢谢回答+1,但我不能接受这个答案。
class TestForm extends Zend_Form
{
    function init ()
    {
        $this->addElement ('text', 'a', array (
            'label' => 'Name',
            'decorator' => Zend_Registry::get('text_dec')
        ));
    }
}
; folder with custom decorators will be loaded for FormElements
form.elementPrefixPath.decorator.prefix =  "Application_Form_Decorator"
form.elementPrefixPath.decorator.path   =  "Application/Form/Decorator/"
form.elementPrefixPath.decorator.type   = "decorator"

; folder with custom decorators will be loaded for Forms
form.prefixPath.decorator.prefix =  "Application_Form_Decorator"
form.prefixPath.decorator.path   =  "Application/Form/Decorator/"
form.prefixPath.decorator.type   = "decorator"
class Application_Form_Decorator_DtDdWrapper extends Zend_Form_Decorator_DtDdWrapper