2011-03-13 43 views
0

所以我使用zend框架,但對於所有商業項目,我不使用zend表單組件。 HTML + Js編碼器正在開發前端,我不想無所適從,我只是在基於zf的應用程序中連接最終視圖。Html編碼器+ zend表格

所以,比如我有鑑於HTML表單,看起來像這樣:

http://pastie.org/1668143

所以造型設計,元素和類可以通過前端編碼器來改變,我想知道是否有容易對我來說,用這個概念來使用zend表單(每個項目表單代碼看起來都不一樣)?

我這裏主要的問題是重複的代碼在我的控制器,在這種情況下看起來是這樣的:

http://pastie.org/1668023(請不要拿例外和loggedMember嚴重的是,他們只是用於這個片段,以證明一個問題,我有)

那麼,什麼是最好的解決方案,我有問題,你認爲什麼:)?

+0

你可以使你的Zend_Form,填充發布數據,並僅用於驗證和過濾。您不需要使用它來呈現表單的html。你有沒有考慮這個? – Marcin 2011-03-13 23:25:18

+0

你好,任何你可以編輯你的問題的機會,包括這些代碼片段?看起來像粘貼bin鏈接已過期!很高興知道代碼是什麼:) – 2012-04-29 13:11:15

回答

2

如果您完全不能控制表單的html結構,但仍想最大限度地使用Zend_Form的功能,請使用Zend_Form_Decorator_ViewScript。

http://framework.zend.com/manual/en/zend.form.standardDecorators.html(最後一節)

$element->setDecorators(array(array('ViewScript', array(
'viewScript' => '_element.phtml', 
'class'  => 'form element' 
)))); 

我會做這樣的:

  1. 創建具有的所有元素,驗證器和過濾器表單類
  2. 創建窗體的實例在你的動作和設置視圖腳本(這種方式,你可以改變它們,每個控制器,並仍然有很少重複的定義代碼。)
1

Splendid,我不明白爲什麼你會有代碼重複的問題,在你的第二個鏈接,你正在執行你的支票,然後檢查頁面是否是一個post請求,然後再次執行檢查,是它的重複,但我不明白你在做什麼解釋這是什麼?關於表單,它取決於你如何使用它,你可以創建表單對象,然後不用把表單傳出來,只需將它傳遞給設計器表單中的數據,然後用它來驗證事物。
或者您可以使用自定義模板作爲表單,好吧,這意味着您不會給設計師相當多的設計表單和排序結果的自由度,但他們仍然可以盡力做到最好。
這是我使用的設置,畢竟我負責編程人員的功能,設計師只是讓它看起來很好。

因此,舉例來說,如果我想創建一個輸入元素我可以:

$arrival_time = $this->createElement('text', 'arrival_time', array(
    'required' => true, 
    'label' => 'Arrival Time:', 
)); 
$arrival_time->removeDecorator('HtmlTag'); 
$this->addElement($arrival_time); 

通知我已經在這裏刪除HtmlTag裝飾 - 我不需要他們標記爲設計師們將安排事情對我來說。

接下來要做的是告訴窗體使用設計師所做的佈局:

$this->setDecorators(array(array('ViewScript', array('viewScript' => 'NewArrivalsForm.phtml')))); 

這裏我的模板是視圖的,腳本的目錄中。

現在設計師有幾個選擇。他們可以這樣做:

<table border="0" width="100%"> 
    <tr> 
     <td> 
      <?php echo $this->element->arrival_time; ?> 
     </td> 

這會給你以下的輸出:

<td> 
    <dt id="arrival_time"><label for="arrival_time" class="required">Arrival Time:</label></dt> 
    <input type="text" name="arrival_time" id="arrival_time" value="" />           
</td> 

如果我們是一個錯誤,那將是和呈現。你可以去除裝修「標籤」,「說明」 &「錯誤」,以及,使得它只是一個輸入框:

<td> 
    <input type="text" name="arrival_time" id="arrival_time" value="" /> 
</td> 

即使一旦你已經刪除了裝飾,設計者例如可以仍然使用:

<tr> 
    <td> 
     <?php echo $this->element->time_on_site->getLabel(); ?> 
    </td> 
</tr> 
<tr> 
    <td> 
     <?php echo $this->element->time_on_site ?> 
</td> 

這將允許他們完全按照自己的意願佈置表格。但它仍然允許您使用Zend_Form的全部功能進行最終驗證檢查。查看Zend/form/element.php,瞭解您和您的設計人員可以在表單元素上使用的所有方法。