當然,我並不想改變圖書館/ Zend的。 我知道我可以創建擴展Zend_Form並設置自定義裝飾器的類My_Form。比,各種形式的擴展新類My_Form ...在全局應用程序級別更改默認Zend Form裝飾器?
有什麼辦法來設置的Zend表單裝飾(更改默認飾)在某些插件或引導,在不改變現有的形式?
或者說,什麼是覆蓋默認的形式裝飾於所有形式的最佳方式?
當然,我並不想改變圖書館/ Zend的。 我知道我可以創建擴展Zend_Form並設置自定義裝飾器的類My_Form。比,各種形式的擴展新類My_Form ...在全局應用程序級別更改默認Zend Form裝飾器?
有什麼辦法來設置的Zend表單裝飾(更改默認飾)在某些插件或引導,在不改變現有的形式?
或者說,什麼是覆蓋默認的形式裝飾於所有形式的最佳方式?
我不知道我的回答是否會有所幫助,但在這裏你去。 有一種用你自己的裝飾器代替ZF裝飾器的方法,而無需自己編輯表格。
溶液#1:
的方法描述here。或簡稱:
比方說,你已經有了一個形式:
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"
添加新文件的應用程序/視圖/助理/ 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中定義裝飾器。
例如: -
$textDecorator = array(
array('ViewHelper',
array('helper' => 'formText')
),
array('Label',
array('class' => 'label')
),
array('HtmlTag',
array('tag' => 'div', 'class' => 'formfield clearfix')
)
);
Zend_Registry::set('text_dec', $textDecoration);
現在你可以使用它的所有形式的文本字段。
例如: -
class TestForm extends Zend_Form
{
function init()
{
$this->addElement ('text', 'a', array (
'label' => 'Name',
'decorator' => Zend_Registry::get('text_dec')
));
}
}
所以,你可以使用一些全球裝飾形式的這一個。
這是完整的解決方案。
在「.INI」文件你裝飾一組文件夾:
; 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"
接下來,使用同名爲你的裝飾覆蓋默認的裝飾。 例如,替代默認的「DtDdWrapper」裝飾, 可以使用Application_Form_Decorator_DtDdWrapper:
class Application_Form_Decorator_DtDdWrapper extends Zend_Form_Decorator_DtDdWrapper
裝飾會用這個名字的最後一部分被加載。
這似乎是一個很好的解決方案。所以,formText()方法將返回一個字符串類型。該字符串替換窗體上的每個文本字段,然後我應該返回像''或類似的字符串,我是嗎?我不能返回類型Zend_Form_Element_Text .. – tasmaniski 2012-02-08 14:43:36
是的,完全正確。一個字符串。 – akond 2012-02-08 15:48:59
好的,這是很好的做法,但不能幫助我解決問題,謝謝回答+1,但我無法接受此答案。 – tasmaniski 2012-02-09 11:59:42