【问题标题】:ZF2 - Checkboxes in table rowsZF2 - 表格行中的复选框
【发布时间】:2013-08-05 22:48:09
【问题描述】:

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

在不使用框架的情况下使用标准 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 将允许添加元素,取代对MultiCheckboxMultiRadio 的需求,因为您可以遍历 FormCollection 并提取各个部分

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

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

【问题讨论】:

  • 我正在尝试做同样的事情。你有没有想出一个 Zend 方法来做到这一点?我确定CollectionsMultiSelect 缺少一些东西!如果我不同意@crushedGrass 的建议...
  • 我不相信这是目前可能的 Zend 方式。集合只能包含字段集而不是单个元素。最后,我只是遍历视图中的一个数组,手动打印元素

标签: zend-framework2 zend-form2


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-01-22
      • 2020-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多