如何在 Symfony 2 中为两个模型字段创建一个表单字段?

How to create a single form field for two model fields in Symfony 2?

我有一个仍然使用 Symfony 2 的旧项目。其中有一个用于编辑客户端配置文件的表单。在控制器中我们有这个:

$form = $this->createForm(new ClientProfile($remindTimes), $client);
$form->handleRequest($request);

而在 ClientProfile class 我们有

class ClientProfile extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('client_name', 'text', array('label' => 'Full name'))
            ->add('client_address', 'text', array('label' => 'Address', 'required' => false))
            ->add('client_city', 'text', array('label' => 'City', 'required' => false))
            ->add('client_post_code', 'text', array('label' => 'Postal index', 'required' => false))
            ->add('client_email', 'email', array('label' => 'E-mail', 'required' => false));
    }
}

... 和其他一些字段,但您明白了要点。然后还有一个呈现 HTML 的 Twig 视图。据我所知,标准的东西。

现在满足我的要求。客户端对象有两个特殊属性。我们称它们为 FroobleEnabledFroobleType。如果 Frooble 被禁用,则类型值没有意义(可以设置为 0)。在 UI 中,我想要一个包含以下值的下拉列表:

Disabled
Type 1
Type 2
Type 3

如果用户选择 Disabled,则 FroobleEnabled 设置为 falseFroobleType 设置为 0。否则 FroobleEnabled 分别设置为 trueFroobleType 分别设置为 123

我该怎么做?使它与众不同的是它不再是 1:1 映射。模型对象中有两个字段,但只有一个 UI 控件。我 认为 我可以使用 a DataMapper 来实现这一点,但我也不想手动映射所有其他字段(尽管我可以,如果没有其他选择的话) .我也找不到任何关于 DataMapper 或任何其他可以帮助我的 Symfony Forms 功能的体面文档。

完成此操作的一种方法是创建一个字段,比方说,frooble

  • 在表单 class 中创建一个 frooble 选择字段 mapped => false 和值 0、1、2、3。将其选择设置为适合应用程序的字符串。
  • 在控制器中,在表单提交和验证之后,包含如下代码:

    ...
    $frooble = $form->get('frooble')->getData();
    if (0 === $frooble) {
        $client->setFroobleEnabled(false);
        $client->setFroobleType(0);
    } else {
        $client->setFroobleEnabled(true);
        $client->setFroobleType($frooble);
    }