Aaron Murray
Aaron Murray

Reputation: 2030

Zend Form Element Row needs either an id or class set through Zend_Config_Ini

I have the following default decorators in a Zend_Config_Ini to set up my form:

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

I have the following element definition also in the Zend_Config_Ini:

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

and the following output is produced:

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

Now what I need to know is, how do I (through the ini config file preferably), set the id or class of the LI tag? I would like the following output:

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

or

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

Update: I was able to get it by overriding all the decorators in the element config itself like this:

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"

So that will work, however creates a lot of duplication as that would have to go onto every element (with the single change of the last line which would be the class setting itself). So what I am NOW wondering, is, from the ini file, is there a way to just override the class name using the default decorators (rather than having to duplicate all of the decorators for each element)?

Upvotes: 0

Views: 389

Answers (1)

Pieter
Pieter

Reputation: 1774

Easiest thing to do is create your own Decorator. For instance, I've created an ElementWrap decorator, which wraps each element with a div and adds the necessary class and id. It could look something like this:

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();
    }
}

Upvotes: 0

Related Questions