2012-01-05 58 views
0

设置ID或类我有一个Zend_Config_Ini的下列缺省的装饰来设置自己的状态:Zend的表单元素行需要既可以通过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> 

现在WH在我需要知道的是,我如何(通过ini配置文件最好),设置LI标记的ID或类?我想下面的输出:

<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" 

因此,这将工作,但是会产生大量的重复,因为这将不得不去每个元素(与单一的变化o f最后一行,这将是课程设置本身)。所以我现在想知道的是,从ini文件中,有没有一种方法可以使用默认的装饰器来覆盖类名(而不是必须复制每个元素的所有装饰器)?

回答

0

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