我正在尝试使用$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)}} {{ form_widget(formulario.no_guardar)}}</div>
<div class="col-md-4"></div>
</div>
{{ form_end(formulario) }}
{% endblock %}
任何可以帮助实现这一目标的想法或建议?谢谢你提前。
答案 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)}} {{ form_widget(formulario.no_guardar)}}</div>
<div class="col-md-4"></div>
</div>
{{ form_end(formulario) }}
{% endblock %}
我的第一种方法没有起作用的主要原因是因为自引用关系没有nullable = true属性,而且我们在第一次创建的用户中有些人没有分配主管。