Коллекция Zend-Form не генерирует правильное имя
В настоящее время я работаю с Zend-Expressive, и теперь я хотел бы использовать Zend-Form для создания формы. Все установлено правильно. Теперь у меня есть следующие настройки:
<?php
use Zend\Filter;
use Zend\Form\Element;
use Zend\Form\Form;
use Zend\ServiceManager\Exception;
use Zend\Validator;
class CategoryForm extends Form
{
public function __construct($features = [])
{
parent::__construct('category');
$this->add([
'name' => 'id',
'type' => Element\Hidden::class,
]);
$this->add([
'name' => 'name',
'type' => Element\Text::class,
'options' => [
'label' => 'Name',
],
]);
$this->add([
'name' => 'features',
'type' => Element\Collection::class,
'options' => [
'label' => 'Features',
'target_element' => new Element\Select('feature', $features),
],
]);
}
}
В моем шаблоне (Twig) у меня есть следующий фрагмент:
{{ form().openTag(form)|raw }}
{{ formElement(form.get('id')) }}
{% set element = form.get('name') %}
<div>
{{ formLabel(element) }}
<div>
{{ formElement(element) }}
</div>
</div>
{% set collection = form.get('features') %}
{{ formLabel(collection) }}
{% for element in collection %}
<div>
{{ formSelect(element) }}
</div>
{% endfor %}
{{ form().closeTag(form)|raw }}
Это отображает форму красиво. Теперь моя проблема. Если я пытаюсь редактировать категорию, я заполняю форму следующим образом:
$formData = [
'id' => $category->getId(),
'name' => $category->getName(),
'features' => [
2,
3,
],
];
$this->categoryForm->setData($formData);
Но теперь форма генерирует следующий фрагмент:
<form action="" method="POST" name="category">
<input name="id" value="2" type="hidden">
<div>
<label>Name</label>
<div>
<input name="name" value="Foo" type="text">
</div>
</div>
<label>Features</label>
<div>
<select name="features[0]">
<option value="1">A</option>
<option value="2" selected>B</option>
<option value="3">C</option>
</select>
</div>
<div>
<select name="1"> <!-- The name is wrong here -->
<option value="1">A</option>
<option value="2">B</option>
<option value="3" selected>C</option>
</select>
</div>
</form>
Как видите, второй элемент select имеет неправильное имя. Все остальное прекрасно работает, но имя поколения. Я не знаю, что я что-то пропустил. Я действительно пытался найти помощь на других сайтах, но ничего не решило проблему. Может быть, вы видите мою ошибку и можете помочь мне закончить с этой формой.
Заранее большое спасибо.
1 ответ
Хорошо, после нескольких часов отладки я обнаружил, что я использовал приготовить () слишком рано. Теперь я готовлю форму после того, как использовал setData, и все работает нормально.