【问题标题】:Form entity: add an extra option表单实体:添加额外选项
【发布时间】:2017-05-26 00:36:56
【问题描述】:

我使用 Symfony 表单来过滤一组数据。比如说,有一个“用户”下拉列表过滤日志记录表(每条记录可以与一个用户链接,但不能链接)。

换句话说,LogRecord <- many-to-one nullable -> User

问题是我希望它支持下拉列表中的 2 个选项:所有用户(禁用按此字段过滤)和“无用户”,它应该过滤字段 = 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

所需的下拉菜单:

  • 全部
  • 无(空)
  • 用户 1
  • 用户 2

【问题讨论】:

  • 不知道有没有用,试试allow_extrafields

标签: php symfony doctrine-orm symfony-forms


【解决方案1】:

一个想法可以改用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-&gt;get('user')-&gt;getData() 等于null
  • 如果选择“无”选项,则$form-&gt;get('user')-&gt;getData() 等于0
  • 如果选择“用户 A”选项,则 $form-&gt;get('user')-&gt;getData()User 的一个实例

因此,您可以在不破坏表单验证过程的情况下区分这些情况。

【讨论】:

  • 是的,如果传递的值为“null”,我最终在提交前事件处理程序中将 EntityType 表单元素替换为 ChoiceType。
猜你喜欢
  • 2023-03-16
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多