Как настроить визуализацию коллекции ZF2 с соответствующим набором полей

Я создал стандартное приложение, использующее коллекции, чтобы сопоставить одно-много отношений (без использования 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, как указано в документации.

Однако, чего я хотел бы достичь, так это иметь список таблиц со всеми существующими атрибутами человека, с опцией редактирования / удаления и создать модальное окно с набором полей коллекции для добавления новых атрибутов к Человеку.

Представьте себе следующий 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 и добавить <input type="hidden"> теги, как ZF2 Collection ожидает их (например, attribute[0][attr1] и т.д.) в каждой строке, которую я добавляю в свою таблицу, и форма создается динамически, но я предполагаю, что мне не хватит в ZF2 InputFilters.

Есть ли лучший способ сделать это? Кто-нибудь делал это раньше?

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, а затем просто вставить это в ваш шаблон данных.

Другие вопросы по тегам