Symfony2:为一个实体属性使用两个表单字段?

时间:2014-07-24 19:14:53

标签: symfony

这是我正在使用的现有架构,我正在尝试暂时不做任何更改。我有一个代表大学学期的实体属性,例如“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(),
))
...
  1. 提交表单时,需要将这些值组合并保存到实体上的“semester”属性中作为字符串
  2. 查看编辑表单时,现有的“学期”值需要在两者之间分配。
  3. 我不认为数据转换器在这里有用,因为它们只适用于转换一个表单项。

    现在我正在使用表单事件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);
    });
    

    这很有效,但是如何在提交表单后将值组合回来?我可以在控制器中轻松完成,但我认为我应该能够使用表单事件,并在表单验证之前进行数据操作。

1 个答案:

答案 0 :(得分:1)

您可以将它们组合回POST_SUBMIT侦听器。

最好的方法(可重复使用)是使用数据转换器创建自己的自定义表单类型,以在内部拆分/组合字段。

有" recipes"在食谱中,但我发现创建它的最好方法是撕掉DateTime field type和相关变形金刚(DataTransformerChainDateTimeToArrayTransformer& ArrayToPartsTransformer)的零件和构建我自己的。