forms - EntityType 的 Symfony 禁用选项
问题描述
假设我有一个competence
与该 entity 相关的 ManyToMany 实体location
。此外,有些人users
只能访问一个位置。
现在想象以下场景:能力FirstHelp
与位置Berlin
和Munich
. 用户Bob
可以访问 location Berlin
。Bob
现在想编辑FirstHelp
。应该允许他删除或添加 和 之间的关系FirstHelp
,Berlin
但不应允许他触摸关系FirstHelp
<=> Munich
。他也不应该被允许添加像FirstHelp
<=>这样的其他关系Cologne
。
到目前为止,我有CompetenceType
一个 EntityType 字段:
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
有权操纵所有关系,而不仅仅是他自己的位置。
请注意:我想要一个不涉及控制器的解决方案。我知道我可以简单地通过控制器重新添加Munich
关系,但这只是一个肮脏的黑客。在我看来,处理这个问题应该是表单的唯一责任。
解决方案
我想说,只是一种形式只能带你走这么远。然而, ...
以某种方式EntityType
独自管理这个不那么容易的任务。让表格承载一切?EntityType
旨在处理一组统一的事物。
我的方法是区别处理实体(或链接或其他):可以编辑的实体和不能编辑的实体。我会使用DataMapper将实体分成这两组,一组可以设置为禁用(或完全省略),另一组可以进行编辑和填充,无论您需要什么。DataMapper::mapFormsToData
在相反的方向(然而,我从来没有这样做过......
如果您显示禁用的实体,您可能可以依靠禁用的表单来拒绝对不应更改的实体的任何更改。
所以,总结一下:
DataMapperInterface
在您的表单类型上实现- 在
mapDataToForms
您将不可编辑的实体过滤到要编辑的一个字段中 - 在
mapFormsToData
您必须再次过滤掉不可/可编辑的实体,以便您可以确定要添加/删除/编辑哪些实体
希望这会有所帮助……或者至少提供一种方法。
推荐阅读
- c# - 有没有办法通过 REST API 的 POST 方法从一个项目通过另一个项目发送 List<> 对象?
- yii2 - yii2 显示来自数据库错误的消息
- django - 表单输入到模板
- asp.net - ASP.NET MVC 5 表单不发送表行详细信息(使用 jQuery 数据表 1.10.15)
- node.js - 如何使用在 nodejs-express-oracledb 中创建的 API
- javascript - 网页打开时光标可以直接进入输入吗?
- node.js - 我在节点项目中使用“使用严格”而不是所有文件。我可以在一个地方使用“使用严格”,这将适用于所有文件
- scala - 返回带有 typeclass 但没有其他类型信息的类型
- html - 不正确的媒体查询被应用于 html 元素
- asp.net-core - 如何存储具有到期日期的对象