2016-03-18 2 views
0

Я хочу сделать форму в symfony, где entrie упорядочивается по соотношению (у меня есть клиентское сущность с отношением «Множество к одному»). Форма должна заказывать каждый клиент Enterprise.Symfony: Ordering Entity Type Форма по отношению к объекту

Вот мой клиент 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 
} 
} 

И мое предприятие 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; 
} 
} 

Я использую двумерный массив с выбором типа, как это ($ fullArray является 2d массив):

$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); 

Проблема в том, когда веточка отображает форму, все данные смешаны.

Есть ли другой способ сделать это? (С EntityType?) Я новичок в Symfony 2

Благодаря

+0

как вам заполнить '$ fullArray'? – craigh

+0

С двумя foreach, но я проверил с var_dump, если массив был прав, и это было. – Zglukk

ответ

0

Итак, у меня есть Juste чейнджер мой formBuilder к этому:

$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(); 

И это отлично работает :)

Смежные вопросы