2


3

Zend Formデコレータ

zendフォームデコレータに(さらに)問題がある。 私はこれまでのところこれを持っている:

フォームデコレータ全体をリセットします。

    $this->clearDecorators();
    $this->setDecorators(array('FormElements', 'Form'));

私はすべての要素を、DL内のフィールドセット内にしたい表示グループに追加しています

    $group->setDecorators(array(
           'FormElements',
            array('HtmlTag', array('tag' => 'dl')),
           'Fieldset'
    ));

これまではすべて動作していましたが、今ではフィールドセットの直前に画像タグを配置したいと思います。 単独でこれは動作します:

        $group->setDecorators(array(
            'FormElements',
            'Fieldset',
            array('HtmlTag',array('tag'=>'img','placement'=>'prepend','src'=>'/images/'.$imgs[$i-1]->im_name.'_main.jpg'))
        ));

しかし、これはしません(フィールドセット内に追加されるDLを停止します):

        $group->setDecorators(array(
            'FormElements',
            array('HtmlTag', array('tag' => 'dl')),
            'Fieldset',
            array('HtmlTag',array('tag'=>'img','placement'=>'prepend','src'=>'/images/'.$imgs[$i-1]->im_name.'_main.jpg'))
        ));

どこでうまくいかないの?

3 Answer


5


HtmlTagデコレータを作成して、名前を付けます。 これが私のコードの例です。

protected $_fileElementDecorator = array(
    'File',
    array(array('Value'=>'HtmlTag'), array('tag'=>'span','class'=>'value')),
    'Errors',
    'Description',
    'Label',
    array(array('Field'=>'HtmlTag'), array('tag'=>'div','class'=>'field file')),
);

ご覧のとおり、最初の名前を「Value」、2番目の名前を「Field」にしました。 それらに名前を付けると、次のように後でデコレータを参照することもできます。

$file = $form->getElement('upload_file');
$decorator = $file->getDecorator('Field');
$options = $decorator->getOptions();
$options['id'] = 'field_' . $file->getId();
if ($file->hasErrors()) {
    $options['class'] .= ' errors';
}
$decorator->setOptions($options);


1


$group->setDecorators(array(
    'FormElements',
    array('HtmlTag', array('tag' => 'dl')),
    'Fieldset',
    array(array('ImageTag' => 'HtmlTag'), array('tag'=>'img', 'placement'=>'prepend', 'src'=>'/images/'.$imgs[$i-1]->im_name.'_main.jpg'))
));

manualからの説明:内部的に、Zend_Form_Elementは、デコレータを取得するときに、検索メカニズムとしてデコレータのクラスを使用します。 その結果、同じタイプの複数のデコレータを登録できません。後続のデコレータは、以前に存在していたデコレータを単純に上書きします。 これを回避するには、エイリアスを使用できます。 デコレータまたはデコレータの名前をaddDecorator()の最初の引数として渡す代わりに、1つの要素を持つ配列を、エイリアスがデコレータオブジェクトまたは名前を指している状態で渡します。

// Alias to 'FooBar':
$element->addDecorator(array('FooBar' => 'HtmlTag'),
                       array('tag' => 'div'));

// And retrieve later:
$decorator = $element->getDecorator('FooBar');

addDecorators()およびsetDecorators()メソッドでは、デコレータを表す配列に「decorator」オプションを渡す必要があります。

// Add two 'HtmlTag' decorators, aliasing one to 'FooBar':
$element->addDecorators(
    array('HtmlTag', array('tag' => 'div')),
    array(
        'decorator' => array('FooBar' => 'HtmlTag'),
        'options' => array('tag' => 'dd')
    ),
);

// And retrieve later:
$htmlTag = $element->getDecorator('HtmlTag');
$fooBar  = $element->getDecorator('FooBar');


1


この情報をありがとうございます! 私もそれが機能するようになりました。

これは完全なPHPコードですFYI:

    $generatePhraseVariations = new Zend_Form_Element_Checkbox('generatephrasevariations');
    $generatePhraseVariations->setLabel('Generate phrase variations')
        ->setCheckedValue('yes')
        ->setUncheckedValue('no')
        ->setChecked(TRUE)
        ->setDecorators($this->myCheckBoxElementDecorators);
    $generateSpellingMistakes = new Zend_Form_Element_Checkbox('generatespellingmistakes');
    $generateSpellingMistakes->setLabel('Generate Spelling Mistakes')
        ->setCheckedValue('yes')
        ->setUncheckedValue('no')
        ->setChecked(FALSE)
        ->setDecorators($this->myCheckBoxElementDecorators);
    $this->addElements(array($generatePhraseVariations,$generateSpellingMistakes));
    $this->addDisplayGroup(
        array('generatephrasevariations','generatespellingmistakes'),
        'rightpanel1');
    Zend_Registry::get('logger')->info($this->getDisplayGroup('rightpanel1')->getDecorators());
    $this->getDisplayGroup('rightpanel1')
        ->setLegend('Features')
        ->setDecorators(
            array(
                'FormElements',
                array(array('Mijn-OL-HtmlTag'=>'HtmlTag'),array('tag'=>'ol')),
                array('Fieldset'),
                array(array('Mijn-DIV-HtmlTag'=>'HtmlTag'),array('tag'=>'div','id'=>'rightpanel1')),
                )
        );
    Zend_Registry::get('logger')->info($this->getDisplayGroup('rightpanel1')->getDecorators());

/