假设我有一个与实体competence
相关的ManyToMany实体location
。此外,users
只能访问一个位置。
现在想象以下情形:能力FirstHelp
与位置Berlin
和Munich
有关。用户Bob
有权访问位置Berlin
。 Bob
现在要编辑FirstHelp
。应该允许他删除或添加FirstHelp
和Berlin
之间的关系,但不允许允许他触摸关系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
关系,但这只是一个肮脏的技巧。我认为,应由表格自行负责处理此问题。
答案 0 :(得分:1)
我要说的是,一种形式只能载你到此为止。但是,...
要以某种方式单独使用EntityType
来完成这项并非那么容易的任务。使表格携带所有内容? EntityType
用于处理一系列统一的事物。
我的方法是区分地处理实体(或链接或其他任何东西):可以编辑的实体和不能编辑的实体。我将使用DataMapper将实体分离到这两个组中,一个可以设置为禁用(或完全省略),另一个可以编辑和填充,无论如何你需要。在相反的方向(DataMapper::mapFormsToData
),您必须多少正确管理集合以删除/添加/编辑相关实体,但是我相信您可以通过引用获得原始实体,并且该实体应该可以工作精细。但是,我从未这样做过……
如果显示禁用的实体,则可以可能依靠禁用的表单拒绝对不应更改的实体进行任何更改。
所以,总结一下:
DataMapperInterface
mapDataToForms
中,您将不可编辑的实体过滤到一个要编辑的字段中mapFormsToData
中,您必须再次过滤掉不可编辑的实体,以便可以确定要添加/删除/编辑的实体希望这有助于...或至少提供一种方法。