2016-08-01 125 views
0

我想加載兩個選擇列表,第二個加載僅基於第一個選擇的一些值。但是我的問題首先出現......如何從與當前類(表單類類)不直接相關的類中加載第一個列表中的EntityType值。如何從Symfony中的其他實體獲取選擇選項

->add(
    'cliente', 
    EntityType::class, 
    array(
     'class' => 'AppBundle:Cliente', 
     'choice_label' => 'nombre', 
    ) 
) 

但沒有一個人cliente「在這個領域的實體,所以它拋出,你知道的消息......

無論屬性「cliente」,也不是方法「getCliente一個( )「 」cliente()「,」isCliente()「,」hasCliente()「,」__get()「存在並且在類」AppBundle \ Entity \ Envio「中擁有公共訪問權限。

請問,你知道如何解決這個問題嗎?歡迎任何幫助!

+0

'mapped'=>'false'? – abdiel

+0

它的工作原理!你知道如何添加一個事件監聽器嗎?我試圖訪問這個映射字段,但它不會出現在數據或表單中(event-> getData或event-> getForm)。我想這一點: $ builder-> GET( 'cliente') - >的addEventListener( FormEvents :: POST_SET_DATA, 功能(FormEvent $事件){$ 形成= $事件 - > getForm(); $數據= $事件 - >的getData(); 轉儲($形式); .... – jmunozco

+0

我張貼了錯誤的答案檢查獲得非映射字段的方式,並試圖 – abdiel

回答

0

根據你的錯誤,你的表單是Envio的實體。如果你想創建一個基於Cliente實體的EntityType選擇列表,你需要一個學說的關係在你的Envio類:

class Envio 
{ 
    /* 
     * @ORM\ManyToOne(targetEntity="Cliente") 
     */ 
    protected $cliente; 

錯誤沒有關係,你的問題關於有2個choicelists和改變的選擇您的第二個列表基於第一個選擇。您可能最好使用JavaScript,因此您將有許多選擇,從AJAX到限制動態選擇取決於值或innerText。

+0

對不起,我沒這個關係是Envio - Tarifa - Cliente之間的關係,所以Envio和Tarifa實體是相關的,但不是直接的。我想要做的是選擇Cliente,然後只加載它們(選擇Cliente的)Tarifa選項。 – jmunozco

+0

但是,如果我明白correctl您是否希望Envio實體最終擁有選定的客戶端?這似乎是你在表格中所做的。要用Symfony/Doctrine做到這一點,至少需要我在我的答案中描述的關係。使用這個ManyToOne和 - > add('cliente')在你的表單中,你將得到至少一個完整的客戶列表。然後,您可以使用javascript更改基於'tarifa'的前一個選擇的完整列表。 –

+0

不,Envio實體沒有客戶端,它有一個tarifa(票價),並且tarifa屬於客戶端。所以客戶與Envio實體沒有直接關係。我發現這個http://stackoverflow.com/questions/10186185/symfony2-chained-selectors,我現在正在嘗試...希望它的作品... – jmunozco

0

對於您需要現場爲錯誤「映射」 =>假,所以:

->add(
    'cliente', 
    EntityType::class, 
    array(
     'class' => 'AppBundle:Cliente', 
     'choice_label' => 'nombre', 
     'mapped' => false 
    ) 
) 

然後用於獲取財產的控制器,你必須做到:

$cliente = $form->get('cliente')->getData(); 

希望這對你有幫助。

+0

我需要獲得EnvioType類中的客戶端。當'cliente'字段發生變化時,它必須觸發一個事件來加載下一個輸入選項...你知道如何從addEventListener函數中的EnvioType類訪問該字段嗎?謝謝! – jmunozco

相關問題