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



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

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

ClientProfile课上,我们有

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));
}
}

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

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

Disabled
Type 1
Type 2
Type 3

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

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

实现此目的的一种方法是创建一个字段,比方说,frooble

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

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

最新更新