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