我有一个较旧的项目,它仍然使用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。标准的东西,据我所知。
现在谈谈我的要求。客户端对象具有两个特殊属性。让我们称它们为FroobleEnabled
和FroobleType
.如果禁用 Frooble,则类型值没有意义(可以设置为 0)。在 UI 中,我想要一个包含值的下拉列表:
Disabled
Type 1
Type 2
Type 3
如果用户选择Disabled
,则FroobleEnabled
设置为false
,FroobleType
设置为0
。否则FroobleEnabled
分别设置为true
和FroobleType
1
、2
或3
。
我该怎么做?使它与众不同的是,它不再是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); }