2017-01-20 7 views
2

Я пытаюсь установить параметр для построителя запросов в форме формы. Я хочу установить переменную impact, чтобы сформировать построитель запросов поля. Я получаю impact из вариантов формыНе удается получить доступ к глобальной переменной из функции query builder в форме типа

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 является неопределенной переменной. Разве глобальная переменная не может быть доступна из любой точки функции 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

Похоже, вы не передаете параметры в свой конструктор форм.
Если вы dump($options) в своей функции buildForm, вы видите, что они прошли?

Чтобы добавить настраиваемое значение в параметры, которые должны быть похожи на тип формы;

<?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' 
     ]);