如何在 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 视图。据我所知,标准的东西。
现在满足我的要求。客户端对象有两个特殊属性。我们称它们为 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 控件。我 认为 我可以使用 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);
}
我有一个仍然使用 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 视图。据我所知,标准的东西。
现在满足我的要求。客户端对象有两个特殊属性。我们称它们为 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 控件。我 认为 我可以使用 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); }