2013-09-24 17 views
8

Potrzebuję pobrać listę krajów, posortowaną według kolejności alfabetycznej. Ponieważ podmiot został przetłumaczony na cztery języki (angielski, francuski, hiszpański i chiński), użyłem gedmo doctrine extensions w celu zarządzania tłumaczeniem. Problemem jest to, kiedy pobrać tę listę w polu typu forma jednostki:Utwórz zapytanie w polu formularza jednostki

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

wyniki są klasyfikowane jako oryginalna jednostka zdefiniowana (w języku angielskim), a nie bieżące locale (hiszpański lub francuski), co jest naprawdę potrzebne. Właściwie używam $this->container->getParameter('locale')

Próbowałem zmusić hak w zapytaniu, jak wyjaśniono here:

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

ale AFAIK, to działa tylko wtedy, gdy zapytanie jest napisane jak 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')); 

która jest niedozwolona przez formularz encji, ponieważ czeka na queryBuilder object.

Potrzebuję więc, aby moja kolekcja została przetłumaczona i posortowana w jego obecnym języku w formie. Ktoś wie, jak można to osiągnąć?

+1

Właściwy sposób tłumaczenia wybranych pól: http://stackoverflow.com/a/14150093/1232526 – Noy

+0

@Noy: Mówi o znacznie bardziej zaawansowanym przypadku, obejmującym obiekty do tłumaczenia Gedmo. Twój sugerowany sposób nie ma zastosowania tutaj. – Ryall

Odpowiedz

5

Miałem ten sam problem co ty. Nie wiem, czy istnieje lepsze rozwiązanie tego problemu, ale działa to dla mnie. Rozwiązaniem jest nadpisanie typu formularza jednostki.

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(); 
    } 
} 

Nadzieję, że to pomaga.

+0

Byłoby przydatne, gdyby było częścią biblioteki DoctrineExtensions. Zrobiłem mój 'TranslatableEntityType'. – Ryall

Powiązane problemy