禁用EntityType的Symfony选项

时间:2019-04-24 15:47:50

标签: forms symfony

假设我有一个与实体competence相关的ManyToMany实体location。此外,users只能访问一个位置。

现在想象以下情形:能力FirstHelp与位置BerlinMunich有关。用户Bob有权访问位置BerlinBob现在要编辑FirstHelp。应该允许他删除或添加FirstHelpBerlin之间的关系,但不允许允许他触摸关系FirstHelp <=> {{1 }}。还应该 不允许他添加其他关系,例如Munich <=> FirstHelp

到目前为止,我有一个带有EntityType字段的Cologne

CompetenceType

如何设置表单,使class CompetenceType extends AbstractType { /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add( 'locations', EntityType::class, [ 'class' => Location::class, 'choice_label' => 'name', 'multiple' => true, 'expanded' => true, 'label' => "Locations", ] ); } } 不能修改Bob关系,而可以修改Munich关系?

我尝试通过Berlin回调禁用Munich选项,但这导致始终删除choice_attr关系。

我还尝试使用Munich仅获取query_builder实体,但是就像上述解决方案一样,这导致总是删除Berlin关系。

第三个想法是将Munich设置为by_reference,然后适当地修改加法器和去除器。我无法使用此解决方案,因为我无权访问实体内的容器,因此无法检查false是否有权操作所有关系,而不仅仅是他自己的位置之一。

请注意:我想要一个不涉及控制器的解决方案。我知道我可以稍后通过控制器简单地重新添加Bob关系,但这只是一个肮脏的技巧。我认为,应由表格自行负责处理此问题。

1 个答案:

答案 0 :(得分:1)

我要说的是,一种形式只能载你到此为止。但是,...

要以某种方式单独使用EntityType来完成这项并非那么容易的任务。使表格携带所有内容? EntityType用于处理一系列统一的事物。

我的方法是区分地处理实体(或链接或其他任何东西):可以编辑的实体和不能编辑的实体。我将使用DataMapper将实体分离到这两个组中,一个可以设置为禁用(或完全省略),另一个可以编辑和填充,无论如何你需要。在相反的方向(DataMapper::mapFormsToData),您必须多少正确管理集合以删除/添加/编辑相关实体,但是我相信您可以通过引用获得原始实体,并且该实体应该可以工作精细。但是,我从未这样做过……

如果显示禁用的实体,则可以可能依靠禁用的表单拒绝对不应更改的实体进行任何更改。

所以,总结一下:

  • 在您的表单类型上实现DataMapperInterface
  • mapDataToForms中,您将不可编辑的实体过滤到一个要编辑的字段中
  • mapFormsToData中,您必须再次过滤掉不可编辑的实体,以便可以确定要添加/删除/编辑的实体

希望这有助于...或至少提供一种方法。