具有自引用多个复选框的symfony2表单未在twig中显示

时间:2015-11-27 21:07:44

标签: forms symfony checkbox doctrine-orm self-reference

我正在尝试使用$this->createFormBuilder构建一个基于预选主管的表单,该主管应该向我展示" vendedores'他指导的是其他人,但没有指派主管。

我使用query_builder创建的查询效果很好,因为它显示了正确的数据,但对于那些主管"监督"显示正确的数据,但未选中复选框。

这是我的表格,其中" asignados"带来与预选主管相关的每个用户和#34; no_asignados"带给每个没有主管的用户。

$data = array();
        $formulario = $this->createFormBuilder($data)
            ->add('asignados', 'entity', array(
                'class' => 'PDBundle:Usuario',
                //'property' => 'nombre',
                'expanded' => true,
                'multiple' => true,
                'query_builder' => function (EntityRepository $er) use ($supervisorId) {
                    return $er->createQueryBuilder('u')
                        ->where('u.estado = :activo')
                        ->andWhere('u.tipoUsuario LIKE :vendedor')
                        ->andWhere('u.supervisor = :supervisorId')
                        ->orderBy('u.nombre', 'ASC')
                        ->setParameter('activo','ACTIVO')
                        ->setParameter('vendedor', 'VENDEDOR%')
                        ->setParameter('supervisorId', $supervisorId);
                }
            ))
            ->add('no_asignados', 'entity', array(
                'class' => 'PDBundle:Usuario',
                //'property' => 'nombre',
                'expanded' => true,
                'multiple' => true,
                'query_builder' => function (EntityRepository $er) {
                    return $er->createQueryBuilder('u')
                        ->where('u.tipoUsuario like :vendedor')
                        ->andWhere('u.supervisor is NULL')
                        ->orderBy('u.nombre', 'ASC')
                        ->setParameter('vendedor', 'VENDEDOR%');
                }
            ))
            ->add('guardar', 'submit', array('label' => 'Guardar','attr' => array('class' => 'btn btn-primary',)))
            ->add('no_guardar', 'submit', array('label' => 'No guardar','attr' => array('class' => 'btn btn-danger',)))
            ->getForm();

这是我的usuario.php实体

    <?php

    namespace PD\AppBundle\Entity;

    use Symfony\Component\Security\Core\User\UserInterface;
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Component\Validator\ExecutionContextInterface;
    use Symfony\Component\Validator\Constraints as Assert;
    use APY\DataGridBundle\Grid\Mapping as GRID;

    /**
     * Usuario
     *
     * @ORM\Table()
     * @ORM\Entity(repositoryClass="PD\AppBundle\Entity\UsuarioRepository")
     * 
     */
    class Usuario implements UserInterface
    {
        /**
         * Método requerido por la interfaz UserInterface
         */
        public function eraseCredentials()
        {
        }

        /**
         * Método requerido por la interfaz UserInterface
         */
        public function getRoles()
        {
            return array('ROLE_USUARIO');
        }

        /**
         * Método requerido por la interfaz UserInterface
         */
        //public function getUsername()
        //{
        //    return $this->getEmail();
        //}

        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;

        /**
         * @var string
         *
         * @ORM\Column(name="nombre", type="string", length=100)
         * @GRID\Column(title="Nombre")
         */
        private $nombre;

        /**
         * @var string
         *
         * @ORM\Column(name="apellidos", type="string", length=100)
         * @GRID\Column(title="Apellidos")
         */
        private $apellidos;

        /**
         * @var string
         *
         * @ORM\Column(name="username", type="string", length=100)
         */
        private $username;

        /**
         * @var string
         *
         * @ORM\Column(name="password", type="string", length=100)
         */
        private $password;

        /**
         * @var string
         *
         * @ORM\Column(name="salt", type="string", length=100)
         */
        private $salt;

        /**
         * @var string
         *
         * @ORM\Column(name="email", type="string", length=100)
         * @GRID\Column(title="Correo")
         */
        private $email; 

        /**
         * @var string
         *
         * @ORM\Column(name="direccion", type="text")
         */
        private $direccion;

        /**
         * @var \DateTime
         *
         * @ORM\Column(name="fecha_alta", type="datetime")
         */
        private $fechaAlta;

        /**
         * @var \DateTime
         *
         * @ORM\Column(name="fecha_nacimiento", type="datetime")
         */
        private $fechaNacimiento;

        /**
         * @var string
         *
         * @ORM\Column(name="dui", type="string", length=9)
         */
        private $dui;

        /**
         * @var string
         *
         * @ORM\Column(name="tipo_usuario", type="string", length=25)
         * @GRID\Column(title="Rol")
         */
        private $tipoUsuario;

        /**
         * @var boolean
         *
         * @ORM\Column(name="estado", type="string", length=20)
         */
        private $estado;

/** 
     * @ORM\ManyToOne(targetEntity="PD\AppBundle\Entity\Usuario", inversedBy="supervisados") 
     * @ORM\JoinColumn(name="usuario_id", referencedColumnName="id", nullable=true)
     * @Assert\Type(type="PD\AppBundle\Entity\Usuario")
     * @GRID\Column(field="supervisor.nombre", title="Nombre supervisor")
     * @GRID\Column(field="supervisor.apellidos", title="Apellido supervisor")
     */
    protected $supervisor;

        /**
         * @ORM\OneToMany(targetEntity="PD\AppBundle\Entity\Usuario", mappedBy="supervisor", cascade={"persist"})
         */
        protected $supervisados;


        public function __construct()
        {
            $this->fechaAlta = new \DateTime();
            $this->supervisados = new \Doctrine\Common\Collections\ArrayCollection();
        }

        public function getNombreApellidos(){
            return $this->getNombre().' '.$this->getApellidos();
        }

        /**
         * Get id
         *
         * @return integer 
         */
        public function getId()
        {
            return $this->id;
        }

        /**
         * Set nombre
         *
         * @param string $nombre
         * @return Usuario
         */
        public function setNombre($nombre)
        {
            $this->nombre = $nombre;

            return $this;
        }

        /**
         * Get nombre
         *
         * @return string 
         */
        public function getNombre()
        {
            return $this->nombre;
        }

        /**
         * Set password
         *
         * @param string $password
         * @return Usuario
         */
        public function setPassword($password)
        {
            $this->password = $password;

            return $this;
        }

        /**
         * Get password
         *
         * @return string 
         */
        public function getPassword()
        {
            return $this->password;
        }

        /**
         * Set salt
         *
         * @param string $salt
         * @return Usuario
         */
        public function setSalt($salt)
        {
            $this->salt = $salt;

            return $this;
        }

        /**
         * Get salt
         *
         * @return string 
         */
        public function getSalt()
        {
            return $this->salt;
        }

        /**
         * Set direccion
         *
         * @param string $direccion
         * @return Usuario
         */
        public function setDireccion($direccion)
        {
            $this->direccion = $direccion;

            return $this;
        }

        /**
         * Get direccion
         *
         * @return string 
         */
        public function getDireccion()
        {
            return $this->direccion;
        }

        /**
         * Set username
         *
         * @param string $username
         * @return Usuario
         */
        public function setUsername($username)
        {
            $this->username = $username;

            return $this;
        }

        /**
         * Get username
         *
         * @return string 
         */
        public function getUsername()
        {
            return $this->username;
        }

        /**
         * Set fechaAlta
         *
         * @param \DateTime $fechaAlta
         * @return Usuario
         */
        public function setFechaAlta($fechaAlta)
        {
            $this->fechaAlta = $fechaAlta;

            return $this;
        }

        /**
         * Get fechaAlta
         *
         * @return \DateTime 
         */
        public function getFechaAlta()
        {
            return $this->fechaAlta;
        }

        /**
         * Set fechaNacimiento
         *
         * @param \DateTime $fechaNacimiento
         * @return Usuario
         */
        public function setFechaNacimiento($fechaNacimiento)
        {
            $this->fechaNacimiento = $fechaNacimiento;

            return $this;
        }

        /**
         * Get fechaNacimiento
         *
         * @return \DateTime 
         */
        public function getFechaNacimiento()
        {
            return $this->fechaNacimiento;
        }

        /**
         * Set dui
         *
         * @param string $dui
         * @return Usuario
         */
        public function setDui($dui)
        {
            $this->dui = $dui;

            return $this;
        }

        /**
         * Get dui
         *
         * @return string 
         */
        public function getDui()
        {
            return $this->dui;
        }

        public function __toString()
        {
        /*
         * 1 = SUPER_ADMIN
         * 2 = ADMIN        administrador
         * 3 = SUPERVISOR   supervisor
         * 4 = VENDEDOR     vendedor de tickets
         * 5 = VENDEDOR_INDEPENDIENTE vendedor de tickets independiente
        */
            if($this->getTipoUsuario() == 'SUPER_ADMIN'){
              return $this->getNombre().' '.$this->getApellidos(). ' (Super Admin)';
            }
            if($this->getTipoUsuario() == 'ADMIN'){
              return $this->getNombre().' '.$this->getApellidos(). ' (Admin)';
            }
            if($this->getTipoUsuario() == 'SUPERVISOR'){
              return $this->getNombre().' '.$this->getApellidos(). ' (Supervisor)';
            }
            if($this->getTipoUsuario() == 'VENDEDOR'){
              return $this->getNombre().' '.$this->getApellidos(). ' (Vendedor)';
            }
            if($this->getTipoUsuario() == 'VENDEDOR_INDEPENDIENTE'){
              return $this->getNombre().' '.$this->getApellidos(). ' (Vendedor Independiente)';
            }else{
                return $this->getNombre().' '.$this->getApellidos();
            }
        }

        /**
         * Set apellidos
         *
         * @param string $apellidos
         * @return Usuario
         */
        public function setApellidos($apellidos)
        {
            $this->apellidos = $apellidos;

            return $this;
        }

        /**
         * Get apellidos
         *
         * @return string 
         */
        public function getApellidos()
        {
            return $this->apellidos;
        }

        /**
         * Set email
         *
         * @param string $email
         * @return Usuario
         */
        public function setEmail($email)
        {
            $this->email = $email;

            return $this;
        }

        /**
         * Get email
         *
         * @return string 
         */
        public function getEmail()
        {
            return $this->email;
        }

        /**
         * Set tipoUsuario
         *
         * @param integer $tipoUsuario
         * @return Usuario
         */
        public function setTipoUsuario($tipoUsuario)
        {
            $this->tipoUsuario = $tipoUsuario;

            return $this;
        }

        /**
         * Get tipoUsuario
         *
         * @return integer 
         */
        public function getTipoUsuario()
        {
            return $this->tipoUsuario;
        }

        /**
         * Set estado
         *
         * @param string $estado
         * @return Usuario
         */
        public function setEstado($estado)
        {
            $this->estado = $estado;

            return $this;
        }

        /**
         * Get estado
         *
         * @return string 
         */
        public function getEstado()
        {
            return $this->estado;
        }

        /**
         * Set supervisor
         *
         * @param \PD\AppBundle\Entity\Usuario $supervisor
         * @return Usuario
         */
        public function setSupervisor(\PD\AppBundle\Entity\Usuario $supervisor = null)
        {
            $this->supervisor = $supervisor;

            return $this;
        }

        /**
         * Get supervisor
         *
         * @return \PD\AppBundle\Entity\Usuario 
         */
        public function getSupervisor()
        {
            return $this->supervisor;
        }

        /**
         * Add supervisados
         *
         * @param \PD\AppBundle\Entity\Usuario $supervisados
         * @return Usuario
         */
        public function addSupervisado(\PD\AppBundle\Entity\Usuario $supervisados)
        {
            $this->supervisados[] = $supervisados;

            return $this;
        }

        /**
         * Remove supervisados
         *
         * @param \PD\AppBundle\Entity\Usuario $supervisados
         */
        public function removeSupervisado(\PD\AppBundle\Entity\Usuario $supervisados)
        {
            $this->supervisados->removeElement($supervisados);
        }

        /**
         * Get supervisados
         *
         * @return \Doctrine\Common\Collections\Collection 
         */
        public function getSupervisados()
        {
            return $this->supervisados;
        }
    }

这是我的枝条文件

{% extends '::base.html.twig' %}

{% block body %}
<h1 class="page-header">Agregar vendedores a supervisor</h1>
Empleado: {{ supervisor }}
{# <h3 class="page-header">Vendedores asignados</h3> #}
{{ form_start(formulario) }}
<div class="panel-group" id="accordion">
    <div class="panel panel-default">
        <div class="panel-heading" data-toggle="collapse" {# data-parent="#accordion" #} href="#vendedores_asignados">
            <h4 class="panel-title">
                Vendedores asignados
            </h4>
        </div>
        <div id="vendedores_asignados" class="panel-collapse collapse in">
            <div class="panel-body">
                <div class="row">
                    {% for supervisados in formulario.asignados %}
                        <div class="col-md-4">
                            {{ form_widget(supervisados) }}
                            {{ form_label(supervisados) }}
                            {{ form_errors(supervisados) }}
                        </div>
                    {% endfor %}
                </div>
            </div>
        </div>
    </div>
</div>
{# <h3 class="page-header">Vendedores</h3> #}
<div class="panel-group" id="accordion">
    <div class="panel panel-default">
        <div class="panel-heading" data-toggle="collapse" {# data-parent="#accordion" #} href="#vendedores_sin_asignar">
            <h4 class="panel-title">
                Vendedores sin supervisor
            </h4>
        </div>
        <div id="vendedores_sin_asignar" class="panel-collapse collapse in">
            <div class="panel-body">
                <div class="row">
                    {% for sinSupervisar in formulario.no_asignados %}
                        <div class="col-md-4">
                            {{ form_widget(sinSupervisar) }}
                            {{ form_label(sinSupervisar) }}
                            {{ form_errors(sinSupervisar) }}
                        </div>
                    {% endfor %}
                </div>
            </div>
        </div>
    </div>
</div>
<div class="row">
    <div class="col-md-4"></div>
    <div class="col-md-4">{{ form_widget(formulario.guardar)}}&nbsp;&nbsp;&nbsp;{{ form_widget(formulario.no_guardar)}}</div>
    <div class="col-md-4"></div>
</div>
{{ form_end(formulario) }}
{% endblock %}

任何可以帮助实现这一目标的想法或建议?谢谢你提前。

1 个答案:

答案 0 :(得分:0)

这是我对这个问题的回答:

<强> Controller.php这样

public function addSupervisorVendedorAction(Request $peticion, $supervisorId)
    {
        $em = $this->getDoctrine()->getManager();
        $usuario = $em->getRepository('PDBundle:Usuario')->find($supervisorId);

        if (!$usuario) {
            throw $this->createNotFoundException('El supervisor indicado no está disponible');
        }
        $data = array();
        $formulario = $this->createFormBuilder($data)
            ->add('asignados', 'entity', array(
                'class' => 'PDBundle:Usuario', //'property' => 'nombre',
                'expanded' => true,
                'multiple' => true,
                'query_builder' => function (EntityRepository $er) use ($supervisorId) {
                    return $er->createQueryBuilder('u')
                        ->where('u.estado = :activo')
                        ->andWhere('u.tipoUsuario LIKE :vendedor')
                        ->andWhere('u.supervisor = :supervisorId')
                        ->orderBy('u.nombre', 'ASC')
                        ->setParameter('activo','ACTIVO')
                        ->setParameter('vendedor', 'VENDEDOR%')
                        ->setParameter('supervisorId', $supervisorId);
                }
            ))
            ->add('no_asignados', 'entity', array(
                'class' => 'PDBundle:Usuario', //'property' => 'nombre',
                'expanded' => true,
                'multiple' => true,
                'query_builder' => function (EntityRepository $er) {
                    return $er->createQueryBuilder('u')
                        ->where('u.tipoUsuario like :vendedor')
                        ->andWhere('u.supervisor is NULL')
                        ->orderBy('u.nombre', 'ASC')
                        ->setParameter('vendedor', 'VENDEDOR%');
                }
            ))
            ->add('guardar', 'submit', array('label' => 'Guardar','attr' => array('class' => 'btn btn-primary',)))
            ->add('no_guardar', 'submit', array('label' => 'Regresar sin guardar','attr' => array('class' => 'btn btn-danger',)))
            ->getForm();

        $formulario->handleRequest($peticion);
        if ($formulario->isValid()) {
            $data = $formulario->getData();

            if ($formulario->get('no_guardar')->isClicked()) {
                return $this->redirect($this->generateUrl("super_admin_main_usuario"));
            }

            if($formulario->get('guardar')->isClicked()) {
                foreach ($usuario->getSupervisados() as $supervisadoPrePersist){
                    $bandera = false;
                    foreach ($data['asignados'] as $vendedorAsignado) {
                        if($supervisadoPrePersist->getId() == $vendedorAsignado->getId()){
                            $bandera = true;
                            $usuario->addSupervisado($vendedorAsignado);
                        }
                    }
                    if(!$bandera){
                        $supervisadoPrePersist->setSupervisor(NULL);
                    }
                }

                foreach ($data['no_asignados'] as $vendedorSinAsignar) {
                    $usuario->addSupervisado($vendedorSinAsignar);
                }
                $em->persist($usuario);
                $em->flush();

                return $this->redirect($this->generateUrl("super_admin_add_supervisor_a_vendedor", array('supervisorId' => $supervisorId)));
            }
        }

这是枝条文件

{% extends '::base.html.twig' %}

    {% block body %}
    <h1 class="page-header">Supervisor</h1>
    <strong>Empleado:</strong> {{ supervisor }}<diV class="spacer-10"></div>
    {{ form_start(formulario) }}
    <div class="panel-group" id="accordion">
        <div class="panel panel-default">
            <div class="panel-heading" data-toggle="collapse"  href="#vendedores_asignados">
                <h4 class="panel-title">
                    Vendedores asignados
                </h4>
            </div>
            <div id="vendedores_asignados" class="panel-collapse collapse in">
                <div class="panel-body">
                    <div class="row">
                        {% for supervisados in formulario.asignados %}
                            <div class="col-md-4">
                                {{ form_widget(supervisados, {'checked': true }) }}
                                {{ form_label(supervisados) }}
                                {{ form_errors(supervisados) }}
                            </div>
                        {% endfor %}
                    </div>
                </div>
            </div>
        </div>
    </div>
    {# <h3 class="page-header">Vendedores</h3> #}
    <div class="panel-group" id="accordion">
        <div class="panel panel-default">
            <div class="panel-heading" data-toggle="collapse"  href="#vendedores_sin_asignar">
                <h4 class="panel-title">
                    Vendedores sin supervisor
                </h4>
            </div>
            <div id="vendedores_sin_asignar" class="panel-collapse collapse in">
                <div class="panel-body">
                    <div class="row">
                        {% for sinSupervisar in formulario.no_asignados %}
                            <div class="col-md-4">
                                {{ form_widget(sinSupervisar) }}
                                {{ form_label(sinSupervisar) }}
                                {{ form_errors(sinSupervisar) }}
                            </div>
                        {% endfor %}
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="row">
        <div class="col-md-4"></div>
        <div class="col-md-4">{{ form_widget(formulario.guardar)}}&nbsp;&nbsp;&nbsp;{{ form_widget(formulario.no_guardar)}}</div>
        <div class="col-md-4"></div>
    </div>
    {{ form_end(formulario) }}
    {% endblock %}

我的第一种方法没有起作用的主要原因是因为自引用关系没有nullable = true属性,而且我们在第一次创建的用户中有些人没有分配主管。