Коллекция 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, и все работает нормально.

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