Symfony 2 – 如何将数据传递给formBuilder?

我在表单中使用实体select列表。 我只想使用特定的实体(例如:只有用户所属的组)。所以,在控制器中,我得到这些组,并试图将它们传递给formBuider

控制器:

 /.../ $groups = $em->getRepository('VendorMyBundle:Group')->getUserGroups($user); $form = $this->createForm(new Message($groups), $message); /.../ 

所以现在怎么办? 如何在formBuilder中使用它? 如何改变这一行以使用传递的数组?

 ->add('group','entity',array('class' => 'Vendor\MyBundle\Entity\Group', 'label'=>'Group:')) 

或者以另一种方式:

 class MessageType { /.../ public function buildForm(FormBuilder $builder, array $options) { $builder ->add('group','entity', array( 'class' => 'Vendor\MyBundle\Entity\Group', 'property' => 'name', 'query_builder' => function ($repository) { $qb = $repository->createQueryBuilder('group'); $qb->add('where', 'group.administrator = :user'); $qb->setParameter('user', $user->getId()); return $qb; }, 'label' => 'Group' ) ) // Continue adding fields ; } /.../ } 

所以我如何获得对象$用户在表单生成器中使用? ($用户代表当前logging的用户)

你可以在__construct()方法中给你想要使用的对象。

例如:

 $form = $this ->get('form.factory') ->create(new ApplyStepOneFormType($this->company, $this->ad), $applicant); 

在你的表单中input:

 function __construct(\Your\Bundle\Entity\Company $company, \DYB\ConnectBundle\Entity\Ad $ad) { $this->company = $company; $this->ad = $ad; } 

然后在你的表单中inputbuildForm方法:

 $company = $this->company; $builder->add('ad', 'entity', array( 'class' => '\Your\Bundle\Entity\Ad', 'query_builder' => function(\Your\Bundle\Repository\AdRepository $er) use ($company) { return $er->getActiveAdsQueryBuilder($company); }, )); 
 //In controller pass the value which you want to use in builder form in array like $object = new Question(); $form->create(new QuestionType() , $object , array('sqtname'=>2,'question_type'=>2)); //In Form type class public function buildForm(FormBuilderInterface $builder , array $options) { //for setting data field dynamically if (array_key_exists('question_type', $options) && $options['question_type'] != '') { $data = $em->getReference("RecrutOnlineStandardBundle:StdQuestionType",$options['question_type']->getId()); } else { $data = ""; } $builder->add('StdQuestionType', 'entity', array( 'class' => 'TestStandardBundle:StdQuestionType', 'property' => 'name', 'empty_value' => 'Sélectionner un question type', 'required' => true, 'data' => $data, 'query_builder' => function(EntityRepository $er ) use ( $options ) { if (isset($options['sqtname']) && $options['sqtname'] != '') { return $er->createQueryBuilder('sqt') ->where("sqt.name!= ".$options['sqtname']); } else{ return $er->createQueryBuilder('sqt'); } } )); } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'Test\QuestionBundle\Entity\Question', 'required' => false, 'sqtname' => '', 'question_type' =>'' )); } 

Bacteries的解决scheme不是一个好的scheme。 例如,如果将types声明为service,则不可能将对象传递给构造函数。

一个完美的解决scheme是选项 – 只需将数据作为选项传递给构build器即可。

如果你想使用自定义查询,你必须设置query_builder选项,如下所示:

 use Doctrine\ORM\EntityRepository; ... $message = new Message(); $form = $this->createFormBuilder($message) ->add('group', 'entity', array( 'class' => 'Vendor\MyBundle\Entity\Group', 'label'=>'Group:', 'query_builder' => function(EntityRepository $er) { return $er->createQueryBuilder('g') ->... // whatever you want to do } )) ->getForm(); 

您可以在Doctrine手册中find关于查询构build器的更多信息,以及关于Symfony2手册中关于entity选项。

Bacteries的解决scheme是一个非常好的解决scheme。 只是一个笔记,以节省头痛像我这样的其他人:)

在这部分我可以指出use ($company)部分。 它隐藏在框架中,没有它,当然没有任何工作正常。

 $builder->add('ad', 'entity', array( 'class' => '\Your\Bundle\Entity\Ad', 'query_builder' => function(\Your\Bundle\Repository\AdRepository $er) use ($company) { return $er->getActiveAdsQueryBuilder($company); }, ) ); 

最好的方法(我的意见)是给你的表单entityManager,并select所有你需要的。 但是不要忘记在setDefaults()中声明空键,否则数据不会传递给你的构build器。

像这样的东西

 public function buildForm(FormBuilderInterface $builder, array $options) { $options['em']->getRepository(''); // select all you need $builder->add('title', 'text') ->add('content', 'textarea'); } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'Main\BlogBundle\Entity\Post', 'validation_groups' => array('post'), 'required' => false, 'em' => null // this var is for your entityManager )); } 

应用EM作为简单的选项…