【问题标题】:Symfony form to create a collection of entities sharing inputsSymfony 表单创建共享输入的实体集合
【发布时间】:2017-03-23 20:20:14
【问题描述】:

我需要制作一个表单来创建同一实体的集合,但我不想为集合的每个条目重复所有字段(只有具有不同值的字段)。

想象一个Product 实体:

class Product
{
    private $category;
    private $name;
    private $price;
}

我想要一个表单来同时创建同一个category 的多个Product 实体。 所以表单应该有一个category 字段,以及nameprice 的集合。

我的表单看起来像:

class ProductCollectionType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('category')
            ->add('products', CollectionType::class, array(
                'entry_type' => ProductType::class,
                'allow_add'  => true,
                'mapped'     => false,
            ))
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Product::class,
        ));
    }
}

class ProductType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('price')
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Product::class,
        ));
    }
}

有谁知道是否有一种方法可以用父字段自动填充集合类型中的所有实体? (本例中仅category

谢谢!

【问题讨论】:

    标签: symfony symfony-forms symfony-3.2


    【解决方案1】:

    我会通过为产品提供不需要类别成员值的表单来解决这个问题。然后创建一个未映射的字段来接收类别值。提交后回到控制器中,将未映射的类别值应用于每个 Product 实体,然后处理/持久化/等。

    查看Symfony Forms page,搜索“mapped”,您将了解如何将未映射的字段添加到表单。

    【讨论】:

    • 这是我提供的一个非常基本的示例,但在我的实际用例中,这不仅涉及一个字段,而且我想利用我对所有字段的实体施加的约束。我希望 symfony 为这个用例提供了一些东西。
    • 您可以实例化一个额外的产品并使其表单只需要类别字段。现在您获得了 Product::category 的所有约束,如 Doctrine、Symfony 表单等。“为一组对象使用一个表单域”是一个相当不受欢迎的用例。尽你所能,但你必须期待妥协和一些额外的工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多