首页 > 解决方案 > 复选框列表 Symfony 4

问题描述

我是 Symfony 4 的新手,我正在尝试在以下情况下使用搜索器创建一个复选框列表:

我有一个名为SAI的实体,该实体可能由许多用户“拥有”(因此,我有一个名为User的实体)。
我有一个控制器AddSAIController.php,我在其中管理如何添加 SAI。当我添加它时,我想显示一个表单,用户可以在其中输入 SAI 的序列号,并可以检查哪些用户拥有该 SAI。问题是我将在数据库中有很多用户,我需要一个搜索器来更快地找到我想要的用户。

首先,我尝试按照https://symfony.com/doc/current/form/form_collections.html上的文档创建复选框列表,我设法向用户展示,但没有像我想要的那样使用复选框,而是将它们显示为输入文本类型。 像这样。
这是我的代码:

add_sais.html.twig

{%  block body %}

<div class="main">
    <h1>Add SAI</h1>
    <hr>
    <div class="formUsers">
        {{ form_start(form) }}
        {% for user in form.users %}
            {{ form_row(user.username) }}
        {% endfor %}
        {{ form_end(form) }}
    </div>
</div>

{%  endblock %}

添加SAIsController.php

public function addSAI(Request $request)
{
    $sai = new SAI();
    $users = $this->getDoctrine()->getRepository(User::class)->findAll();
    $sai->setUsers($users); 
    $form = $this->createForm(SAIType::class,$sai);
    $form->handleRequest($request);

    return $this->render('management/add_sais.html.twig', array(
        'form' => $form->createView(),
    ));
}

用户类型.php

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('username');
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => User::class,
    ));
}

SAIType.php

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('serial_number');
    $builder->add('users', CollectionType::class, array(
        'entry_type' => UsersType::class,
        'entry_options' => array('label' => false),
    ));
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => SAI::class,
    ));
}

现在我很乐意在创建复选框时得到一些帮助,稍后我会做 seracher。

标签: phplistcheckboxsymfony4

解决方案


您可以使用 jQuery 选择框插件(例如 Select2)将多个选择器和搜索功能合二为一。这为您提供了一个选择字段,您可以在其中搜索并拥有多个输入。尝试这个:

SAIType.php

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('serial_number')
            ->add('users', EntityType::class, array(
                'label' => false,
                'class' => User::class,
                'multiple' => true,
                'attr' => ['data-select' => 'true']
    ));
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => SAI::class,
    ));
}

然后在您要使用它的页面上(或将其放入base.html.twig):

CSS

<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet" />

Javascript

<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>
    <script>
    $('select[data-select="true"]').select2({});
</script>

推荐阅读