Reputation: 129
I want to make a select form in symfony where entrie are ordered by relation (I have Client entity with a Many to one relation). The form should order each Client by Enterprise.
Here is my Client Entity
/**
* @ORM\Table(name="user")
* @ORM\Entity(repositoryClass="MyBrowserBundle\Entity\UserRepository")
*/
class User
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="MyBrowserBundle\Entity\Enterprise", inversedBy="user", cascade={"persist"})
* @ORM\JoinColumn(nullable=false)
*/
private $enterprise;
//Some data
// Setter Getter
/**
* Set enterprise
*
* @param \MyBrowserBundle\Entity\Enterprise $enterprise
* @return User
*/
public function setEnterprise(\MyBrowserBundle\Entity\Enterprise $enterprise)
{
$this->enterprise = $enterprise;
return $this;
}
/**
* Get enterprise
*
* @return \MyBrowserBundle\Entity\Enterprise
*/
public function getEnterprise()
{
return $this->enterprise;
}
public function __construct() {
//Some code
}
}
And My Enterprise Entity
/**
* @ORM\Table(name="enterprise") *@ORM\Entity(repositoryClass="MyBrowserBundle\Repository\EnterpriseRepository")
*/
class Enterprise
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;
/**
* @ORM\OneToMany(targetEntity="MyBrowserBundle\Entity\User", mappedBy="enterprise", cascade={"persist"})
*/
private $user;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set name
*
* @param string $name
* @return Enterprise
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Constructor
*/
public function __construct()
{
$this->user = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Add user
*
* @param \MyBrowserBundle\Entity\User $user
* @return Enterprise
*/
public function addUser(\MyBrowserBundle\Entity\User $user)
{
$this->user[] = $user;
//$user->setEnterprise($this);
return $this;
}
/**
* Remove user
*
* @param \MyBrowserBundle\Entity\User $user
*/
public function removeUser(\MyBrowserBundle\Entity\User $user)
{
$this->user->removeElement($user);
}
/**
* Get user
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getUser()
{
return $this->user;
}
}
I am using a bidimensional array with a Choice Type like this ($fullArray is the 2d array) :
$formSearch = $this->createFormBuilder($fullArray)
->add('List', 'choice', array(
'choices' => $fullArray,
'choice_attr' => function($fullArray, $key, $index) {
return ['class' => 'category_'.$key];
},
))
->add('search', 'submit')
->getForm();
$formSearch->handleRequest($request);
The probleme is when twig render the form, all of the data are mixed.
Is there another way of doing this? (with EntityType ?) I am new to Symfony 2
Thanks
Upvotes: 2
Views: 6087
Reputation: 129
So, i have juste changer my formBuilder to this :
$formSearch = $this->createFormBuilder($fullArray)
->add('user', 'entity', array(
'class' => 'MyBrowserBundle:User',
'choice_label' => 'name',
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('u')
->orderBy('u.enterprise', 'ASC');
},
'group_by' => function($val, $key, $index) {
return $val->getEnterprise()->getName();
},
))
->add('search', 'submit')
->getForm();
And it work fine :)
Upvotes: 8