2013-01-24 2 views
2

Symfony 2.1에서 optgroups로 선택 상자를 표시하려고합니다. 내 개체 트리입니다 : 클라이언트가 프로젝트를 진행하고, 프로젝트는 부품 (Part->getProject()->getClient())Symfony2 : 엔티티 필드에서 group_by 옵션 사용

내 선택 상자이 방법으로 표시 할이 있습니다

<select> 
    <optgroup>Client name 
     <option>Part name</option> 
     <!-- ... --> 
    </optgroup> 
    <!-- ... --> 
</select> 

심포니 문서가 많은 도움하지 않습니다.

$this->createFormBuilder() 
->add('part','entity',array(
    'class'   => 'SGLFLTSPartBundle:Part', 
    'property'  => 'name', 
    'query_builder' => function (\SGL\FLTS\PartBundle\Entity\PartRepository $er) { 
     return $er->createQueryBuilder('p'); 
    })) 
->getForm(); 

가 어떻게 클라이언트 이름을 표시합니다 GROUP_BY 옵션을 추가하려면 : 내 이 (GROUP_BY 옵션없이) 양식 빌더를 작업하는 날은 간단한 선택 준다? 지금까지 내가 또한 프로젝트의 이름을 표시 만 OPTGROUP로, 운이 시도하지했습니다

'group_by'  => 'project.client.name' 
'group_by'  => 'project.client' 
'group_by'  => 'ppc.name' // the DQL table alias 

모든

는 PHP 오류를 줄 시도했다 :

'group_by'  => 'project' 
'group_by'  => 'project.name' 
'group_by'  => 'project.id' // throws no error, giving me <optgroup label="1"> ... 

및 추가 프로젝트를 시도/클라이언트는 createQueryBuilder에서 조인합니다.

$er->createQueryBuilder('p')->select('p, pp')->leftJoin('p.project','pp'); 
$er->createQueryBuilder('p')->select('p, pp.name')->leftJoin('p.project','pp') 
// wrong 

고마워요!

답변

6

오늘도 비슷한 문제가있었습니다.

내가 Object를 Array 키로 잘못 사용한 것과 관련된 많은 PHP 오류를 보았다고 상상해보십시오. 이것은 Symfony가 그룹화 된 결과 배열에서 전체 관련 객체를 배열 키로 사용하려고하기 때문에 발생합니다.

내가 더 나은 솔루션을하지만,이 한편에 대한 그것으로 더 볼 필요가 있습니다 내가 다음과 같습니다 getClientName라고

Part 기업에 새로운 방법을 추가 ... 사용하고 무엇 :

public function getClientName() 
{ 
    // safety measure in-case a part hasn't been assigned to a project 
    if (null === $this->getProject()) { 
     return null; 
    } 
    // safety measure in-case a project hasn't been assigned to a client 
    if (null === $this->getProject()->getClient()) { 
     return null; 
    } 
    return $this->getProject()->getClient()->getName(); 
} 

는 양식 필드 빌더에 clientNamegroup_by 옵션을 설정합니다

$this->createFormBuilder() 
->add('part','entity',array(
    'class'   => 'SGLFLTSPartBundle:Part', 
    // this property will be processed by Symfony as `$part->getClientName()` 
    'property'  => 'clientName', 
->getForm(); 

이 추가 메서드를 사용하는 배경은 Symfony에게 문자열 값을 얻기 위해 호출 할 수있는 클래스 메서드를 제공하여 그룹화를 수행하는 것입니다.

다른 누군가가 좀 더 우아한 해결책을 갖고 있다면 나는 그것을보고 싶어 할 것입니다.

+0

감사합니다. 'group_by'옵션을 추가하여 업데이트했습니다 ('속성'을 작성했습니다). 또한 "엔터티를 찾을 수 없습니다."라는 오류가 발생했습니다. 쿼리 내부에서 조인하지 않아도됩니다. – sglessard

+0

''group_by '=>'clientName'' 옵션 뒤에있는 아이디어는 다음과 같습니다. 120 행의 ObjectChoiceList 클래스는이 객체 속성 (또는 클래스 메소드)을 사용하여 객체를 그룹화합니다. DQL의 조인에서 직접 클라이언트의 제목을 가져올 수 없기 때문에이 값을 반환하는 getClientName 메서드가 필요했습니다. DQL에서 관련 개체를 조인하면 관련 개체가 이미 초기화되어 있어야하며 컬렉션의 각 엔터티에 대해 DB에 대한 호출이 필요하지 않습니다. 'property' 옵션은 여전히'group_by'이어야합니다. 내 사례는 환경에 맞게 변경해야합니다. – Iain

+1

네, 이해합니다.그럼에도 불구하고'createFormBuilder' 예제 배열은 이전처럼 수정해야합니다 :' 'property'=> 'name', 'group_by'=> 'clientName', ' – sglessard