-1

関連エンティティからの値を使用して、選択 (選択) リストを出力しようとしています。Flight エンティティには、Airport エンティティとの多対 1 の関係があります。Airport エンティティには、city、country、codeIata などのいくつかのプロパティがあります。現在、これが Type の作成方法です。

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

これは問題なく動作し、次のように、Airport->codeIataをオプション ラベルとして、Airport->idを値として持つ要素を出力します。

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

しかし、私が実際に望んでいたのは、2 つのフィールドの連結、つまり IATA コードと空港名の連結を表示する選択リスト オプションです。

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

そこで、Airport エンティティ内に getLongName() という新しいメソッドを作成しました。次に、 codeIata のプロパティの値を longName に置き換えまし

これは本質的に私が望んでいたことを行います。しかし、エンティティクラスはオブジェクト自体を定義することを厳密に意図しているため、これはハックで望ましくないように思えます。その上、この方法でも getLongName メソッドに引数を送信できません ($maxlength など)。では、要素に表示されるものを操作する適切な方法は何でしょうか? これを行うには Transformer クラスを作成する必要がありますか、それとももっと簡単な方法がありますか?

4

1 に答える 1

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'
));

別の方法は実装することですが、オブジェクトの表現がIATAとその名前__toString()であるとグローバルに言うのは好きではありません。Airport

Symfony 2.1を使用している場合は、これを達成するためのより良い解決策(読み取り:クロージャー)があるかもしれません。

編集:Symfony 2.1のドキュメントを確認しましたが、まだ可能ではないようです:

これは、エンティティをHTML要素のテキストとして表示するために使用する必要があるプロパティです。空白のままにすると、エンティティオブジェクトは文字列にキャストされるため、__ toString()メソッドが必要です。

于 2012-09-21T18:34:49.633 に答える