Zend Form Element Row требуется либо идентификатор, либо класс, установленный через Zend_Config_Ini - PullRequest
0 голосов
/ 05 января 2012

У меня есть следующие декораторы по умолчанию в Zend_Config_Ini для настройки моей формы:

elementDecorators.viewHelper.decorator = "ViewHelper"
elementDecorators.label.decorator = "Label"
elementDecorators.errors.decorator = "Errors"
elementDecorators.htmlTag.decorator = "HtmlTag"
elementDecorators.htmlTag.options.tag = "li"

У меня есть следующее определение элемента также в Zend_Config_Ini:

elements.username.type = "text"
elements.username.options.label = "Username:"
elements.username.options.required = true

и получается следующий вывод:

<li>
    <label for="username" class="required">Username:</label>
    <input type="text" name="username" id="username" value="" />
</li>

Теперь мне нужно знать, как мне (желательно через файл конфигурации ini) установить идентификатор или класс тега LI? Я хотел бы следующий вывод:

<li id="form-username-element"> ... </li>

или

<li class="form-2col"> ... </li>

Обновление: Я смог получить его, переопределив все декораторы в самом конфиге элемента следующим образом:

elements.username.options.decorators.viewHelper.decorator = "ViewHelper"
elements.username.options.decorators.label.decorator = "Label"
elements.username.options.decorators.errors.decorator = "Errors"
elements.username.options.decorators.htmlTag.decorator = "HtmlTag"
elements.username.options.decorators.htmlTag.options.tag = "li"
elements.username.options.decorators.htmlTag.options.class = "username-row-element"

Так что это сработает, однако создаст много дубликатов, так как это должно было бы быть на каждом элементе (с единственным изменением последней строки, которое было бы самой установкой класса). Так что мне сейчас интересно, есть ли из файла ini способ просто переопределить имя класса с помощью декораторов по умолчанию (вместо того, чтобы дублировать все декораторы для каждого элемента)?

1 Ответ

0 голосов
/ 07 января 2012

Самое простое, что нужно сделать, это создать свой собственный Декоратор.Например, я создал декоратор ElementWrap, который оборачивает каждый элемент div и добавляет необходимый класс и id.Это может выглядеть примерно так:

class Form_Decorator_ElementWrap extends Zend_Form_Decorator_Abstract
{
    public function render($content)
    {
        $element = $this->getElement();
        if($this->getOption('openOnly')) {
            return '<div class="'.$this->getClass().'" id="'.$this->getId().'">' . $content;
        } else if($this->getOption('closeOnly')) {
            return $content . PHP_EOL . '</div>' . PHP_EOL;
        } else {
            return '<div class="'.$this->getClass().'" id="'.$this->getId().'">' . $content . '</div>';
        }
    }

    public function getClass()
    {
        $element = $this->getElement();
        $classes = array(
            'field_wrap',
            'field_' . strtolower(substr(strrchr($element->getType(), '_'), 1)),
            $this->getOption('class'),
        );
        if($element->hasErrors()) {
            $classes[] = 'field_error';
        }
        if($elementClass = $element->getAttrib('class')) {
            $classes[] = $elementClass;
        }
        return implode(' ', array_filter($classes));
    }

    public function getId()
    {
        return 'fieldwrap-' . $element->getId();
    }
}
...