2012-08-14 23 views
0

我有一個zend表單,我需要每個元素被顯示組包裝。然後我需要將一組元素包裝在另一個顯示組中。由於zend表單不支持嵌套顯示組,我改用子表單。Zend SubForm:如何禁用子窗體內部元素名稱的更改?

所以,我現在的結構是:

Form 
--- SubForm (1) 
--- --- DisplayGroup (1-1) 
--- --- --- Element (1) 
--- --- DisplayGroup (1-2) 
--- --- --- Element (2) 
--- SubForm (2) 
--- --- DisplayGroup (2-1) 
--- --- --- Element (3) 
--- --- DisplayGroup (2-2) 
--- --- --- Element (4) 

由此看來,然而,來自每個子窗體被設置爲父母到屬於它的每個元素的問題。這改變了元素的名稱f.e. name="username"變成name="subformname[username]"

由於我使用的子表單作爲顯示組的替代品,我不需要它的額外功能。

如何禁用此名稱更改?我正在使用自定義函數來「批量處理」每個元素(平凡的東西 - 刪除裝飾器,設置標籤等),所以我能夠強制setAttrib('name', $element -> getName()),但事實證明,這隻適用於常規表單元素。它不適用於像datepickers,colorpickers等ZendX表單元素。

+0

爲什麼你需要用顯示組來包裝每個元素? – 2012-08-14 14:19:36

+0

每個元素都應該從twitter引導CSS框架繼承span4或span6,以便出現在列中。更進一步,它應該在Zend_Form中,而不是在視圖 - 客戶端的要求。 – user1388771 2012-08-14 14:33:30

回答

0

從你說的評論你只使用顯示組給予元素一個twitter引導網格類。您不需要爲此使用顯示組,只需爲每個表單元素添加一個額外的HtmlTag裝飾器,或者將其添加到其中一個現有的類中。然後你可以使用顯示組對於其預期目的,爲您提供:

Form 
--- DisplayGroup (1) 
--- --- Element (1) 
--- --- Element (2) 
--- DisplayGroup (2) 
--- --- Element (3) 
--- --- Element (4) 

,如果您有任何問題,請編輯您的問題,包括正在修改現有的裝飾了你的「批量處理」的代碼,我們可以認爲它是如何可以修改。

編輯:獲取一個裝飾器來包裝標籤和表單元素的順序就是指定裝飾器的順序。以下是一個示例:

$element->addDecorator('ViewHelper') 
     ->addDecorator('Errors') 
     ->addDecorator('Description', array('tag' => 'p', 'class' => 'description')) 
     ->addDecorator('Label', array('optionalSuffix' => ':', 'requiredSuffix' => ':*')) 
     ->addDecorator(array('row' => 'HtmlTag'), array('tag' => 'div', 'class' => 'span4')); 

viewHelper裝飾器呈現表單元素本身。每個後續的裝飾器都被包裹在現有內容的「周圍」。到底如何渲染取決於裝飾器本身,但在上面的示例中,您會看到一個div標籤,類「span4」作爲最後的裝飾器,這意味着div將包裝其他所有內容。

+0

我曾嘗試使用HtmlTag裝飾器,但它僅應用於輸入元素,並且標籤留在包裝外。我需要一個包裝標籤和元素的裝飾器。如果您認爲我錯了HtmlTag的工作原理,請您舉一個有效的例子嗎? – user1388771 2012-08-14 14:49:38

+0

這只是裝飾者的順序。我用一個例子更新了我的答案。 – 2012-08-14 15:02:18

+0

我不知道訂單的重要性..應該更多關注。謝謝! – user1388771 2012-08-14 15:05:14

0

用於子表單元素名稱的數組表示法由Zend_Form::$_isArray控制。它是false in Zend_Form and true in Zend_Form_SubForm,它擴展爲Zend_Form

您可以在子表單上撥打setIsArray(FALSE),或在子表單中覆蓋Zend_Form::$_isArray,如果它延伸Zend_Form_SubForm