2011-06-03 29 views
3

我使用Zend_form(Zend Framwork的一部分)創建一個表單,並在使用Zend_Form的多元框元素(Zend_Form_Element_MultiCheckbox)添加一組複選框時輸出如下代碼:zend form for multicheckbox從標籤中刪除輸入

<label for="subjects-maths"> 
    <input type="checkbox" value="maths" id="subjects-maths" name="subjects[]"> 
    Maths 
</label> 
<label for="subjects-english"> 
    <input type="checkbox" value="maths" id="subjects-english" name="subjects[]"> 
    English  
</label> 

iee輸入在標籤內。儘管代碼在技術上是可行的,但就W3c的看法而言,這是違背良好做法的,並且也不是我想要的方式,因爲它使得樣式更難。我想是這樣的:

<div> 
    <label for="subjects-maths">   
     Maths 
    </label> 
    <input type="checkbox" value="maths" id="subjects-maths" name="subjects[]"> 
</div> 
<div> 
    <label for="subjects-english">    
     English  
    </label> 
    <input type="checkbox" value="maths" id="subjects-english" name="subjects[]"> 
</div> 

因此如何移動的複選框輸入了標籤,如何包圍的div每個選項。我在互聯網上查看了所謂解決方案的許多頁面,但沒有一個適用於多個複選框,因爲它只針對周圍的標籤(即本例中將說明主題的標籤)而不是實際的選項標籤和輸入。

請幫忙。

感謝 保羅

回答

3

看來最好的解決方案是基於松鼠上面的答案。由於標籤內部的輸入是硬編碼,所以最好的解決方案是改變這種行爲。您可以通過修改Zend_View_Helper_FormRadio類或使用您自己的自定義視圖頭來覆蓋它。我建議自定義標題選項作爲修改zend框架將是一個壞主意,因爲它需要更新每次你更新框架,對任何人或使用該框架副本的任何項目的影響等。通過使用自定義幫手它將專門針對該項目,它不會影響其他任何內容,也不會受到更新框架的影響(但是如果框架更新已經改變了某些行爲,您可能會發現需要更新幫助程序)。我做的很好的是:

1 - 在庫中創建了一個模型/模塊,我打電話給我的網站。首先涉及在庫中創建一個與模型名稱相同的文件夾。因此,我有庫>網站

編輯:忘了說你需要通過bootstrap或application.ini註冊插件庫。我發現這是最簡單的只需要添加:

autoloaderNamespaces [] = 「Website_」

下的任意位置appnamespace

2 - 我創建的類Website_View_Helper_FormRadio這將覆蓋Zend_View_Helper_FormRadio相關的子文件夾和文件。因此,文件夾和文件stucture是

網站>視圖>助手> FormRadio.php

3 - 然後我複製從Zend_View_Helper_FormRadio的formRadio功能的內容到Website_View_Helper_FormRadio類內。

class Website_View_Helper_FormRadio extends Zend_View_Helper_FormRadio 
{ 
    public function formRadio($name, $value = null, $attribs = null, $options = null, $listsep = "<br />\n") 
    { 

      // The code from the formRadio function in Zend_View_Helper_FormRadio with 
      // the modification from the code squirrel referred to 

    } 
} 

這就爲我們提供了我們自己的類的副本與我們修改後的代碼是從的zend的版本繼承:然後我跟松鼠簡稱從而從Zend_View_Helper_FormRadio繼承像這樣的Website_View_Helper_FormRadio類的代碼修改了它FormRadio元素。

現在,您可以只使用Zend形式的無線電元件像正常的,如果你想對MultiCheckbox同樣的效果或複選框,你需要讓這些使用我們的形式的無線電的版本,它會用我們的改進

注因爲這些元素使用形式廣播作爲基礎。要做到這一點,我們在我們的庫中創建我們自己的版本,並使它們繼承我們的版本。因此,我們將有multicheckbox如下:

庫>網站>視圖>助手> FormMultiCheckbox.php

將Zend_View_Helper_FormMultiCheckbox

副本

,然後更換行:

class Zend_View_Helper_FormMultiCheckbox extends Zend_View_Helper_FormRadio 

與:

class Website_View_Helper_FormMultiCheckbox extends Website_View_Helper_FormRadio 

我希望臨時t幫助某人。

-1

我想你需要刪除裝飾標籤,並創建自己的裝飾它會像標籤裝飾,但使用DIV和標籤標記在一起,因爲你需要

+0

嘗試這樣做,這是行不通的 – AdrenalineJunky 2011-06-06 10:52:42

+0

不起作用,因爲multiCheckBox是一個包含多個複選框的複雜元素。這些複選框裝飾器是硬編碼的。 – LittleBigDev 2012-10-05 00:25:02

4

的裝飾Zend_Form_Decorator_ViewHelper是使用默認查看幫助程序Zend_View_Helper_FormMultiCheckbox以呈現您的multicheckbox元素。該視圖助手從Zend_View_Helper_FormRadio延伸出來,由於某種原因,該代碼被硬編碼以在<input>標籤周圍放置<label>標籤。

您需要編寫自己的視圖助手,該視圖助手複製Zend_View_Helper_FormRadio::formRadio()中的大部分代碼,但是在元素周圍寫入了HTML而沒有<label>標籤。 Here's a snippet從另一個顯示您可能想要修改的答案。

您的自定義助手應該命名爲Some_Prefix_Helper_FormMultiCheckbox但 不知道你的應用程序是如何組織的,很難說究竟是什麼Some_Prefix應該還是你將如何確保,而不是加載它的Zend_View_Helper_FormMultiCheckbox。查閱有關loading plugins的文檔以獲取一些提示。

+0

硬編碼的原因在於,如果有多個多選項,它會非常緩慢(如果是動態的)。 (我們在我們的Intranet應用程序中有250多個選項,並且無法降低該數量 - 在繁忙時間內,ajax負載會消除服務器請求限制) – 2011-06-03 23:27:35

+0

自定義幫助程序似乎有意義,但不知道如何使其工作。自定義助手是否需要完全替換Zend_View_Helper_FormRadio中的所有內容或者只是執行html輸出的位?另外我將如何註冊自定義幫手?我試圖在application.ini中註冊它,但它忽略了它,但不確定正確的代碼是什麼。 – AdrenalineJunky 2011-06-06 10:50:22

3

以下是有關multiCheckBox渲染定製一些其它附加信息,

我想要的複選框標籤前插,而不是追加(此默認行爲是硬編碼)。由於ZF的參考指南並非如此,所以我終於進入了核心代碼,想出如何定製它。看看Zend_View_Helper_FormRadio::formRadio()瞭解更多信息。

可以通過修改複選框裝飾器multiCheckBox選項:添加一些前綴爲label_的選項。

這裏是我的表單元素:

$this->addElement('multiCheckbox', 'stars_number', array(
    'filters'   => array('Int'), 
    'escape'   => false,  // to allow html in the labels 
    'separator'  => '',   // to keep everything inline 
    'label_placement' => 'prepend', 
    'label_class'  => 'stars',  // custom css needed 
    'decorators'  => $decorator_chain, // decorators array defined upper, and passed to many elements of the form 
)); 

我希望這將幫助一些保存不成功谷歌的抓取時間...