2013-07-25 35 views
0

所以我試圖構建這個有售票系統的應用程序。每個門票實體都有一個類別。這一切都很好,但我想在填寫新票時爲每個類別設置單獨的表單域。另外,我想讓他們可配置。這是概念應該是什麼樣子(例如):symfony2:使用可定製的表單域生成擴展類實體

Category1 form: Ticket Form + Amount + Starting Date 

Category2 form: Ticket Form + Point of Contact (choice) + etc... 

因此用戶選擇的類別和形式會動態改變。我目前已經設置了每個類別都是獨立實體的地方,還有一個表單監聽器,它根據用戶選擇的內容添加適當類別的子表單。問題是所有這些都是硬編碼的。我想有一些工具,可以編輯/添加/刪除類別及其表單域。例如,我希望有一天在Category2中添加一個「金額」字段。

對於如何做到這一點,我沒有太多的想法,沒有爲每個類別生成單獨的實體。我正在考慮將一個名爲TicketCategory的實體與Custom1,Custom2,Custom3等字段進行比較,這些字段代表了某些配置文件中定義的不同表單字段。問題在於字段類型。我會有一個日期/數字/字符串/等的大混合...

有沒有人有任何建議,如何甚至解決這個想法?

回答

0

我有一個應用程序,裁判可以註冊不同的比賽。對於每場比賽,我需要提出一系列不同的問題。所以我將問題轉移到yaml文件中,並添加了足夠的信息,以便我可以動態地創建表單元素。所以基本上我想有:

# tourn.yml 
tourns: 

    opencup: 
     desc: "USSF Open Cup 2013 - Decatur, Alabama - April 12, 13, 14" 

     plan: 
      lodgingNights: 
        Fri: 
         type:  radio 
         label:  Lodging Friday Night 
         date:  '2013-04-12' 
         choices: [No: No, Yes: Yes] 
         default: No 
        Sat: 
         type:  radio 
         label:  Lodging Saturday Night 
         date:  '2013-04-13' 
         choices: [No: No, Yes: Yes] 
         default: No 

      availabilityDays: 
        Fri: 
         type:  select 
         label:  Availability Friday 
         date:  '2013-04-12' 
         default: None 
         choices: 
          None:  None 
          Evening: Kickoff 5PM 
          Not Sure: Not Sure 
         etc 

所以計劃陣最終被傳遞到計劃子窗體這反過來又創造所有單個表單元素。然後我有一個單獨的計劃實體,它將所有單獨的選擇存儲在一個數組數據庫列中。似乎工作正常。

============================================== =========================

評論需要更多的代碼。這是我的「動態」 PlanFormType」

class PlanFormType extends AbstractType 
{ 
protected $metaData = null; 

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

public function setMetaData($data) { $this->metaData = $data; } 
public function getMetaData( ) { return $this->metaData; } 

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $items = $this->getMetaData(); 

    foreach($items as $name => $item) 
    { 
     $isChoice = false; 

     switch($item['type']) 
     { 
      case 'radio': 
       $isChoice = true; 
       $expanded = true; 
       $multiple = false; 
       $attr = array('class' => 'radio-medium'); 
       break; 

      case 'select': 
       $isChoice = true; 
       $expanded = false; 
       $multiple = false; 
       $attr = array(); 
       break; 

      case 'text': 

       $attr = array(); 

       if (isset($item['size'])) $attr['size'] = $item['size']; 

       $builder->add($name,'text',array(
        'label' => $item['label'], 
        'required' => false, 
        'attr'  => $attr, 
       )); 
       break; 

     } 
     if ($isChoice) 
     { 
      $builder->add($name,'choice',array(
       'label'  => $item['label'], 
       'required' => false, 
       'empty_value' => false, 
       'choices'  => $item['choices'], 
       'expanded' => $expanded, 
       'multiple' => $multiple, 
       'attr'  => $attr, 
      )); 
     } 
    } 
} 
} 
+0

是否可以張貼一些代碼的呢?這是真的很有幫助。我試圖弄清楚如何將其保存在控制器中。我有我的窗體票務實體,但希望將此作爲子表單。 –