这是我正在使用的现有架构,我正在尝试暂时不做任何更改。我有一个代表大学学期的实体属性,例如“fall12” ,“spring11”等。
使用表单添加或编辑此实体时,我想将该属性拆分为两个表单字段:“季节”(秋季或春季)和“年”(2011年,2012年等):
...
->add('formSemesterSeason', 'choice', array(
'label' => 'Season',
'mapped' => false,
'choices' => array('fall' => 'Fall', 'spring' => 'Spring'),
))
->add('formSemesterYear', 'choice', array(
'label' => 'Year',
'mapped' => false,
'choices' => $this->courseManager->getYearChoices(),
))
...
我不认为数据转换器在这里有用,因为它们只适用于转换一个表单项。
现在我正在使用表单事件POST_SET_DATA
在编辑现有实体时填写两个表单字段:
$builder->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) use ($course_manager) {
$course = $event->getData();
$form = $event->getForm();
$semester = $course->getSemester();
$parsed_semester = $course_manager->parseSemesterMachineName($semester);
$form->get('formSemesterSeason')->setData($parsed_semester->season);
$form->get('formSemesterYear')->setData($parsed_semester->yearFull);
});
这很有效,但是如何在提交表单后将值组合回来?我可以在控制器中轻松完成,但我认为我应该能够使用表单事件,并在表单验证之前进行数据操作。
答案 0 :(得分:1)
您可以将它们组合回POST_SUBMIT
侦听器。
最好的方法(可重复使用)是使用数据转换器创建自己的自定义表单类型,以在内部拆分/组合字段。
有" recipes"在食谱中,但我发现创建它的最好方法是撕掉DateTime field type和相关变形金刚(DataTransformerChain,DateTimeToArrayTransformer& ArrayToPartsTransformer)的零件和构建我自己的。