Zend_Form_Element Multi Checkbox:如何以列的形式显示一长串复选框?

时间:2011-08-04 16:05:37

标签: zend-framework

所以我使用Zend_Form_Element_MultiCheckbox来显示一长串复选框。如果我只是echo元素,我会得到许多由<br />标记分隔的复选框。我想找出一种方法来利用Zend_Form_Element_MultiCheckbox的简单性,但也显示为多列(即<div style="float:left">中的10个复选框)。如果我有一个单一的复选框元素数组,我可以手动完成,但它不是最干净的解决方案:

<?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 个答案:

答案 0 :(得分: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的一个视图助手。

我之所以提到有关添加自定义视图助手并添加到表单元素的说明是因为我认为您可能会重命名帮助程序以更好地满足您的需求。