2012-01-05 19 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(); 
    } 
}