2011-08-04 19 views
3

所以我使用Zend_Form_Element_MultiCheckbox來顯示一長串複選框。如果我只是echo的元素,我會得到很多用<br />標籤分隔的複選框。我想找出一種方法來利用簡單的Zend_Form_Element_MultiCheckbox,但也顯示爲多列(即<div style="float:left">中的10個複選框)。我可以做手工,如果我有一個複選框元素的數組,但它不是最乾淨的解決方案:Zend_Form_Element_MultiCheckbox:如何顯示一長列複選框爲列?

<?php 
    if (count($checkboxes) > 5) { 
     $columns = array_chunk($checkboxes, count($checkboxes)/2); //two columns 
    } else { 
     $columns = array($checkboxes); 
    } 
?> 

<div id="checkboxes"> 
    <?php foreach ($columns as $columnOfCheckboxes): ?> 

     <div style="float:left;"> 

      <?php foreach($columnOfCheckboxes as $checkbox): ?> 
       <?php echo $checkbox ?> <?php echo $checkbox->getLabel() ?><br /> 
      <?php endforeach; ?> 

     </div> 

    <?php endforeach; ?> 
</div> 

我怎麼能這樣做同樣的事情,並仍然使用Zend_Form_Element_MultiCheckbox

回答

1

最好的地方是使用視圖幫助器。我很快就想到了你可以做的事情。你可以在你的視圖中使用這個腳本將它附加到Zend_Form_Element。

我打算假設你知道如何使用自定義視圖助手以及如何將它們添加到表單元素中。

class My_View_Helper_FormMultiCheckbox extends Zend_View_Helper_FormMultiCheckbox 
{ 
    public function formMultiCheckbox($name, $value = null, $attribs = null, 
     $options = null, $listsep = "<br />\n") 
    { 
     // zend_form_element attrib has higher precedence 
     if (isset($attribs['listsep'])) { 
      $listsep = $attribs['listsep']; 
     } 

     // Store original separator for later if changed 
     $origSep = $listsep; 

     // Don't allow whitespace as a seperator 
     $listsep = trim($listsep); 

     // Force a separator if empty 
     if (empty($listsep)) { 
      $listsep = $attribs['listsep'] = "<br />\n"; 
     } 

     $string = $this->formRadio($name, $value, $attribs, $options, $listsep); 
     $checkboxes = explode($listsep, $string); 

     $html = ''; 
     // Your code 
     if (count($checkboxes) > 5) { 
      $columns = array_chunk($checkboxes, count($checkboxes)/2); //two columns 
     } else { 
      $columns = array($checkboxes); 
     } 

     foreach ($columns as $columnOfCheckboxes) { 
      $html .= '<div style="float:left;">'; 

      $html .= implode($origSep, $columnOfCheckboxes); 

      $html .= '</div>'; 
     } 

     return $html; 
    } 
} 

如果您需要進一步解釋,請告訴我。我很快就做到了這一點。

編輯

我把它命名爲相同,並放置在不同的目錄,只是爲了覆蓋Zend的視圖助手的原因。通過命名它和添加我的幫手路徑:

$view->addHelperPath('My/View/Helper', 'My_View_Helper'); 

我的自定義視圖助手優先於Zend的助手。這樣做可以讓我在不改變任何使用Zend助手的形式,元素或視圖的情況下進行測試。基本上,這就是你用你自己的一個替換Zend的一個視圖助手的方法。

我之所以提到關於添加自定義視圖助手和添加到表單元素的註釋,只是因爲我認爲您可能會重命名助手以更好地滿足您的需求。

+0

我知道如何創建自定義表單元素(和視圖助手),但我不明白你的意思。您已將此視圖助手命名爲已有的zend表單multicheckbox元素。這應該如何工作? – Andrew

+0

我編輯了我的問題來解釋它是如何工作的。 –

+0

我現在明白了。你故意重寫ZF默認值。 – Andrew