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作为简单的选项…
- 将Haskell Word32 / 64中的IEEE 754浮点转换为Haskell Float / Double和从Haskell Float / Double转换
- 我们是否拥有Java中的TimeSpan类?