Zend Form Decorators - PullRequest
       12

Zend Form Decorators

2 голосов
/ 28 января 2010

Наличие (больше) проблем с декораторами Zend Form. У меня есть это до сих пор:

Сброс общей формы декоратора:

    $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 ]

5 голосов
/ 28 января 2010

Когда вы создаете декораторы 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')),
);

Как видите, я назвал первое «Значение», а второе «Поле». Именование их также дает вам возможность ссылаться на декоратор позже, например так:

$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 голос
/ 23 января 2011

Большое спасибо за эту информацию! Теперь я тоже все заработал.

Это полный код 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());

/

1 голос
/ 28 января 2010
$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'))
));

Объяснение из руководства : Внутри Zend_Form_Element использует класс декоратора в качестве механизма поиска при извлечении декораторов. В результате вы не можете зарегистрировать несколько декораторов одного типа; последующие декораторы просто перезапишут те, что существовали ранее. Чтобы обойти это, вы можете использовать псевдонимы. Вместо того, чтобы передавать имя декоратора или имя декоратора в качестве первого аргумента для addDecorator (), передайте массив с одним элементом, псевдоним которого указывает на объект или имя декоратора:

// 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');
...