我正在 Symfony 2 中构建一个表单,其字段将根据相应实体的配置方式而有所不同。
简而言之,每个实体都有一组“详细信息”字段,可以保存不同类型和配置的数据。
例如,一个Project
实体可能具有以下配置:
url
呈现为文本输入并验证为最大长度为 300 个字符的 URL。description
呈现为没有验证约束的文本区域。logo
呈现为文件输入并验证为最大尺寸为 500x500 的图像文件。
等等。有趣的是,所有这些都是通过数据库表配置的,因此管理员可以通过 UI 更改这些模型的配置。
(相关部分)数据库结构如下所示:
project
存储项目记录。project_detail
存储每个项目的每个详细信息字段的值。detail_type
定义每个详细信息字段的类型和配置。detail_type_assignment
定义每个实体可用的详细信息类型以及字段在表单上显示的顺序。
到目前为止,除了在表单中呈现错误消息外,一切都运行良好。
当这些详细信息字段中的任何一个生成验证错误时,它会显示在表单的顶部:
注意在上图中,“EIN”是存在于Project
实体中的字段(即,实现了 Symfony 表单的正常方式),而“URL”和“Logo Upload”则作为详细字段实现。
外观如下ProjectType
:
class ProjectType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('ein', 'ein')
;
/* Add detail fields to the form builder. */
foreach($this->getDetailTypes() as $detailType)
{
$slug = $detailType->getSlug();
$formatter = $detailType->createFormatterInstance('');
$builder->add(
$slug
, $formatter->getFormFieldType()
, $formatter->getFormFieldOptions()
);
/* E.g.,
*
* $builder->add(
* 'url'
* , 'text'
* , array('label' => 'URL', ...)
* )
*/
}
}
...
}
我很确定这里发生的事情是ViolationMapper
无法property_path
正确翻译。
例如,在运行时,property_path
值为url
,project.details[url].value
但字段位于project.url
。
我不希望构建复杂的表单层次结构,以便每个字段的位置与其property_path
. 有没有办法可以更改添加违规的路径ExecutionContext
?