Symfony 3用表单更新角色用户


Symfony 3 update roles user with form

我需要一些帮助,我会做一个表单来改变用户在应用程序中的角色。

我使用Symfony 3.1.X的"默认"包安全性。

实际上我可以检索DB中的所有角色并显示它们,我也对数据进行了一些处理,但我仍然卡住了显示问题,当我显示表单时,Twig bundle继续显示一些已经显示在下面的标签。

我该如何解决这个问题?

下面是我的代码:

<<p> 显示模板/kbd>
    {% extends 'admin/base.admin.html.twig' %}
   {% block body %}
    <section class="container">
        {{ user.pseudo }} | 
        {{ dump(user, form.roles) }}
        {{ form_start(form) }}
        {% for role in user.roles %}
            {% if form.roles.children[role] is defined %}
                {{ form_label(form.roles.children[role]) }}
                {{ form_widget(form.roles.children[role], {'attr':{'checked':true}}) }}
            {% else %}
                {{ form_label(form.roles) }}
                {{ form_widget(form.roles) }}
            {% endif %}
        {% endfor %}
        {{ form_end(form) }}
    </section>
    <div class="well">
        {% for key, role in form.roles.children %}
            {{ dump(key) }}
        {% endfor %}
    </div>
{% endblock %}

这是我的表单

<?php
namespace AppBundle'Form;
use AppBundle'Entity'MembersEntity;
use AppBundle'Entity'RoleEntity;
use Symfony'Bridge'Doctrine'Form'Type'EntityType;
use Symfony'Component'Form'AbstractType;
use Symfony'Component'Form'Extension'Core'Type'SubmitType;
use Symfony'Component'Form'FormBuilderInterface;
use Symfony'Component'OptionsResolver'OptionsResolver;
class ChangeRoleForm extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('roles', EntityType::class, array(
            'class' => RoleEntity::class,
            'choice_label' => 'nameRole',
            'multiple' => true,
            'expanded' => true,
            'choice_value' => 'nameRole',
        ))
            ->add('update', SubmitType::class);
    }
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => null
        ));
    }
}

我终于找到了,我只是从TWIG模板中删除了条件,它工作得很好,我有我想要的,它需要在哪里!

我把解决这个问题的最终代码贴在这里:

模板:

{% extends 'admin/base.admin.html.twig' %}
{% block body %}
    <section class="container">
        {{ user.pseudo }} | 
        {% set formChil = form.roles.children %}
        {{ form_start(form) }}
        {% for role in formChil %}
            {% if role.vars.value in user.roles %}
                {{ form_row(role, {'attr' : {'checked':true}}) }}
            {% else %}
                {{ form_row(role, {'attr' : {'checked':false}}) }}
            {% endif %}
        {% endfor %}
        {{ form_end(form) }}
    </section>
{% endblock %}

表单代码:

<?php
namespace AppBundle'Form;
use AppBundle'Entity'MembersEntity;
use AppBundle'Entity'RoleEntity;
use Symfony'Bridge'Doctrine'Form'Type'EntityType;
use Symfony'Component'Form'AbstractType;
use Symfony'Component'Form'Extension'Core'Type'SubmitType;
use Symfony'Component'Form'FormBuilderInterface;
use Symfony'Component'OptionsResolver'OptionsResolver;
class ChangeRoleForm extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('roles', EntityType::class, array(
            'class' => RoleEntity::class,
            'choice_label' => 'nameRole',
            'multiple' => true,
            'expanded' => true,
            'choice_value' => 'nameRole',
        ))
            ->add('update', SubmitType::class);
    }
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => null
        ));
    }
}

这里是调用模板的方法,以及表单构造:

<?php 
public function editMemberAction($id, Request $request)
    {
        $em = $this->getDoctrine()->getManager();
        $user = $this->getDoctrine()->getRepository(MembersEntity::class)->find($id);
        $form = $this->createForm(ChangeRoleForm::class, $user, array('method' => 'PUT'));
        if($request->isMethod('PUT'))
        {
            $form->handleRequest($request);
            $roles = $form->get('roles')->getData();
            $data = array();
            foreach($roles as $role)
            {
                $data[] = $role->getNameRole();
            }
            $user->setRoles($data);
            $em->persist($user);
            $em->flush();
        }
        return $this->render('admin/edit-role-member.html.twig', ['form' => $form->createView(), 'user' => $user]);
    }