2013-09-24 27 views
8

Tôi cần tìm nạp danh sách các quốc gia, được sắp xếp theo thứ tự bảng chữ cái. Vì tôi có thực thể được dịch sang bốn ngôn ngữ (tiếng Anh, tiếng Pháp, tiếng Tây Ban Nha và tiếng Trung), tôi đã sử dụng gedmo doctrine extensions để quản lý bản dịch. Vấn đề là khi tôi lấy danh sách này trong một loại lĩnh vực hình thức tổ chức:Tạo truy vấn trong trường biểu mẫu thực thể

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

kết quả đều được sắp xếp như một thực thể ban đầu được xác định (tiếng Anh) chứ không phải hiện tại địa phương (Tây Ban Nha hoặc tiếng Pháp), những gì là tôi thực sự cần. Trên thực tế tôi sử dụng $this->container->getParameter('locale')

tôi đã cố gắng để buộc một cái móc trong truy vấn, như được giải thích here:

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

nhưng AFAIK, điều này chỉ hoạt động khi truy vấn được viết như 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')); 

không được biểu mẫu thực thể cho phép, vì nó đang đợi queryBuilder object.

Vì vậy, tôi cần phải dịch bộ sưu tập của mình và được sắp xếp theo ngôn ngữ hiện tại của anh ấy dưới dạng. Bất cứ ai cũng biết làm thế nào điều này có thể đạt được?

+1

Cách dịch đúng các trường được chọn: http://stackoverflow.com/a/14150093/1232526 – Noy

+0

@Noy: Anh ấy đang nói về một trường hợp nâng cao hơn nhiều, liên quan đến các thực thể dịch Gedmo. Cách được đề xuất của bạn không áp dụng ở đây. – Ryall

Trả lời

5

Tôi gặp vấn đề tương tự như bạn. Tôi không biết nếu có một giải pháp tốt hơn để giải quyết vấn đề nhưng nó làm việc cho tôi. Giải pháp là ghi đè loại biểu mẫu thực thể.

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

Hy vọng nó giúp.

+0

Sẽ hữu ích nếu đây là một phần của thư viện DoctrineExtensions. Tôi đã tạo cho tôi một 'TranslatableEntityType'. – Ryall

Các vấn đề liên quan