【问题标题】:Symfony Form Collection of Custom Types自定义类型的 Symfony 表单集合
【发布时间】:2018-07-14 19:13:35
【问题描述】:

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

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

[
    [
        '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,
                ]
            ]
        )

但我只收到“在呈现模板期间引发异常(“注意:数组到字符串的转换”)。”错误信息。 我错过了什么? 表单内的结构有效(我将其手动添加到数据库并在加载实体时检查它)。实体按预期工作(包括数据结构)。 但 symphony 确实按预期呈现。

【问题讨论】:

    标签: php symfony-forms symfony4


    【解决方案1】:

    您报告的错误可能仅与您的渲染策略有关,与您在上面定义的表单无关 - 它们看起来不错。

    <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!

    【讨论】:

    • 感谢您的帮助。我现在通过添加一个额外的实体以不同的方式解决了它。对于数组表单字段和子表单,它没有按预期工作。所以我不得不切换到实体版本,效果很好。我还在我有电子邮件的其他条目中重复使用电子邮件部分,因此我可以将所有电子邮件存储在一个中心位置
    • 太好了,@ChrisWest!对于任何来到此页面并遇到类似问题的未来读者来说,在单独的答案中看到您的替代方法会很有趣
    猜你喜欢
    • 2013-01-29
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多