2011-07-23 45 views
2

如果我有以下簡單的形式:使用Zend表單裝飾,使表體的票據

<?php 

class Application_Form_Contact extends Zend_Form 
{ 
    public function init() 
    { 
     //set the method for the display form to POST 
     $this->setMethod('post'); 

     //create and add e-mail element 
     $email = $this -> createElement('text', 'username') 
           -> setLabel('E-mail:') 
          -> setRequired(true) 
          -> addFilters(array('StringTrim', 'StringToLower')) 
          -> addValidator('EmailAddress') 
          -> addErrorMessage('U dient een geldig e-mail adres in te vullen.');    
     $this->addElement($email); 

     //create and add message element 
     $message = $this -> createElement('textarea', 'message') 
          -> setLabel('Bericht:') 
          -> setRequired(true) 
          -> addValidator('StringLength', array(0, 5000)) 
          -> addErrorMessage('U dient een bericht in te vullen van maximaal 5000 tekens.'); 
     $this->addElement($message); 

     //submit button 
     $this->addElement('submit', 'submit', array(
      'ignore' => true, 
      'label'  => 'Verstuur Bericht' 
     )); 
    } 
} 

?> 

默認情況下,這將導致在一個表中的佈局,像這樣:

<form enctype="application/x-www-form-urlencoded" method="post" action="/contact"><dl class="zend_form"> 
<dt id="username-label"><label for="username" class="required">E-mail:</label></dt> 
<dd id="username-element"> 
<input type="text" name="username" id="username" value=""></dd> 
<dt id="message-label"><label for="message" class="required">Bericht:</label></dt> 
<dd id="message-element"> 
<textarea name="message" id="message" rows="24" cols="80"></textarea></dd> 
<dt id="submit-label">&#160;</dt><dd id="submit-element"> 
<input type="submit" name="submit" id="submit" value="Verstuur Bericht"></dd> 
</dl></form> 

哪個完全沒有必要,因爲一些簡單的HTML會導致一種更符合我喜好的形式(因爲textarea在標籤下,而電子郵件輸入緊挨着標籤):

<form enctype="application/x-www-form-urlencoded" method="post" action="/contact"> 

    <p> 
     <label id="username-label" for="username" class="required">E-mail:</label> 
     <input type="text" name="username" id="username" value="" /> 
    </p> 

    <br /> 

    <p> 
     <label id="message-label" for="message" class="required">Bericht:</label> 
     <br /> 
     <textarea name="message" id="message" rows="24" cols="80"></textarea> 
    </p> 

    <input type="submit" name="submit" id="submit" value="Verstuur Bericht" /> 

</form> 

看起來像這樣:http://jsfiddle.net/qmKYa/而不是http://jsfiddle.net/rudhA/2/

但我該如何讓zend根本不呈現任何表格,將段落標記中的前兩個元素包裹起來,並添加兩行以確保適當的間距?

回答

2

首先,Zend_Form使用裝飾器來編寫表單。您可以對現有的默認裝飾器進行更改,但也可以編寫和添加您自己的裝飾器。查看Zend Reference Guide的例子。

關於標籤的位置,您可以告訴現有的裝飾器將APPEND或PREPEND指向表單元素。

以下是關於如何操作現有裝飾器的幾個示例。

$element->removeDecorator('DtDdWrapper'); 

$descriptionDecorator = new Zend_Form_Decorator_Description(array('tag'=>'p','class' => 'description_submit')); 
$descriptionDecorator->setOption('placement','PREPEND'); 
$element->addDecorator($descriptionDecorator); 

還有一個現有Zend_Form_Decorator_Label類,但我沒有做好準備的例子。

+0

謝謝。看起來像這個裝飾器系統是非常複雜的,因爲HTML是如此簡單的工作。我想我將不得不經歷似乎是一個陡峭的學習曲線。 – Tom

+2

@Tom如果你只創建一個或兩個確實如此的表單。如果您創建了大量元素甚至多頁表單的幾十個表單,那麼這將爲您節省大量時間。更不用說過濾器和驗證器 –