2016-04-28 74 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 –