2015-07-16 4 views
0

Я использую formbuilder, чтобы создать форму, как следует:Symfony2: formbuilder: динамически изменять QueryBuilder

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('content', 'textarea') 
     ->add('rosters', 'entity', array( 
      'class' => 'PlatformBundle:team', 
      'property' => 'display', 
      'multiple' => true, 
      'expanded' => true, 
      'required' => true 
     )) 
     ->add('send',  'submit') 
    ; 
} 

На данный момент я получаю все «команды». Мне нужно адаптировать форму для отображения определенных команд в зависимости от запроса. я могу использовать запрос-строитель в форме строителя

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('content', 'textarea') 
     ->add('rosters', 'entity', array( 
      'class' => 'PlatformBundle:team', 
      'property' => 'display', 
      'query_builder' => function(TeamRepository $t) use ($userId) { 
       return $r->createQueryBuilder('t') 
        ->where('(t.user = :user') 
      }, 
      'multiple' => true, 
      'expanded' => true, 
      'required' => true 
     )) 
     ->add('send',  'submit') 
    ; 
} 

Но изменения запросов для различного опросника. Вкратце: всегда одна и та же анкета, но разные группы должны быть перечислены (я имею в виду?).

Есть ли у кого-нибудь идеи, как динамически изменять конструктор запросов внутри формообразователя?

ответ

1

Предлагаю две возможные альтернативы.

Если запрос исходит от самой формы (т.е. вы уже подавшей формы с некоторыми данными и хотите уточнить поля), вы можете получить доступ представленных данных, как это:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $data = $builder->getData(); 
    // now you can access form data 

Если запрос исходит от другой источник, вы должны использовать параметр «options». Во-первых, построить новый $ вариант для запрашиваемого пользователя:

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'user' => null, 
    )); 
} 

Примечание: Я установить по умолчанию нулевое значение, но вы можете установить его на то, что вы хотите.

После этого вы можете проход за $ вариант, где вы строите форму, то есть

// some controller 
$option = array('user' => $request->get('user'); 
$teamForm = $this->createForm(new TeamType(), null, $options); 
// ... 
+0

Спасибо; это другой метод; который кажется легче. стоит попробовать! cheers –

+0

@Raphael_b рад это слышать! –

0

Для тех, кто ищет ответ ...

Лучшее решение, которое я нашел, это создать переменную в formtype и импортировать его формы контроллер. Мой formType будет выглядеть:

class formType extends AbstractType 
{ 
    // declare and construct the query in the class to use it in the function 
    private $qb; 
    public function __construct ($qb) 
    { 
     $this->qb = $qb; 
    } 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     // declare the variable within the function 
     $qb = $this->qb; 
     $builder 
      ->add('content', 'textarea', array('required' => false)) 
      ->add('rosters', 'entity', array( 
       'class' => 'PlatformBundle:Team', 
       // use ($qb) -> $qb is query built in the controller (or repository) 
       'query_builder' => function(TeamRepository $r) use ($qb) { 
        return $qb; 
       }, 
       'property' => 'display', 
       'multiple' => true, 
       'expanded' => true, 
       'required' => true 
      )) 
      ->add('send',  'submit'); 
    } 

В моем контроллере я просто передать $ QB в качестве аргумента formtype

$qb = $this->getDoctrine()->getManager()->getRepository('PlatformBundle:Team')->qbteam($Id); 

     $form = $this->createForm(new formType($qb), $form); 

с qbteam функции в хранилище команды, которая возвращает запрос (не результат).

public function qbteam($Id){ 
    $qb = $this->createQueryBuilder('r') 
     ->leftJoin('r.team', 'm') 
     ->addSelect('m') 
     ->where('m.user = :user') 
     ->setParameter('user', $Id); 
    return $qb; 
} 

Я надеюсь, что это поможет другим. ура

 Смежные вопросы

  • Нет связанных вопросов^_^