2013-09-24 7 views
8

Ich muss eine Liste der Länder abrufen, sortiert nach alphabetischer Reihenfolge. Da ich die Entität in vier Sprachen übersetzt habe (Englisch, Französisch, Spanisch und Chinesisch), habe ich gedmo doctrine extensions verwendet, um die Übersetzung zu verwalten. Das Problem ist, wenn ich diese Liste in einer Art Einheit Formularfeld holen:Abfrage im Entitätsformularfeld erstellen

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

die Ergebnisse sortiert werden als ursprüngliche Einheit (Englisch) definiert ist und nicht aktuelle locale (spanisch oder französisch), was ich wirklich brauchen. Eigentlich benutze ich $this->container->getParameter('locale')

Ich habe versucht, einen Haken in der Abfrage zu zwingen, wie here erklärt:

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

aber AFAIK funktioniert dies nur, wenn die Abfrage als dql geschrieben:

$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')); 

was von der Entität Formularfeld nicht erlaubt ist, weil es auf eine queryBuilder object wartet.

Also, ich muss meine Sammlung übersetzt und in seiner aktuellen Sprache in einem Formular sortiert bekommen. Weiß jemand, wie das erreicht werden kann?

+1

Der richtige Weg für die Übersetzung ausgewählter Felder: http://StackOverflow.com/a/14150093/1232526 – Noy

+0

@Noy: Er spricht von einem viel fortgeschritteneren Fall, der Gedmo übersetzbare Entitäten beinhaltet. Ihr vorgeschlagener Weg ist hier nicht anwendbar. – Ryall

Antwort

5

Ich hatte das gleiche Problem wie Sie. Ich weiß nicht, ob es eine bessere Lösung gibt, um das Problem zu lösen, aber es funktioniert für mich. Die Lösung überschreibt den Entitätsformulartyp.

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

Hoffe, es hilft.

+0

Wäre nützlich, wenn dies Teil der DoctrineExtensions-Bibliothek wäre. Ich habe mir einen 'TranslatableEntityType' gemacht. – Ryall