我有一个属性的实体被设置为阵列阵列类型属性和形式CollectionType与数据变换器
/**
* @ORM\Column(type="array")
*/
private $labels = [];
此数组的标签的数据存储翻译等
[
'en' => 'foo-in-English',
'de' => 'foo-in-German',
'ru' => 'foo-in-Russian'
]
我有像标签设置类型的一种形式:
$builder
->add('labels', CollectionType::class);
注意,entry_type
默认(正确)到TextType
这里。保留原样,模板将与文本字段中显示,如:
Labels: en: _____FOO IN ENGLISH____
de: _____FOO IN GERMAN_____
ru: _____FOO IN RUSSIAN____
不过,我想用实际的语言名,而不是两个字母代码作为显示的字段标签,所以像:
Labels: English: _____FOO IN ENGLISH____
German: _____FOO IN GERMAN_____
Russian: _____FOO IN RUSSIAN____
我也想确保所有我的选择/支持语言显示 - 即使他们目前没有任何价值。
因此,这似乎是一个DataTransformer适当的地方,但尝试我可能无法得到这个概念在范围内的Form类。似乎试图转换集合类型的数据比简单的文本类型更难(或不可能)。
我已经克服了这个问题,作为一种解决方法,在将控制器中的数据提交给表单之前以及在持久化之前处理表单之前,对其进行转换。例如
$this->transformTranslations($fooEntity);
$form = $this->createForm(FooType::class, $fooEntity);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$fooEntity = $form->getData();
$this->reverseTransformTranslations($fooEntity);
$this->getDoctrine()->getManager()->persist($fooEntity);
$this->getDoctrine()->getManager()->flush();
...
我想知道如果任何人有一个更好的方法(如怎样使用正常的数据或模型变压器)。我似乎无法在网上找到有关使用数据转换器与集合类型的更多信息。 TIA!
感谢您花时间回答!对此,我真的非常感激!我想我需要一些更灵活的东西。我找到了一个答案,我将在下面分享: – craigh