2012-09-21 21 views
0

我試圖輸出一個選擇(選擇)列表,其值來自相關實體。在Flight實體中,與機場實體存在多對一關係。機場實體有幾個屬性,如城市,國家,代碼Iata。眼下,這是怎樣的類型創建:在選擇字段類型中自定義值的正確方法?

$builder->add('origin', 'entity', array('label' => 'Origin Airport', 'class' => 'FlightcaseBookingBundle:Airport', 'property' => 'codeIata')); 

這工作得很好,並且它會輸出與機場 - > codeIata作爲選項標籤和機場 - > ID爲值的元素,像這樣:

<option value="1234">CDG</option> 

但我其實想的是選擇列表中的選項來顯示2場,分別是國際航空運輸協會代碼,然後在機場的名稱,例如串聯

<option value="1234">CDG - Paris Charles de Gaulle</option> 

於是我叫我getLongName()機場實體,這樣做是爲了我的內心產生了一種新方法。然後,我將codeIata的屬性值替換爲longName

這基本上做我想要的。但對我來說,這看起來很詭異,而且也不可取,因爲實體類嚴格意味着定義對象本身。最重要的是,我不能以這種方式向getLongName方法發送任何參數(如$ maxlength左右)。那麼操縱元素中顯示內容的正確方法是什麼?我需要創建一個Transformer類來做到這一點,還是有一個更簡單的方法?

回答

1

假設你正在使用的Symfony 2.0.x的,AFAIK唯一的解決辦法將被執行的新方法:

class Airport 
{ 
    public function getChoiceLabel() 
    { 
     return sprintf('%s - %s', $this->codeIata, $this->name); 
    } 
} 

然後用實體形式類型使用:

$builder->add('origin', 'entity', array(
    'label' => 'Origin Airport', 
    'class' => 'FlightcaseBookingBundle:Airport', 
    'property' => 'choice_label' 
)); 

另一種做法正在執行__toString(),但我不喜歡全球性地表示Airport表示反對它是IATA加上它的名字。

如果你正在使用Symfony 2.1,也許有一個更好的解決方案(閱讀:閉包)來實現這一點。

編輯:我已經檢查過的Symfony 2.1的文檔,並且它似乎是沒有可能的:

這是應該用於顯示實體 作爲文本屬性HTML元素。如果留空,實體對象將被投射到一個字符串 ,所以必須有一個__toString()方法。

相關問題