2013-07-03 64 views
0

我在Symfony2中創建表單。我想對它做一些動態的事情。根據所選字段的動態表單更改

假設用戶選擇某個類別,然後根據他的選擇,下一個列表將顯示所選類別的子類別。然後,在選擇一個子類別後,會顯示其產品的下一個列表,然後會顯示更多與產品等相關的選擇......我如何實現這一目標,甚至應該如何開始?我不知道,因爲symfony2中的所有內容都是爲服務器端操作定製的。做單獨的表單可能沒有用處,因爲我需要一次驗證所有內容(處理handleRequest將是一場噩夢),並以某種方式將數據存儲在數據庫中。

任何建議,意見,文章等?

+0

從這裏開始:http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html – cheesemacfly

回答

0

您可以發送一個帶有{{path}}的AJAX請求作爲URL,它將被symfony2處理,並使用與活動類別相關的選項呈現json或數組。我希望這是有用的。

+0

對不起,但我不知道這將如何有用。 Symfony自己生成所有選項,我想動態執行它。我當然可以清除表格中的所有選項,但這會非常愚蠢。讓所有數據根據類別加載完全相同的數據(其中的一部分)? – user2394156

+0

第一次請求,您將獲得:帶有所有選項的類別(combo1)以及與所選類別(combo2)相關的元素。在更改$(類別),您發送所選類別的id與AJAX,並準備一個動作,以發送回與選定的實際類別相關的元素,並用js填充組合2 – user2541648

0

在這裏,您可以在需要時修改表單。

第一種形式包含的類別,當用戶選擇一個類別,形式是,如果一個類別設置發送(阿賈克斯)和pre_bind檢查的事件,如果它的設置,你添加一個字段的子類

例如:

class CategoryEventSubscriber implements EventSubscriberInterface 
{ 
    protected $factory; 

    public function __construct(FormFactory $factory) 
    { 
     $this->factory = $factory; 
    } 

    public function preBind(FormEvent $event) 
    { 
     $form = $event->getForm(); 
     $data = $event->getData(); 

     $levelOne = isset($data['categoryLevelOne']) ? $data['categoryLevelOne'] : null; 

     if (!empty($levelOne)) { 
      $form->add($this->factory->createNamed('categoryLevelTwo')); 
     } 

     // level n+1 ...  
    } 

    public static function getSubscribedEvents() 
    { 
     return array(FormEvents::PRE_BIND => 'preBind'); 
    } 
} 

在你窗體添加事件訂閱

$builder->addEventSubscriber(new CategoryEventSubscriber($builder->getFormFactory())); 
+0

好的例子,謝謝! – user2394156

相關問題