我创建了一个标准应用程序,使用集合来映射一对多关系(不使用Doctrine),就像在http://framework.zend.com/manual/2.2/en/modules/zend.form.collections.html中描述的那样,我有类似下面的代码:
class Person {
protected $attrributes;
}
class Attribute {
protected $attr1;
protected $attr2;
}
我已经创建了AttributeFieldset
和匹配的AttributeForm
,我在AttributeFieldset
添加了PersonForm
:
$this->add(
array(
'type' => 'Zend\Form\Element\Collection',
'name' => 'attributes',
'options' => array(
'label' => _("Add person attribute"),
'count' => 1,
'should_create_template' => true,
'allow_add' => true,
'target_element' => array(
'type' => 'Persons\Form\AttributesFormFieldset'
)
)
));
调用$this->formCollection()
视图帮助程序将生成集合的默认HTML和数据模板,以通过文档中指定的javascript动态添加新属性。
然而,我想要完成的是拥有一个包含人员所有现有属性的表格列表,并带有编辑/删除选项,并创建一个带有集合字段集的模态窗口,以向Person添加新属性。
想象一下以下的html:
<a href="#" onclick="add(this); return false;">Add new attribute</a>
<table>
<? foreach( $this->person->attributes as $attribute ): ?>
<tr>
<td><?= $attribute['attr1']; ?></td>
<td>
<a href="#" onclick="edit(this); return false">Edit</a> | <a href="#" onclick="delete(this); return false">Delete</a>
</td>
</tr>
<? endforeach; ?>
</table>
我知道我可以完全跳过formCollection并按照ZF2 Collection期望它们的方式添加<input type="hidden">
标签(例如attribute[0][attr1]
等)我添加到表中的每一行并且动态创建表单但是我猜我会错过ZF2 InputFilters。
有没有更好的方法来实现这一目标?有人做过吗?
答案 0 :(得分:1)
使用集合并要求自定义标记很烦人。但这并不困难:
$collections = $form->get('collection-element');
echo '<table>'
// render thead and tbody open if needed
foreach ($collections as $col) : ?>
<tr>
<td><?php echo $this->formInput($col->get('input-from-collection-name'); ?></td>
<td><?php echo $this->formInput($col->get('other-input-from-collection-name'); ?></td>
</tr>
<?php endforeach;
echo '</table>';
就这么简单。这很烦人。此外,通过配置中的默认示例:为其他元素添加template
的最简单方法是只渲染表单一次,然后复制生成的HTML,然后将其粘贴到数据模板中。