【问题标题】:Zend Form Element Row needs either an id or class set through Zend_Config_IniZend Form Element Row 需要通过 Zend_Config_Ini 设置的 id 或类
【发布时间】:2012-01-05 18:07:14
【问题描述】:

我在 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 标签的 id 或 class?我想要以下输出:

<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 文件中,有没有办法使用默认装饰器覆盖类名(而不是必须为每个元素复制所有装饰器)?

【问题讨论】:

    标签: forms zend-form zend-form-element zend-config


    【解决方案1】:

    最简单的事情就是创建自己的装饰器。例如,我创建了一个 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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-14
      • 2014-01-09
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      • 2019-03-03
      相关资源
      最近更新 更多