2015-05-18 127 views
1

Symfony2的形式過濾器我有2個實體:爲多對多實體關係

class Exercise 
{ 
//entity 
} 

class Question 
{ 
//entity 
} 

他們的關係是多對多。 問題是:我如何過濾(在練習形式上)的問題實體?

我有這種形式的練習:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
$builder 
    ->add('questions', null, array(
     'property' => 'name', 
     'multiple' => true, 
     'expanded' => false, 
     'query_builder' => function(EntityRepository $er) use ($options) { 
     return $er->createQueryBuilder('u') 
     ->where('u.level = :level') 
     ->setParameter('level',$options['level']) 
     ->orderBy('u.dateR', 'ASC');}, 
     )) 
     //other fields 
     ->add('Save','submit') 
    ; 
} 

我知道,我可以用query_builder過濾器,但我怎麼能傳遞變量$搜索? 我應該創建另一個表單嗎?

任何幫助,將不勝感激。 致以問候

編輯:我找到了我想要的解決方案。我在Controller Action上放置了兩個窗體,一個窗體用於實體,一個窗體用於過濾器。

//ExerciseController.php 
public function FormAction($level=null) 
{ 

    $request = $this->getRequest(); 
    $exercise = new Exercise(); 

    //Exercise form  
    $form = $this->createForm(new ExerciseType(), $exercise,array('level' => $level)); 

    //create filter form 
    $filterForm = $this->createFormBuilder(null) 
     ->add('level', 'choice', array('choices' => array('1' => '1','2' => '2','3' => '3'))) 
     ->add('filter','submit') 
     ->getForm(); 

    //Manage forms 
    if($request->getMethod() == 'POST'){ 
    $form->bind($request); 
    $filterForm->bind($request); 

    //If exercise form is received, save it. 
    if ($form->isValid() && $form->get('Save')->isClicked()) { 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($exercise); 
     $em->flush(); 

       return $this->redirect($this->generateUrl('mybundle_exercise_id', array('id' => $exercise->getId())));      
    } 

    //If filter form is received, filter and call again the main form. 
    if ($filterForm->isValid()) { 
     $filterData = $formFiltro->getData(); 


    $form = $this->createForm(new ExerciseType(), $exercise,array('level' => $filterData['level'])); 

    return $this->render('MyBundle:Exercise:crear.html.twig', array(
     'ejercicio' => $ejercicio, 
     'form' => $form->createView(), 
     'formFiltro' => $formFiltro->createView(), 
    )); 

      } 

    } 

    return $this->render('juanluisromanCslmBundle:Ejercicio:form.html.twig', array(
     'exercise' => $exercise, 
     'form' => $form->createView(), 
     'formFiltro' => $filterForm->createView(), 
    )); 
} 

模板的形式 在form.html.twig

{{ form_start(filterForm) }} 
{{ form_errors(filterForm) }} 
{{ form_end(filterForm) }} 

{{ form_start(form) }} 
{{ form_errors(form) }} 
{{ form_end(form) }} 

它的工作對我來說,這是我一直在尋找。

回答

0

什麼你可能想在這裏做的,就是讓使用表單生成的:

$search = [...] 
$form = $this->createForm(new AbstractType(), $bindedEntityOrNull, array(
     'search' => $search, 
    )); 

在這裏你可以提供的參數列表任何你AbstractType的建設者方法。

public function buildForm(FormBuilderInterface $builder, array $options) 

正如您可能已經猜到的那樣,您可以通過$ option變量訪問options數組。


作爲一個方面,請記住在默認選項數組內提供回退。在你AbstractType你可以做這樣的事情:

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'search' => 'some_valid_default_value_if_search_is_not_provided' 
    )); 
} 

希望它能幫助,問候。

+1

你好,謝謝你的回答,它對我有很大的幫助。我也找到了我想要的解決方案。選中「編輯」答案。最好的祝福 –