2013-03-10 88 views
3
一組用於一個屬性實體字段的

Product實體具有以下結構:在Symfony的2

private $id; 

private $title; 

/** 
* @ManyToOne(targetEntity="Category") 
* @JoinColumn(name="cat_id", referencedColumnName="id") 
*/ 
private $category; 

Category具有嵌套結構。和築巢的每個級別顯示在5個獨立的領域:

enter image description here

在課堂形式的代碼,我解決它以這樣的方式

$builder 
->add('cat_1', 'entity', array(
    ... 
    'query_builder' => function() { return someSelectLogic1(); } 
)) 
->add('cat_2', 'entity', array(
    ... 
    'query_builder' => function() { return someSelectLogic2(); } 
)) 
->add('cat_3', 'entity', array(
    ... 
    'query_builder' => function() { return someSelectLogic3(); } 
)) 
->add('cat_4', 'entity', array(
    ... 
    'query_builder' => function() { return someSelectLogic4(); } 
)) 
->add('cat_5', 'entity', array(
    ... 
    'query_builder' => function() { return someSelectLogic5(); } 
)) 

現在我需要知道哪些字段填入最後一個回合並在實體屬性中傳遞該字段的值。

在所有我不喜歡:

  • 複雜的邏輯來確定哪些場與類別填充在端

  • 這些字段的不依賴於所述實體'mapped' => false

1)什麼正確的方式來組織我的表單的代碼?

2)有沒有辦法將這些字段放入一個單獨的類,它將處理確定哪個類別被選中的邏輯?

回答

3

我建議如下:

1)創建一個新的自定義表單字段類型,並把所有這些entity在那裏。

該過程與普通的表單類型的創建沒有多大區別。只需將這些字段放在它自己的buildForm()中,那應該可以做到。 Docs

2)標記所有那些entity字段與屬性 「property_path =>false」。

顯然你不會在模型中存儲這些值。

3)增加兩個字段:chosenlastOne。現在

,這可能會非常棘手:我要麼設置chosentext類型(基本,通用型)或將使用entity爲好。如果你去尋找entity你需要包括所有可能的答案所有實體字段。至於lastOne將其設置爲text,因爲它將反映最後選擇哪個字段(按名稱)。

無論哪種方式,這兩個領域將是不可見的。不要忘記設置property_pathfalselastOne字段。

4)最後,添加ValueTransformerdocs),其中將包含邏輯以「查看」最後選擇哪個字段。現在

,我處理它只有一次,不明白它只是相當尚未,所以最好的辦法是試錯法,根據官方文檔的例子,可惜

基本上你應該做的是,在價值變換器內,讀取lastOne的值。這會給你最後選擇的字段的名稱。然後,使用該值,讀取所選的實際上一個值。最後,設置該值(對象,如果你已經去過entity類型,或者它的ID是否則)到chosen字段。

這應該基本上做的事情。

至於JS,我不知道你是否使用任何框架,但我會假設jQuery。您需要設置lastOne字段作爲您在表單中選擇的項目。

$(function(){ 
    $('#myform').find('select').on('change', function(){ 
     var $this = $(this); 
     $this.closest('form').find('#__ID_OF_YOUR_LASTONE_FIELD').val($this.attr('name')); 
    }); 
}); 

對不起,我現在無法爲您提供PHP的代碼示例。這裏有點晚了,明天我會盡力進一步更新這個答案。