表单构建器中的关联数组字段

我们先从背景开始。

我需要用户配置文件,它具有名称,电子邮件,电话等基本信息。为此我有一个实体用户。

我还需要存储问卷的答案。 我想在文本字段中将它们作为json存储在数据库中。 这些问题可能会在将来发生变化,目前约有30个问题,因此我不想将其作为实体存储。 所以目前在我的用户实体中,我有这样的:

/**
 * @var array
 *
 * @ORMColumn(name="questionnaire", type="json_array", nullable=true)
 */
private $questionnaire;

我明白,Symfony会照顾json_encode / json_decode的事情。 所以这很好。

但是现在,我在使用symfony构建器创建表单时遇到了一些问题。

首先,我想我可以尝试这样的事情:

$builder->add('questionnaire[source]');

哪个不行。 对于symfony大师来说,我很清楚; o)

所以目前我看到的选择是:CollectionType或数据变形金刚。

从我看到的情况来看,CollectionType将不起作用,因为它只适用于数值数组,我们有一些JS字段“添加另一行”或其他内容。 http://symfony.com/doc/current/reference/forms/types/collection.html#adding-and-removing-items但如果我错了,我应该用CollectionType,并有一些神奇的方式,请告诉我。 我找不到太多这方面的信息。

所以我在想数据变形金刚或者只是在没有这个变形金刚的东西的情况下创建一个数组。 使用“mapped => false”创建调查问卷中的所有字段,然后将这些提交的值作为关联数组设置为$调查问卷。 这“感觉”确定,但我不确定如何在“编辑”表单中处理此问题(从我认为使用此文档的http://symfony.com/doc/current/reference/forms/types/form.html #数据)。

调查问卷本身会有很多ChoiceType字段,一个带有“添加更多行”的CollectionType等等,并且会有很多问题。 所以它会有点复杂。 我想避免为每个问题创建一个实体作为一个属性(不确定它是否是一个正确的选择,但是考虑一切我认为它是最好的)。

这是我与symfony的第一次约会,所以任何帮助/提示都很赞赏。


几天后,我为自己的问题找到了答案。 赏金并没有帮助它更快,但嘿,有一个解决方案! ; O)

原来这很简单。 实际上,我没有在这个特殊问题上发现很多,所以如果你需要类似的东西,那么就是这样。

在具有此json_array的实体类中,定义所有需要的键,如下所示:

/**
 * @var array
 *
 * @ORMColumn(name="questionnaire", type="json_array", nullable=true)
 */
private $questionnaire = [
    'favPet'=>'',
    'favFood'=>'',
    'favColor'=>''
];

接下来,在表单生成器中使用“property_path”! 就这么简单... https://symfony.com/doc/current/reference/forms/types/form.html#property-path像这样:

/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name')
        ->add('email', EmailType::class)
        ->add('phone')
        ->add('address')
         ->add('favPet',TextType::class,[
            'label'=>'Fav pet',
            'property_path'=>'questionnaire[favPet]'
        ])
        ->add('favFood',TextType::class,[
            'label'=>'Fav food',
            'property_path'=>'questionnaire[favFood]'
        ])
        ->add('favColor',TextType::class,[
            'label'=>'Fav color',
            'property_path'=>'questionnaire[favColor]'
        ])
    ;
}

而symfony将处理剩下的事情。 因为我们使用json_array作为类型,所以symfony将处理json_encode / json_decode。 为了让symfony在编辑模式下映射/填充值,属性必须定义键值。 否则,你会收到错误:

PropertyAccessor需要一个对象或数组的图来操作,但它在尝试遍历路径时发现类型为“NULL”

然后在树枝模板中,你可以这样做:

{{ user.questionnaire.favPet }}

就是这样! :O))

至于JSON或实体。 我知道我没有写实体,但我没有下定决心。 在一些IRC对话之后,阅读和这个https://stackoverflow.com/a/4013207/531099我可能会使用EAV。 因此,如果您决定使用JSON还是Entity,请将EAV添加到比赛中。


我与Sylius有类似的问题:实体有一个名为“配置”的数组字段,该字段可能是应用程序期望的格式,如下所示:

['configuration' =>   
        ['filters' =>   
            ['taxons' =>   
                ['frg', 'books']   
            ]   
        ]   
     ];

我设法坚持像使用嵌套窗体所要求的那样格式化一个关联数组:

表单类层次结构是这样的:

  • PercentageDiscountConfigurationType - 用于配置
  • ActionFiltersType - 用于过滤器
  • TaxonFilterType - 用于分类
  • 您可以在这里看到具有类似功能的PR:https://github.com/Sylius/Sylius/pull/6054/files

    链接地址: http://www.djcxy.com/p/91951.html

    上一篇: Associative array fields in form builder

    下一篇: RxJava with Presenter and retained fragment for configuration changes