これを行うための独自のデコレータを作成できます。これは次のような単純なものです。
class My_Decorator_ElementWrapper extends Zend_Form_Decorator_Abstract
{
public function render($content)
{
$class = 'form-element';
$errors = $this->getElement()->getMessages();
if (!empty($errors))
$errors .= ' has-errors';
return '<div class="'.$class.'">' . $content . '</div>';
}
}
これで、このデコレータを要素に登録できます。
$element->addPrefixPath('My_Decorator', 'My/Decorator/', 'decorator');
$element->addDecorator('ElementWrapper');
代わりにを使用して、すべての要素のプレフィックスパスを同時に登録することもできます$form->addElementPrefixPath()
。
このデコレータ(およびプレフィックスパス)をすべての要素に自動的に追加する場合は、各要素をZendの対応する要素に拡張してから(たとえば、make My_Form_Element_Text
that extends Zend_Form_Element_Text
)、init関数にプレフィックスパスを追加し、loadDefaultDecorators()
メソッドをオーバーライドすることをお勧めしますElementWrapper
デコレータチェーンの最後にを追加します。たとえば、これは次のようloadDefaultDecorators()
に検索されZend_Form_Element_Text
ます。
public function loadDefaultDecorators()
{
if ($this->loadDefaultDecoratorsIsDisabled()) {
return $this;
}
$decorators = $this->getDecorators();
if (empty($decorators)) {
$this->addDecorator('ViewHelper')
->addDecorator('Errors')
->addDecorator('Description', array('tag' => 'p', 'class' => 'description'))
->addDecorator('HtmlTag', array('tag' => 'dd',
'id' => $this->getName() . '-element'))
->addDecorator('Label', array('tag' => 'dt'));
}
return $this;
}
->addDecorator('ElementWrapper')
チェーンの最後にを追加するだけです。したがって、具体的な例を示すためにMy_Form_Element_Text
:
class My_Form_Element_Text extends Zend_Form_Element_Text
{
public function init()
{
$this->addPrefixPath('My_Decorator', 'My/Decorator/', 'decorator');
}
public function loadDefaultDecorators()
{
if ($this->loadDefaultDecoratorsIsDisabled()) {
return $this;
}
$decorators = $this->getDecorators();
if (empty($decorators)) {
$this->addDecorator('ViewHelper')
->addDecorator('Errors')
->addDecorator('Description', array('tag' => 'p', 'class' => 'description'))
->addDecorator('HtmlTag', array('tag' => 'dd',
'id' => $this->getName() . '-element'))
->addDecorator('Label', array('tag' => 'dt'))
->addDecorator('ElementWrapper');
}
return $this;
}
}