2009-10-26 57 views
1

我完全對裝飾者的工作方式感到困惑。這是我想達到的HTML結構:如何使用Zend_Form裝飾器更改表單的佈局?

<form id="" action="" method="post"> 

    <fieldset><legend>Contact form</legend> 
     <p> 
      <label for="name">Name</label> 
      <input type="text" name="name" id="name" size="30" /> 
     </p> 
     <p> 
      <label for="email">Email</label> 
      <input type="text" name="email" id="email" size="30" /> 
     </p> 
     <p> 
      <label for="web">Website</label> 
      <input type="text" name="web" id="web" size="30" /> 
     </p>                      
     <p> 
      <label for="message">Message</label> 
      <textarea name="message" id="message" cols="30" rows="10"></textarea> 
     </p>      

     <p class="submit"><button type="submit">Send</button></p>  

    </fieldset>     

</form> 

如何擺脫定義列表格式,並使用一個段落標記基於佈局呢?

更新:有沒有一種方法可以將這種風格應用於我創建的所有窗體?而不是必須將裝飾器應用於每一種形式?

回答

0

過了一段時間,我放棄了,只使用ViewRenderer裝飾器。這是一個很好的文章,解釋如何做到這一點(http://weierophinney.net/matthew/archives/215-Rendering-Zend_Form-decorators-individually.html)。如果你真的想知道如何使用裝飾器,該系列的其餘部分也不錯。

使用ViewRenderer裝飾器,你基本上是將模板渲染爲模板(與MVC本身不同)。通過這種方式,您可以最終控制所有內容,當然,您可以獲得靈活性,在RAD中失敗,並彌補複雜性。

1

如果您想更改表單的元素,則必須重置表單的裝飾器及其元素。

在p標籤

class Default_Form_Contact extends Zend_Form 
{ 
    public function init() 
    { 
     $name = new Zend_Form_Element_Text('name'); 
     $name->setLabel('Name:') 
      ->setDecorators(
       array(
        array('ViewHelper', array('helper' => 'formText')), 
        'Errors', 
        array('Description', array('tag' => 'p', 'class' => 'description')), 
        array('HtmlTag', array('tag' => 'p', 'id' => 'name-element')), 
        array('Label', array('class' => 'label')), 
       ) 
      ); 
     $this->addElement($name); 
    }  
} 

哪個裝飾你真的需要你包圍場的例子不得不考慮自己。對於可以在init()中執行的表單裝飾器,您可以在init()中執行此操作嗎?

$this->setDecorators(array(some decorators)); 
+0

有沒有一種方法可以將其應用於全局? – Andrew 2009-10-27 02:39:35

+0

您可以繼承所有Zend_Element類並重載loadDefaultDecorators。 – 2009-10-27 05:45:55