且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

symfony2 实体表单类型中的选项组

更新时间:2022-10-22 18:53:43

我在处理类别时做了类似的事情.

首先,当您构建表单时,将选项列表作为函数 getAccountList() 的结果传递如下:

 public function buildForm(FormBuilderInterface $builder, array $options){$builder->add('账户', '实体', 数组('类' =>'MyBundle\Entity\Account','选择' =>$this->getAccountList(),'必需' =>真的,'empty_value' =>'Choose_an_account',));}

该函数应执行如下操作(内容取决于您构建结果的方式).

私有函数 getAccountList(){$repo = $this->em->getRepository('MyBundle\Entity\Account');$list = 数组();//现在你必须构造<optgroup>标签.假设有3组$list['group1'] = array();$list['group2'] = array();$list['group3'] = array();$accountsFrom1 = $repo->findFromGroup('group1');//检索您在 group1 中的帐户.foreach($accountsFrom1 作为 $account){$list[$name][$account->getName()] = $account;}//....等等返回 $list;}

当然,你可以做更多的动态!我的只是一个简单的例子!

您还必须将 EntityManager 传递给您的自定义表单类.所以,定义构造函数:

class MyAccountType 扩展 AbstractType {私人 $em;公共函数 __construct(\Doctrine\ORM\EntityManager $em){$this->em = $em;}}

并在您启动 MyAccountType 对象时传递 EntityManager.

Is there any way an entity field can be shown grouped in option groups in symfony2 (v.2.1), for example I have something like this in my form class:

$builder->add('account',
                    'entity',
                    array(
                        'class' => 'MyBundle\Entity\Account',
                        'query_builder' => function(EntityRepository $repo){
                            return $repo->findAllAccounts();
                        },
                        'required'  => true,
                        'empty_value' => 'Choose_an_account',
                    );

But (of course) they are displayed as the repository class reads it from the db and I would like to display them grouped in the combobox. This post mentions that featured added to the 2.2 release out of the box, but what options do we 2.1 users have?

The Grouping would be based on a field called Type, lets say I have a getter for that called getType() in my Account entity that returns a string.

Thanks.

I did a similar thing when handling with categories.

First, when you build the form, pass the list of choices as a result from a function getAccountList() as follows:

 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',
            ));
}  

The function should do something like follows (the content depend on the way you structure your result).

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;
} 

Of course, you can do it more dynamics! Mine is just a brief example!

You also have to pass the EntityManager to your custom form class. So, define the constructor:

class MyAccountType extends AbstractType {

    private $em;

    public function __construct(\Doctrine\ORM\EntityManager $em){
        $this->em = $em; 
    }    
} 

And pass the EntityManager when you initiate the MyAccountType object.