我正在寻找一种将实体绑定到表单的方法,但是我需要一个特定的字段来映射(显示),而不是由提交表单的用户修改。
到目前为止,我查到的是:
我的字段是一个复选框,但是我更喜欢这类字段的通用解决方案,因为将来我会有更多的这样的字段。
我也想避免额外的查询。
有什么想法吗?
发布于 2016-11-25 01:50:50
第一、第三种解决方案不是很好。
不久前我也有过同样的问题。这就是我为解决这个问题所做的
我使用了第二个解决方案,并且由于您在应用程序中有了实体,所以您可以简单地通过操作HTML来覆盖用户更改的任何值(whitch是一个应该处理的风险)。
或者,您可以绘制一个未映射的HTML复选框(带有随机id和名称),并且它不会映射到您的实体。
发布于 2016-11-25 02:44:11
我想我已经找到了解决这个问题的正确办法。它不是很灵活,但是将它转换为扩展应该会使它相当容易处理。我刚才创建的基本版本可以找到这里。一个小小的解释:
mapped
设置为false
的字段PRE_SET_DATA确保字段在最初呈现表单时具有正确的值。SUBMIT确保将字段的值恢复到初始值,即使用户在提交表单之前对其进行了更改。
对于UI/UX,禁用和只读属性都在这里,如果没有这些属性,它也能工作。
如果需要的话,可以随意使用它来构建表单扩展。一旦需要,我可能会构建一个扩展,以使其稍后更加灵活。
@编辑
我刚刚意识到这可以做的更容易-让字段映射!已更新要点在这里。不需要PRE_SET_DATA侦听器和mapped=false
发布于 2016-11-25 02:05:08
我建议你做一个1和2的组合。样本见下文
->add('trainings', 'entity', array(
'label'=> 'Upcoming training(s)',
'choice_label' => 'CompleteTitle',
'multiple' => 'true',
'expanded' => 'true',
'by_reference'=>false,
'class' => 'TrainingBundle:Trainings' ,
'query_builder' => function (EntityRepository $er) use ($options) {
return $er->getTrainingByParentId($options['parent_id']);
},
)
)
->add('PastTrainings', 'entity', array(
'label'=> 'Past trainings',
'choice_label' => 'CompleteTitle',
'multiple' => 'true','expanded' => 'false',
'disabled' => 'true',
'class' => 'TrainingBundle:Training' ,'mapped'=>false,
'query_builder' => function (EntityRepository $er) use ($options) {
return $er->getTrainingByParentId($options['parent_id']);
},
)
https://stackoverflow.com/questions/40801680
复制相似问题