2016-04-28 53 views
1

我有一个集合类型:Symfony的形式从收集传递值,以形成式

->add('tipi', CollectionType::class, array(
       'entry_type' => TipiType::class, 
       'allow_add' => true, 
       'prototype' => true, 
       'mapped' => false, 
       'entry_options' => array(
        'required' => true, 
        'label' => false, 
       ) 
      )) 

延长此formtype:

->add('tipi', EntityType::class, array(
       'label' => 'Tipo', 
       'class' => 'AppBundle:Tipi', 
       'attr' => array('class' => 'form-control'), 
       'query_builder' => function (EntityRepository $er) { 
      return $er->createQueryBuilder('t') 
        ->innerJoin('t.requests', 'r') 
      ; 
     }, 
      )) 
    ; 

在第一种形式的I型已经从控制器在此sended一个选项方式:

$idRequest = $request->get('id'); 
$form = $this->createForm(RequestsType::class, $requests, array('id_request' => $idRequest)); 

在第一我可以使用它,但在儿童FormType不..我会通过这个VA在收集类型riable。 有人可以帮助我?

回答

0

正常情况下,您不能直接在函数中使用$ options变量,因为它是一个闭包,它封装了它的作用域,这意味着它无法访问定义或执行它的作用域。但是,可以使用关键字 将父变量(其中定义了闭包的地方)的变量继承到闭包中,因此有两种方法可以解决您的问题。

1 - 使用关键字“使用”

 ->add('tipi', EntityType::class, array(
         'label' => 'Tipo', 
         'class' => 'AppBundle:Tipi', 
         'attr' => array('class' => 'form-control'), 
         'query_builder' => function (EntityRepository $er) use ($options) { 
        return $er->createQueryBuilder('t') 
          ->innerJoin('t.requests', 'r') 
          ->where('r.id = idrequest') 
          ->setParameter('idrequest' ,$this->options['id_request']); 
        ; 
// user your $options variable 
       }, 
        )) 
      ; 

2 - 尝试创建窗体类的本地属性,并添加一个构造函数来启动它后,您可以自由使用您的变量作为波纹管

class YourForm extends AbstractType 
{ 
    private $options = array(); 

    public function __construct($options) 
    { 

     $this->options = $options; 
    } 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
->add('tipi', EntityType::class, array(
         'label' => 'Tipo', 
         'class' => 'AppBundle:Tipi', 
         'attr' => array('class' => 'form-control'), 
         'query_builder' => function (EntityRepository $er){ 
        return $er->createQueryBuilder('t') 
          ->innerJoin('t.requests', 'r') 
          ->where('r.id = idrequest') 
          ->setParameter('idrequest' ,$this->options['id_request']); 
        ; 

       }, 
        )) 
      ; 
} 



// Controller 
     $form = $this->createForm(new YourForm($options), $class); 

为symfony1.2 3

你应该这样做低谷解析选项,在表单类中添加以下代码片段

/** 
* {@inheritdoc} 
*/ 
public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'URL of your entity', 
     'id_request' => null, 
    )); 
} 

现在的$选项[“id_request”]将可用于您的formBuilder

希望这将帮助你。

+0

我有2种形式,在第一个我可以使用选项,如第一种方式,你写,但在第二个地方,我想用它不是.. 你的第二种方式使用类的symfony 2.8 <,我使用symfony3和写像这个RequestsType :: class,我不能通过这种方式将值传递给窗体new YourForm($ options).... –

+0

尝试使用选项解析器,我已经完成symfony 3的答案 –

+0

我已经创建了解决方案这里http://stackoverflow.com/questions/34027711/passing-data-to-buildform-in-symfony-2-8-3-0 –