2017-01-20 12 views
2

フォーム型でクエリビルダにパラメータを設定しようとしています。フィールド照会ビルダーを構成する変数をimpactに設定します。私は、フォームのオプションこのコードが間違っていることが示されているのはなぜフォーム型のクエリビルダー関数からグローバル変数にアクセスできません

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('title'); 

    $parentPage = $options["parentPage"]; 
    $impact = $options["impact"]; 

    if($parentPage != null){ 
     $builder->add('parent', 'entity', array(
      'class' => "CoreBundle:Page", 
      'choices' => array($parentPage) 
     )); 
    }else{ 
     $builder->add('parent', 'entity', array(
      'class' => "CoreBundle:Page", 
      'query_builder' => function(PageRepository $pr){ 
       $qb = $pr->createQueryBuilder('p'); 
       $qb->where("p.fullPath NOT LIKE '/deleted%'"); 

       $qb->andWhere('p.impact = :impact') 
        ->setParameter('impact', $impact); <-'Undefined variable $impact' 

       return $qb; 
      }, 
     )); 
    } 

からimpactを取得し、それが$impactが未定義の変数であることを述べています。 buildFormのどこからでもアクセスできるグローバル変数ではありませんか?

答えて

3

問題は、明示的に(query_builder機能別名)クロージャに渡された変数を指定する必要があることです。

$builder->add('parent', 'entity', array(
     'class' => "CoreBundle:Page", 
     'query_builder' => function(PageRepository $pr) use ($impact) { // ADD 
      $qb = $pr->createQueryBuilder('p'); 
      $qb->where("p.fullPath NOT LIKE '/deleted%'"); 

      $qb->andWhere('p.impact = :impact') 
       ->setParameter('impact', $impact); <-'Undefined variable $impact' 

      return $qb; 
     }, 
    )); 

ほとんどの言語はこれを必要としませんが、PHPはありません。 例3を参照:http://php.net/manual/en/functions.anonymous.php

1

フォームビルダにパラメータを渡していないようです。
buildForm機能のdump($options)を受け取りましたか?

オプションにカスタム値を追加するには、フォームタイプは次のようにする必要があります。

<?php 

// src/AppBundle/Form/Enitiy/PageType.php 

namespace AppBundle\Form\Entity; 

use Symfony\Component\Form\AbstractType, 
    Symfony\Component\Form\FormBuilderInterface, 
    Symfony\Component\OptionsResolver\OptionsResolver; 

class PageType extends AbstractType 
{ 

    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('title'); 
    // ... 
    } 

    /** 
    * @param OptionsResolver $resolver 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'AppBundle\Entity\Page', 
      'parentPage' => false, 
      'impact' => false 
     )); 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return 'appbundle_page; 
    } 

} 

コントローラの動作は次のようになります。

$form = $this->createForm(new PageType(), $page, [ 
      'parentPage' => 'foo', 
      'impact' => 'bar' 
     ]); 
関連する問題