2012-12-04 34 views
2

我有這有一個$xmlContent屬性Candidate實體,這個屬性是用來去其他實體(國家,公民,一些參考... ),在$ xmlContent值包含這些實體的ID如下,設計我的實體,這樣我可以用一個實體領域的具體使用情況

<data> 
    <countryId>2</countryId> 
    <citizenship>4</citizenship> 
    <!-- ... --> 
</data> 

注:我知道,該模型是設計不好!我不能修改它,這是該項目怪異制約因素之一,當我開始做這個工作。

所以,我創建getter和setter爲$ xmlContent值的每個Id

問題,

我創建了一個表格編輯候選對象(包括$ xmlContent IDS),我再補充getter和setter方法來獲取這些值(getCountry(),getCitizenship()。 ..)

問題是,我想讓用戶從所有可用的國家列表中選擇Country(例如)的值,我也必須把正確的國家作爲默認的國家。

然後我決定用一個實體領域,

->add('country', 'entity', array(
     'class' => 'MyBundle:Country', 
     'query_builder' => function(CountryRepository $er) { 
      return $er->createQueryBuilder('c') 
       ->orderBy('c.rank', 'ASC'); 
     }, 
     'property' => 'Name' 
    )) 

但是,在這裏我有一個問題,我使用的是得到一個候選國,吸氣返回「ID」,但實體領域的期待目的。

我的問題,

什麼是處理這個問題的最好方法?

我的約束,

我要保持我的代碼儘可能乾淨:)

+2

您將需要創建一個處理國家和citisenship以及xmlContent中的其他任何內容的FormType。然後使用數據轉換器將xmlContent轉換爲單個字段或從單個字段轉換,即使數據轉換器返回數組。在這個問題上的一些線程和處理實體問題的食譜示例。 – Cerad

回答

0

也許你應該考慮DataTransformersEventSubscribers

你可以使用一個DataTransformer解析您xmlContent成離散性和填充他們的田地,例如countrycitizenship

使用EventSubscriber,您可以a)在PRE_BIND reverse將表單數據轉換爲xmlContent *並且b)轉換您的表單元素,例如,獲取國家並從數據中創建/更改選擇元素country。因爲你不只是想要reverseTransform,即字符串到實體,而是想要合併和轉換來自多個領域(國家,公民身份等)的數據到一個單一的領域(數據轉換器)的數據轉換器不會在這裏工作xmlContent)。

1

既然你說你添加getter和setter方法,我想你是可以修改的模型,但而不是它在數據庫或映射中的表示,我說得對嗎?

我覺得你的getter/setter方法不應返回IDS /變化xmlContent。相反,吸氣人員應該閱讀ID並如果以前沒有構建相應的實體。設置者應該修改前面的對象,並且應該實現生命週期回調,以便xmlContent在持久化之前保持最新狀態。

通過這種方式,形式很容易被綁定到你的數據。

相關問題