ZF2 - 表行中的复选框

时间:2013-08-05 22:48:09

标签: zend-framework2 zend-form2

我有一张消息/电子邮件表,想要一个复选框来选择多条消息,并使用表格底部的按钮将其删除:

Typical table

在没有使用框架的情况下使用标准PHP / HTML简单易行:

<input type="checkbox" name="ids[]" value="510">
<input type="checkbox" name="ids[]" value="1231">

然后在PHP中循环遍历已选择的ID数组。我正试图用ZF2实现同样的目标。

ZF2提供:

FormCollection - is a collection of Fieldsets, which I think is wrong for storing an array of IDs passed.
MultiCheckbox - with the current set of ViewHelpers cannot be extracted using an interator
Checkbox - involves dynamically adding inputs with the ID of the name, but can't be looped through and validated so easily.

如果FormCollection支持插入元素,我会说这是最好的选项,因为你可以动态添加它们并在POST时循环遍历它们。我想在不久的将来FormCollection将允许添加元素,替换MultiCheckboxMultiRadio的需要,因为您可以遍历FormCollection并提取单个部分

有没有其他人做过这样的事情,你是怎么做到的?

正如我经常说的那样:框架使困难的事情变得容易,而事情变得容易。

2 个答案:

答案 0 :(得分:3)

您是否尝试在控制器中生成表单?例如:

public function emailAction(){
    $emailList = $this->getEmailTable()->getEmails();

    $emailForm = new \Zend\Form\Form();
    $emailForm->setName('email_form');

    foreach($emailList as $email){
        $element = new \Zend\Form\Element\Checkbox($email->id);
        $emailForm->add($element);
    }

    return new ViewModel(array('form'=>$emailForm,'list'=>$emailList));
}

然后在视图中迭代列表以生成表并使用表单封装表。不要忘记创建删除选定的提交按钮。

<?php
    $form = $this->form;
    $form->setAttribute('action', $this->url('deleteEmail');
    $form->prepare();

    echo $this->form()->openTag($form);
?>
<table>
    <?php foreach($this->list as $item): ?>
        <tr>
            <td><?php echo $this->formElement($form->get($item->id));?></td>
            <td><?php echo $item->subject;?></td>
            <td><?php echo $item->receipt_date;?></td>
        </tr>
    <?php endforeach; ?>
</table>
<?php
    echo $this->formRow($form->get('submit'));
    echo $this->form()->closeTag();
?>

现在,当表单提交到deleteEmail操作时,您可以遍历表单元素,检查它们是否已被选中,然后将其删除。

public function deleteEmailAction(){
    $post = $request->getPost()->toArray();

    foreach($post as $key=>$value){
        if($value){
            $this->getEmailTable()->deleteEmail($key);
        }
    }
}

这被认为是psudocode并且可能需要一些调整才能开始工作,但希望它能让您了解如何为问题建模。可能不是最容易的。

答案 1 :(得分:1)

您可以非常轻松地添加新项目:

http://framework.zend.com/manual/2.2/en/modules/zend.form.collections.html#adding-new-elements-dynamically

有一个例子,使用一个简单的Javascript来添加新的行/项目。