【问题标题】:symfony2 form with self-referencing multiple checkboxes aren't presented checked in twig带有自引用多个复选框的 symfony2 表单未在 twig 中选中
【发布时间】:2016-03-02 02:14:43
【问题描述】:

我正在尝试使用$this->createFormBuilder 构建一个基于预选主管的表单,该表单应该向我显示他监管的“供应商”以及其他已创建但没有分配主管的表单。

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

这是我的表单,其中“asignados”带来与预选主管相关的每个用户,“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 %}

有什么想法或建议可以帮助实现这一目标吗?提前致谢。

【问题讨论】:

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


    【解决方案1】:

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

    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 属性,并且当我们第一次创建用户时,其中一些用户没有分配主管。

    【讨论】:

      猜你喜欢
      • 2014-08-12
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 2016-05-31
      相关资源
      最近更新 更多