2

我有一个消息/电子邮件表,并希望有一个复选框来选择多条消息并使用表格底部的按钮删除它们:

典型表

使用标准 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支持插入元素,我会说这是最好的选择,因为您可以动态添加它们并在发布时循环它们。我想在不久的将来FormCollection将允许添加元素,取代对 FormCollection 的需要,MultiCheckbox并且MultiRadio您可以遍历 FormCollection 并提取各个部分

有没有其他人做过类似的事情,你是怎么做的?

正如我常说的:框架让困难的事情变得简单,让简单的事情变得困难。

4

2 回答 2

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);
        }
    }
}

这被认为是伪代码,可能需要一些调整才能开始工作,但希望它能让您了解如何为问题建模。可能不是最简单的。

于 2013-08-06T21:46:06.410 回答
1

您可以很容易地添加新项目:

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

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

于 2013-08-06T08:31:21.557 回答