3

UPD:解決済み - 余分なデコレータを追加しました。

次の結果が必要です。

<dd id="daily_722-element">
    <input id="daily_722" type="checkbox" name="daily_722" value="1">
    <span> some text </span>
</dd>

チェックボックスの直後に、HTMLタグで「テキスト」をラップする必要がありますが、/ DDの前(後ではありません)!

私の現在のコードは次のとおりです。

$chk = new Zend_Form_Element_Checkbox('daily_shit');
$chk->setLabel('<span class="dt-note">'. $firstName. '</span>');
$chk->getDecorator('label')->setOption('escape', false);

したがって、次のものが生成されます。

<dd id="daily_722-element">
<input id="daily_722" type="checkbox" name="daily_722" value="1">
</dd>

そして、チェックボックスの後に余分なHTMLを挿入する方法の手がかりが得られません...しかし、DD内

4

2 に答える 2

2

ZF1 デコレーターは、混乱の原因として知られています。ただし、少し努力して、結果の HTML がどのように構築されるかを理解すれば、目的を達成するのは非常に簡単です。

フォーム要素の ZF のデフォルト デコレータをオーバーライドしていないと思います。次に、それらは次のようになります (順序どおりに実行され、前のデコレータによって返されたものを変更していることを思い出してください):

  • ViewHelper (入力自体をレンダリング)
  • エラー(必要に応じてエラー メッセージを追加)
  • 説明(設定されている場合は要素の説明を追加)
  • HtmlTag (dd で囲みます)
  • ラベル(dt でラップされたラベルを先頭に追加)

<span> some text </span>ここで必要なのは、入力 (またはエラー/説明) の後、ただし でラップされる前に追加することですdd。これは、新しいデコレータを既存のデコレータのチェーンに正しい位置に追加する必要があることを意味します。

$chk = new Zend_Form_Element_Checkbox('daily_shit');
$chk->setLabel('<span class="dt-note">firstName</span>');
$chk->getDecorator('label')->setOption('escape', false);

// Create a new decorator to render span you need
$postCheckboxDecorator = new Zend_Form_Decorator_Callback(
    array(
        'callback' => function () {
            return '<span>some text</span>';
        }
    )
);

// Add it into existing chain of decorators, right after ViewHelper
$decorators = $chk->getDecorators();
$decorators = array_slice($decorators, 0, 1, true) +
    array('PostCheckboxDecorator' => $postCheckboxDecorator) +
    array_slice($decorators, 1, count($decorators) - 1, true);

// Replace element's decorators with a modified chain
$chk->setDecorators($decorators);
于 2016-05-15T02:08:00.350 に答える
1

このためのカスタム デコレータを作成できます。メソッドrenderは元のコンテンツを受け取って変更し、変更されたコンテンツを返します。

class MyDecorator extends Zend_Form_Decorator_Abstract
{
    public function render($content)
    {
        return $content . $this->_options['content'];
    }
}

そしてそれをフォーム構築で使用する

$form = new Zend_Form();

$chk = new Zend_Form_Element_Checkbox('daily_shit');
$chk->setLabel('<span class="dt-note">maxa</span>');
$chk->getDecorator('label')->setOption('escape', false);

$decorators = $chk->getDecorators();
$chk->clearDecorators();
$chk->addDecorator($decorators['Zend_Form_Decorator_ViewHelper']);
$chk->addDecorator(new MyDecorator(array('content' => '<span> some text </span>')));
$chk->addDecorator($decorators['Zend_Form_Decorator_Errors']);
$chk->addDecorator($decorators['Zend_Form_Decorator_Description']);
$chk->addDecorator($decorators['Zend_Form_Decorator_HtmlTag']);
$chk->addDecorator($decorators['Zend_Form_Decorator_Label']);

$form->addElement($chk);
于 2016-05-14T08:58:48.967 に答える