2014-02-24 38 views
2

嗨stackexchange用戶,如何將兩個symfony表單字段映射到一個模型方法?

我有一個數據(模型)類,它有兩個方法,看起來是這樣的:

class ContactDetails { 

    public function setWebsite($address, $type) { 
    //do something... 
    } 

    public function getWebsite($type) { 
    //do something... 
    } 

} 

現在我想創建一個表單,用戶可以輸入一個網站地址,爲地址選擇一種類型(例如「私人」或「商業」)。

要做到這一點我創建了一個自定義窗體類型這樣

class ContactDetailsType extends AbstractType { 

    public function buildForm(FormBuilderInterface $builder, array $options) { 
     $builder 
     ->add('type', 'text') //better: choice, but for the sake of demo... 
     ->add('website', 'text') 
     ; 

    } 

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

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

然後控制器看起來是這樣的:

public function indexAction(Request $request) { 
    //generate completely new cost unit 
    $costunit = new ContactDetails(); 

    //generate form 
    $form = $this->createForm(new ContactDetailsType(), $costunit); 
    $form->add('save', 'submit'); 

    $form->handleRequest($request); 

    if ($form->isValid()) { 
     //yay! 
    } 

} 

這顯然是行不通的,因爲表單組件沒有按不知道如何將這兩個字段從類型映射到數據模型類。

問題:將表單的兩個字段的數據映射到數據模型類中的一個方法調用的最佳實踐是什麼,反之亦然?

+0

在哪裏合併這兩個字段的方法被調用?可能最好只是將這兩個字段添加到實體(類型和地址)以及它們必需的setter和getter,以及另一個調用字符串(或任何您需要的)的方法,這兩個getter都是並置的。 –

+0

另外 - 我認爲你可以逃脫''選擇'(http://symfony.com/doc/current/reference/forms/types/choice.html)''類型'的字段類型。 –

回答

2

在你的地方,我會讓這兩個領域虛擬的形式,然後使用事件監聽器來設置實體數據。

Info about form events

+0

這是一個可行的解決方案:使用'mapped'=> false設置兩個字段,然後使用POST_SUBMIT事件偵聽器將值寫入模型數據。 – user3346919

相關問題