2013-09-24 2 views
8

알파벳순으로 정렬 된 국가 목록을 가져와야합니다. 엔티티가 4 개 국어 (영어, 프랑스어, 스페인어 및 중국어)로 번역 되었기 때문에 번역을 관리하기 위해 gedmo doctrine extensions을 사용했습니다. 나는 엔티티 양식 필드 유형이 목록을 가져올 때 문제가 : 원래 엔티티 (스페인어 또는 프랑스어) (영어) 및 최신이 아닌 로케일을 정의엔티티 양식 필드에서 쿼리 만들기

$form = $builder->add('country', 'entity', 
array('class' => 'GroupCommonBundle:Country', 
     'query_builder' => function(EntityRepository $er) { 
        $query = $er->createQueryBuilder('c')->orderBy('c.name'); 
     } 

결과가 분류되어, 난 정말 무엇을 필요로한다. 사실은 내가 사용 $this->container->getParameter('locale')

here 설명 된대로 내가 쿼리에 후크를 강제로 시도했습니다

:

$query->getQuery()->setHint(\Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE, $this->container->getParameter('locale')); 

하지만를 AFAIK, 쿼리가 DQL으로 기록이 유일한 작품 :

$query = $this->getDoctrine()->getManager()->createQuery(' 
      SELECT c 
      FROM GroupCommonBundle:Country c 
      ORDER BY c.name ASC'); 
    $query->setHint(\Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE, $this->container->getParameter('locale')); 
을 기다리고 있기 때문에 제출 된 엔티티 양식에서 허용하지 않는

입니다.

그래서 내 컬렉션을 번역하고 양식의 현재 언어로 정렬해야합니다. 누구든지 이것이 어떻게 달성 될 수 있는지 알고 있습니까?

+1

선택 필드를 번역하는 올바른 방법은 다음과 같습니다. http://stackoverflow.com/a/14150093/1232526 – Noy

+0

@ 노이 : 그는 Gedmo 번역 가능 항목과 관련된 훨씬 더 고급 사례에 대해 이야기합니다. 귀하가 제안한 방법은 여기에 해당되지 않습니다. – Ryall

답변

5

나는 당신과 같은 문제가있었습니다. 나는 문제를 해결하는 더 좋은 해결책이 있는지 모르지만 그것은 나를 위해 일한다. 솔루션은 엔티티 양식 유형을 대체합니다.

forms.xml

<service id="acme.form.type.entity" class="Acme\AcmeBundle\Form\Type\EntityType"> 
    <tag name="form.type" alias="entity" /> 
    <argument type="service" id="doctrine" /> 
</service> 

EntityType.php

<?php 

namespace Acme\AcmeBundle\Form\Type; 

use Doctrine\Common\Persistence\ObjectManager; 
use Symfony\Bridge\Doctrine\Form\Type\DoctrineType; 

use Acme\AcmeBundle\Doctrine\Form\ChoiceList\ORMQueryBuilderLoader; 

class EntityType extends DoctrineType 
{ 
    public function getLoader(ObjectManager $manager, $queryBuilder, $class) 
    { 
     return new ORMQueryBuilderLoader($queryBuilder, $manager, $class); 
    } 

    public function getName() 
    { 
     return 'entity'; 
    } 
} 

ORMQueryBuilderLoader.php

namespace Acme\AcmeBundle\Doctrine\Form\ChoiceList; 

use Symfony\Bridge\Doctrine\Form\ChoiceList\ORMQueryBuilderLoader as BaseORMQueryBuilderLoader; 

class ORMQueryBuilderLoader extends BaseORMQueryBuilderLoader 
{ 
    private $queryBuilder; 

    public function __construct($queryBuilder, $manager = null, $class = null) 
    { 
     parent::__construct($queryBuilder, $manager, $class); 

     $this->queryBuilder = $queryBuilder($manager->getRepository($class)); 
    } 

    public function getEntities() 
    { 
     $query = $this->queryBuilder->getQuery(); 

     $query->setHint(
      \Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER, 
      'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker' 
     ); 

     return $query->execute(); 
    } 
} 

는 도움이되기를 바랍니다.

+0

이것이 DoctrineExtensions 라이브러리의 일부인 경우 유용합니다. 내 번역문을 'TranslatableEntityType'으로 만들었습니다. – Ryall

관련 문제