2013-09-24 6 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')); 

しかしを私の知る限り、クエリは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')); 
queryBuilder objectを待っているため、エンティティフォームで許可されていない

があります。

私は自分のコレクションを現在の言語でフォームに翻訳してソートする必要があります。これがどのように達成されるのか誰もが知っていますか?

+1

選択フィールドを正しく翻訳する方法:http://stackoverflow.com/a/14150093/1232526 – Noy

+0

@Noy:彼は、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

関連する問題