2014-11-08 16 views
0

大家好symfonistes,與會話值設置表單數據不提交這個symfony的形式

我想用的symfony的形式在網頁中搜索數據,當這些數據被驗證我用一個表分頁系統在表單所在的同一個網頁上查看。

我的網頁運行正常,搜索引擎和分頁系統表,但只有一件事情沒有運行。當我點擊系統分頁按鈕(排序,頁碼或每頁查看次數)時,會向控制器發送一個請求,此時我會丟失我的數據選擇表。

系統分頁的結果很好,相對於以前的搜索,但數據形式消失。這樣用戶可以使用我的網頁,但他沒有看結果的參數。

我想使用會話重建我的表單與以前定義的數據。在這個時候,我在表單類中使用preferred_choices(不運行),但如果你有另一個解決方案,歡迎你。

或者你能告訴我爲什麼我的表單preferred_choices沒有運行嗎?

感謝了很多的支持

我的表單類:

class CqsProSansMarqueType extends AbstractType 
{ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $defaultCQSsearch = new CqsProSansMarque(); 
    ladybug_dump($options['attr']); 
    $defaultCQSsearch->setRayLibelle((!array_key_exists('ray_libelle',  $options['attr'])) ? null : $options['attr']['ray_libelle']); 
    $defaultCQSsearch->setFamLibelle((!array_key_exists('fam_libelle', $options['attr'])) ? null : $options['attr']['fam_libelle']); 
    $defaultCQSsearch->setCaeLibelle((!array_key_exists('cae_libelle', $options['attr'])) ? null : $options['attr']['cae_libelle']); 

    ladybug_dump($defaultCQSsearch); 

    $builder 
     ->add('ray_libelle', 'entity', array(
      'class' => 'ApplicationDriveBundle:CqsProSansMarque', 
      'property' => 'ray_libelle', 
      'query_builder' => function(CqsProSansMarqueRepository $er){ 
       return $er->createQueryBuilder('a') 
       ->select('a') 
       ->groupBy('a.ray_libelle'); 
      }, 
      'preferred_choices' => array($defaultCQSsearch), 
      'label' => 'rayon', 
      'required' => false, 
     )) 
     ->add('fam_libelle', 'entity', array(
      'class' => 'ApplicationDriveBundle:CqsProSansMarque', 
      'property' => 'fam_libelle', 
      'query_builder' => function(CqsProSansMarqueRepository $er){ 
        return $er->createQueryBuilder('a') 
         ->select('a') 
         ->groupBy('a.fam_libelle'); 
       }, 
      'label' => 'famille', 
      'required' => false, 
     )) 

    ; 
} 

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'Application\DriveBundle\Entity\CqsProSansMarque', 
    )); 
} 

public function getName() 
{ 
    return 'CqsProSansMarque'; 
} 

}

我控制器構造體的形式:

  $searchForm2 = $this->createForm(new CqsProSansMarqueType(), $CqsProSansMarque, array(
      'action' => $this->generateUrl('QualityPage_proSansMarque_search', array('maxItemsPerPage' => $maxItemsPerPage)), 
      'method' => 'POST', 
      'attr' => array('ray_libelle' => $CqsProSansMarque->getRayLibelle()), 
     )); 

我測試了我的$ defaultCQSsearch變量。它似乎很好設置。

回答

1

有多個選擇,你想要做什麼:

1)提交的數據存儲在會話

您可以通過兩種方式提交的數據的一種形式:

  • 使用handleRequest,在這種情況下,您通過使用提交來傳遞整個請求
  • ,在這種情況下,您直接將字段傳遞給表格

因此,爲了讓表單字段保留在會話中,您應該檢查表單是否已提交,如果沒有,請提交以前存儲在會話中的數據(從請求中克隆),這可以通過表單類來完成,也許在你的控制器中。使用事件表:: PRE_SET_DATA

可以定義修改基於會話的形式的數據(可能的實體)的事件偵聽或訂戶 here is a link that explain how to use submit method.

2)。在這種情況下,您需要在表單類或事件訂購者中注入會話(然後請求),這種選擇與第一種(與事件訂購者可重複使用)相比更加分離,但更加困難。 here how to use eventlistener or eventsubscriber to make a form dynamic

3)存儲在會話

提交的表單數據類並用它來建立新的形式(如的CreateForm的第二個參數)

最廣泛使用的方法是在第三但在會話中存在與對象反序列化有關的問題(在你的情況下,相關實體將與教條分離),因此,我建議你嘗試一下仍然有效的第一個或第二個選擇。

+0

問題與之前一樣。 preferred_choices不會將提交的表單數據類存儲在會話中或使用事件Form :: PRE_SET_DATA運行。我的對象設置了正確的值,但preferred_choices不會在字段中選擇我的值。 – darkomen 2014-11-11 14:05:46

+0

您需要編輯表單的數據而不是首選的選項 – 2014-11-11 17:16:30

+0

但是我希望我的實體字段具有先前選擇的數據和(其重要的)其他數據作爲首次使用表單的首選。在同一選擇HTML或實體字段形式中的首選選項和其他選項。 – darkomen 2014-11-12 20:12:26

相關問題