如何使用匹配的fieldset自定义呈现ZF2 Collection

时间:2013-09-28 00:13:28

标签: php zend-framework zend-framework2

我创建了一个标准应用程序,使用集合来映射一对多关系(不使用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。

有没有更好的方法来实现这一目标?有人做过吗?

1 个答案:

答案 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,然后将其粘贴到数据模板中。