2011-08-04 7 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; 
    } 
} 

さらに詳しい説明が必要な場合は、私に知らせてください。私はこれをかなり早くやりました。

EDIT

私は同じとZendのビューヘルパーを上書きするだけだった別のディレクトリに置かれ、それを名付けた理由。同じ名前をつけて自分のヘルパーパスを追加することで:

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

私のカスタムビューヘルパーがZendのヘルパーより優先されます。これにより、Zendのヘルパーを使用していたフォーム、要素、またはビューを変更せずにテストすることができました。基本的に、それはZendのビューヘルパーの1つを自分のものに置き換える方法です。

あなたのニーズに合わせてヘルパーの名前を変更する可能性があると想定していたため、カスタムビューヘルパーを追加してフォーム要素に追加する際の注釈を述べたのは、

+0

私はカスタムフォーム要素を作成する(ヘルパーを表示する)方法を知っていますが、正確に何を意味するのか分かりません。このビューヘルパーは、すでに存在するzendフォームのmulticheckbox要素と同じ名前です。これはどうやって動くのだろう? – Andrew

+0

私の質問を編集して、どのように動作するかを説明しました。 –

+0

私は今理解しています。あなたは意図的にZFデフォルトを上書きしていました。 – Andrew

関連する問題