zend-form集合不会生成正确的名称

时间:2016-08-26 09:35:02

标签: zend-form zend-form-select zend-expressive zend-form-collection

我目前正在使用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>

如您所见,第二个选择元素的名称错误。其他一切都很好,但名字一代。我不知道我是否想念一些东西。我真的试图在其他网站上找到一些帮助,但没有解决问题。也许你看到我的错误,可以帮助我完成这个表格。

提前多多谢谢。

1 个答案:

答案 0 :(得分:1)

好的,经过几个小时的调试后,我发现,我过早地使用了prepare()。现在我在使用setData之后准备好表单,一切正常。