1

メールのバリデーターを設定して、空にならないようにしました。

これは、zend_formが生成する通常のフォームのマークアップです。

<dt id="email-label"><label class="required" for="email">Email</label></dt>
<dd id="email-element">
   <input type="text" value="" id="email" name="email">
</dd>

検証が失敗すると、zend_formはul class="errors"dd内に新しいものを追加します

<dt id="email-label"><label class="required" for="email">Email</label></dt>
<dd id="email-element">
   <input type="text" value="" id="email" name="email">
   <ul class="errors">
      <li>Value is required and can't be empty</li>
   </ul>
</dd>

このデフォルトの動作を少し変更して、全体dt ddを1つにまとめたり、エラークラスを追加しpたりするにはどうすればよいですか?something私の推測では、要素にエラーがある場合の動作方法をzend_formに指定する必要があります。

4

1 に答える 1

5

これを行うための独自のデコレータを作成できます。これは次のような単純なものです。

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_Textthat 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;
    }
}
于 2010-10-06T23:09:49.630 に答える