Есть ли способ, которым поле объекта можно показать сгруппированным в группах опций в symfony2 (v.2.1), например, у меня есть что-то вроде этого в моем классе формы:
$builder->add('account', 'entity', array( 'class' => 'MyBundle\Entity\Account', 'query_builder' => function(EntityRepository $repo){ return $repo->findAllAccounts(); }, 'required' => true, 'empty_value' => 'Choose_an_account', );
Но (конечно) они отображаются, поскольку класс репозитория читает его из db, и я хотел бы отображать их, сгруппированные в combobox. В этом сообщении упоминается, что он добавлен в версию 2.2, но какие параметры у нас есть у пользователей 2.1?
Группировка будет основана на поле под названием « Type
, скажем, у меня есть getter для вызываемого getType()
в моей учетной записи, который возвращает строку.
Благодарю.
Аналогичным образом я работал с категориями.
Во-первых, когда вы создаете форму, передайте список вариантов в результате функции getAccountList()
следующим образом:
public function buildForm(FormBuilderInterface $builder, array $options){ $builder ->add('account', 'entity', array( 'class' => 'MyBundle\Entity\Account', 'choices' => $this->getAccountList(), 'required' => true, 'empty_value' => 'Choose_an_account', )); }
Функция должна делать что-то вроде следующего (содержимое зависит от того, как вы структурируете результат).
private function getAccountList(){ $repo = $this->em->getRepository('MyBundle\Entity\Account'); $list = array(); //Now you have to construct the <optgroup> labels. Suppose to have 3 groups $list['group1'] = array(); $list['group2'] = array(); $list['group3'] = array(); $accountsFrom1 = $repo->findFromGroup('group1'); // retrieve your accounts in group1. foreach($accountsFrom1 as $account){ $list[$name][$account->getName()] = $account; } //....etc return $list; }
Конечно, вы можете сделать это более динамично! Шахта – всего лишь краткий пример!
Вы также должны передать EntityManager
в свой собственный класс формы. Итак, определите конструктор:
class MyAccountType extends AbstractType { private $em; public function __construct(\Doctrine\ORM\EntityManager $em){ $this->em = $em; } }
И передайте EntityManager
когда вы инициируете объект MyAccountType
.