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