2012-09-21 2 views
0

관련 엔터티에서 오는 값으로 선택 (선택) 목록을 출력하려고합니다. Flight 엔티티에는 Airport 엔티티와 다 대일 관계가 있습니다. 공항 엔티티에는 city, country, codeIata와 같은 여러 속성이 있습니다. 지금,이 유형은 만드는 방법입니다 : 이것은 잘 작동선택 필드 유형에서 값을 사용자 정의하는 올바른 방법은 무엇입니까?

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

하고 출력 할 수있는 옵션 라벨로 공항 -> codeIata 및 값으로 공항 -> 아이디와 요소 과 같이, : 그러나 나는 실제로 원하는 것은

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

선택 목록 옵션이 개 분야, 즉 IATA 코드 후 공항 이름, 예를 들어의 연결을 표시합니다

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

그래서 나는 나를 위해 이런 짓을 getLongName()가 호출 내 공항 실체, 내부에 새로운 방법을 만들었습니다. 그런 다음 codeIata의 속성 값을 longName으로 바꿨습니다.

이것은 본질적으로 내가 원하는 것입니다. 하지만 나에게 이것은 해커처럼 보이고 바람직한 것은 아니다. 엔티티 클래스는 객체 자체를 정의하기위한 것이기 때문에 바람직하지 않다. 그 위에 ($ maxlength 또는 너무) 같은 방법으로 getLongName 메서드에 대한 모든 인수를 보낼 수 없습니다. 그러면 요소에 표시된 내용을 조작하는 올바른 방법은 무엇입니까? 이렇게하려면 Transformer 클래스를 만들어야합니까, 아니면 더 간단한 방법이 있습니까?

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

그런 다음 엔티티 양식 유형으로 사용 : 유일한 해결책은 새로운 방법을 구현하는 것 AFAIK 당신이 심포니의 커널 2.0.x를 사용하는 가정

답변

1

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

대안이 것 __toString()을 구현하고 있지만, 전 세계적으로 말하는 것은 Airport 객체의 표현인데 IATA와 그 이름을 더한 것입니다.

Symfony 2.1을 사용하는 경우 더 좋은 해결책 (읽기 : 폐쇄)이 필요합니다.

편집 : 나는 심포니 2.1에 대한 문서를 확인한 결과는 아직 불가능 보인다 :이 텍스트로 엔티티 을 표시하는 데 사용되어야하는 속성입니다

HTML 요소. 비워두면 엔티티 객체는 문자열로 변환되므로 __toString() 메소드가 있어야합니다.