2012-09-24 3 views
1

Есть ли способ поле объекта может быть показано сгруппированы в опционных группах в Symfony2 (v.2.1), например, у меня есть что-то подобное в моем классе формы:Вариант группы в Symfony2 сущность типа формы

$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. В этом post упоминается, что добавлено в версию 2.2 из коробки, но какие параметры у нас есть у пользователей 2.1?

Группировка будет основана на поле под названием Type, скажем, у меня есть геттер для того, что называется getType() в моей учетной записи, которая возвращает строку.

Спасибо.

+0

Сгруппировано по какому критерию? Например. по категориям, чтобы вы хотели отобразить категорию и список предметов из этой категории? – JeanValjean

+0

Я отредактировал свой вопрос. –

+1

Я [мой вопрос] (http://stackoverflow.com/questions/12244376/select-with-optgroup-in-symfony-2-0) полезен? Если да, вы можете построить массив вариантов во время выполнения, выполнив запрос к репозиторию вашего объекта. – JeanValjean

ответ

5

При работе с категориями я делал подобное.

Во-первых, когда вы строите форму, передать список выбора в качестве результата от функции 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 объекта.

+0

Сообщите мне, поможет ли этот ответ. – JeanValjean

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