表单实体:添加一个额外的选项
Form entity: add an extra option
我使用 Symfony 表单过滤一组数据。比如说,有一个 "User" 下拉菜单过滤 table 条日志记录(每条记录可以与用户链接,但不能链接)。
换句话说,LogRecord <- many-to-one nullable -> User
问题是我希望它支持下拉列表中的 2 个选项:所有用户(禁用此字段的过滤)和 "No User" 应该过滤字段 = NULL 的记录。但我不知道如何学习表格来区分这些情况,而不是破坏表格验证过程。有什么想法吗?
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->setMethod('GET');
$builder
->add('user', EntityType::class, array(
'class' => 'AppBundle:User',
'choice_label' => 'name',
'placeholder' => 'All',
'query_builder' => function (UserRepository $repo) {
return $repo->findForOptionsQueryBuilder();
},
'label' => 'User',
'required' => false,
));
}
当前下拉菜单:
- 全部
- 用户 1
- 用户 2
所需的下拉菜单:
- 全部
- None(空)
- 用户 1
- 用户 2
一个想法可以改用 ChoiceType
。像这样:
// all your users
$choices = $repo->findForOptionsQueryBuilder()->getQuery()->getResult();
// add None option
$choices = array_merge(['None' => 0], $choices);
$builder->add('user', ChoiceType::class, [
'choices' => $choices,
'placeholder' => 'All', // add All option to beginning
'required' => false,
'choice_label' => function ($value, $key) {
return $value ?: $key;
},
]);
这应该呈现以下 HTML 输入:
<select id="form_user" name="form[user]">
<option value="">All</option>
<option value="0">None</option>
<option value="1">User A</option>
<option value="2">User B</option>
<option value="3">User C</option>
</select>
并且,在提交事件时:
- 如果选择“全部”选项,则
$form->get('user')->getData()
等于 null
- 如果选择选项“None”,则
$form->get('user')->getData()
等于 0
- 如果选择“用户 A”选项,则
$form->get('user')->getData()
是 User
的一个实例
因此您可以在不中断表单验证过程的情况下区分这些情况。
我使用 Symfony 表单过滤一组数据。比如说,有一个 "User" 下拉菜单过滤 table 条日志记录(每条记录可以与用户链接,但不能链接)。
换句话说,LogRecord <- many-to-one nullable -> User
问题是我希望它支持下拉列表中的 2 个选项:所有用户(禁用此字段的过滤)和 "No User" 应该过滤字段 = NULL 的记录。但我不知道如何学习表格来区分这些情况,而不是破坏表格验证过程。有什么想法吗?
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->setMethod('GET');
$builder
->add('user', EntityType::class, array(
'class' => 'AppBundle:User',
'choice_label' => 'name',
'placeholder' => 'All',
'query_builder' => function (UserRepository $repo) {
return $repo->findForOptionsQueryBuilder();
},
'label' => 'User',
'required' => false,
));
}
当前下拉菜单:
- 全部
- 用户 1
- 用户 2
所需的下拉菜单:
- 全部
- None(空)
- 用户 1
- 用户 2
一个想法可以改用 ChoiceType
。像这样:
// all your users
$choices = $repo->findForOptionsQueryBuilder()->getQuery()->getResult();
// add None option
$choices = array_merge(['None' => 0], $choices);
$builder->add('user', ChoiceType::class, [
'choices' => $choices,
'placeholder' => 'All', // add All option to beginning
'required' => false,
'choice_label' => function ($value, $key) {
return $value ?: $key;
},
]);
这应该呈现以下 HTML 输入:
<select id="form_user" name="form[user]">
<option value="">All</option>
<option value="0">None</option>
<option value="1">User A</option>
<option value="2">User B</option>
<option value="3">User C</option>
</select>
并且,在提交事件时:
- 如果选择“全部”选项,则
$form->get('user')->getData()
等于null
- 如果选择选项“None”,则
$form->get('user')->getData()
等于0
- 如果选择“用户 A”选项,则
$form->get('user')->getData()
是User
的一个实例
因此您可以在不中断表单验证过程的情况下区分这些情况。