我有一张消息/电子邮件表,想要一个复选框来选择多条消息,并使用表格底部的按钮将其删除:
在没有使用框架的情况下使用标准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
将允许添加元素,替换MultiCheckbox
和MultiRadio
的需要,因为您可以遍历FormCollection并提取单个部分
有没有其他人做过这样的事情,你是怎么做到的?
正如我经常说的那样:框架使困难的事情变得容易,而事情变得容易。
答案 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)
您可以非常轻松地添加新项目:
有一个例子,使用一个简单的Javascript来添加新的行/项目。