自定义类型的Symfony表单集合

时间:2018-07-14 19:13:36

标签: php symfony-forms symfony4

我遇到了一个问题,到目前为止我没有找到真正的解决方案。 这是我需要的:

我的学说模型中有一个数组字段,应该存储以下信息:

[
    [
        'name'=>'John Doe',
        'email'=>'john@doe.com',
    ],
    [
        'name'=>'Jake Doe',
        'email'=>'jake@doe.com',
    ],
]

我在代码中添加了以下类型:

    <?php
    declare(strict_types=1);

    namespace App\Form\Component;

    use Symfony\Component\Config\Definition\Builder\BuilderAwareInterface;
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\Extension\Core\Type\TextType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolver;


    /**
     * Class EmailType
     * @package MjrOne\Form\Component
     */
    class EmailType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder->add(
                'name',
                TextType::class,
                [
                    'required'=>true,
                ]
            )->add(
                'email',
                TextType::class,
                [
                    'required'=>true,
                ]
            );
        }
    }

我在代码中添加了以下构建表单:

        ->add(
            'toReceiver',
            CollectionType::class,
            [
                'entry_type'=>EmailType::class,
                'allow_add'=>true,
                'allow_delete'=>true,
                'by_reference' => false,
                'prototype' => true,
                'entry_options'=>[
                    'required'=>true,
                ]
            ]
        )

但是我只收到一个“在呈现模板期间引发了异常(“注意:数组到字符串的转换”)。错误信息。 我错过了什么? 表单内部的结构有效(我将其手动添加到数据库中,并在加载实体时对其进行了检查)。实体按预期工作(包括数据结构)。 但是交响乐确实可以按预期方式呈现。

1 个答案:

答案 0 :(得分:0)

您报告的错误很可能仅与您的呈现策略有关,而与您上面定义的表单无关,它们看起来很合理。

<ul data-prototype="{{ form_widget(form.toReceiver.vars.prototype)|e('html_attr') }}">
    {% for receiver in form.toReceiver %}
        {{ form_widget(receiver) }}
    {% endfor %}
</ul>

这会将每个集合项视为其自己的小部件,并将用于呈现新集合的原型放入容器的属性中。 (您可以使用JS处理创建/删除操作,如this Form Collections guide on the official Symfony docs!中所述)