php – 表单构建器中的关联数组字段 – Symfony3
让我们从背景开始.
我需要具有基本信息的用户个人资料,如姓名,电子邮件,电话等.为此,我有一个实体用户. 我还需要存储调查问卷的答案.我想将它们作为文本字段中的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或Data Transformers. 从我看到的,CollectionType将无法工作,因为它只适用于数字数组,其中我们有一些JS“添加另一行”或其他东西. http://symfony.com/doc/current/reference/forms/types/collection.html#adding-and-removing-items但如果我对此错了,我应该选择CollectionType,有一些神奇的方法请告诉我.我找不到这个. 所以我在考虑使用Data Transformers或者只是在没有这个Transformer的情况下在提交时创建一个数组.使用“mapped => false”创建问卷调查中的所有字段,然后将这些提交的值设置为$questionnaire的关联数组.这“感觉”还不错,但我不确定如何在“编辑”表单中处理这个问题(从我用0700这个文档来看). 调查问卷本身将有许多ChoiceType字段,CollectionType与“添加更多行”等等,它将有很多问题.所以它会有点复杂.我想避免为每个问题作为一个属性创建实体(不确定它是否是一个正确的选择,但考虑到我相信它是最好的一切). 这是我与symfony的第一次约会,所以任何帮助/小贴士都会欣赏.
几天后,我找到了自己问题的答案.赏金并没有帮助它更快,但嘿,有一个解决方案! ; O)
事实证明它非常简单.我实际上并没有在这个特定问题上找到很多东西,所以如果你需要类似的东西,这里就是. 在具有此json_array的实体类中,定义所有需要的键,如下所示: /** * @var array * * @ORMColumn(name="questionnaire",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',[ 'label'=>'Fav food','property_path'=>'questionnaire[favFood]' ]) ->add('favColor',[ 'label'=>'Fav color','property_path'=>'questionnaire[favColor]' ]) ; } 而symfony将处理剩下的事情.因为我们使用json_array作为类型,symfony将处理json_encode / json_decode事物.为了让symfony在编辑模式下映射/填充值,属性必须定义它的键.否则你会收到错误:
然后在twig模板中你可以这样做: {{ user.questionnaire.favPet }} 就是这样! :O)) 至于JSON或实体.我知道我没有写任何实体,但我没有下定决心.经过一些IRC对话,阅读和https://stackoverflow.com/a/4013207/531099我可能会选择EAV.因此,如果您在JSON与实体之间做出决定,请将EAV添加到比赛中. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |