2013-09-24 6 views
8

Ho bisogno di recuperare un elenco di paesi, ordinati in ordine alfabetico. Poiché ho l'entità tradotta in quattro lingue (inglese, francese, spagnolo e cinese), ho utilizzato gedmo doctrine extensions per gestire la traduzione. Il problema è quando vado a prendere questa lista in un'entità di tipo campo modulo:Crea query nel campo modulo entità

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

i risultati sono ordinati come un'entità originale definito (inglese) e non parametri locali (spagnolo o francese), ciò che è ho davvero bisogno. In realtà io uso $this->container->getParameter('locale')

Ho provato a forzare un gancio nella query, come spiegato here:

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

ma per quanto ne so, questo funziona solo quando la query viene scritto come 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')); 

che non è consentito dal modulo entità archiviato, perché è in attesa di un queryBuilder object.

Quindi, ho bisogno di ottenere la mia collezione tradotta e ordinata nella sua lingua corrente in una forma. Qualcuno sa come questo può essere raggiunto?

+1

Il modo giusto di tradurre i campi selezionati: http://stackoverflow.com/a/14150093/1232526 – Noy

+0

@Noy: Sta parlando di un caso molto più avanzato, che coinvolge entità traducibili Gedmo. Il tuo suggerimento non è applicabile qui. – Ryall

risposta

5

Ho avuto lo stesso problema di te. Non so se c'è una soluzione migliore per risolvere il problema ma funziona per me. La soluzione è sovrascrivere il tipo di modulo entità.

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

Speranza che aiuta.

+0

Sarebbe utile se facesse parte della libreria DoctrineExtensions. Ho fatto il mio un 'TranslatableEntityType'. – Ryall