Создать запрос в поле формы сущности

Мне нужно получить список стран, отсортированных по алфавиту. Поскольку у меня есть перевод объекта на четыре языка (английский, французский, испанский и китайский), я использовал расширения доктрины gedmo для управления переводом. Проблема в том, что когда я получаю этот список в типе поля формы объекта:

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

Я пытался принудительно включить ловушку в запросе, как объяснено здесь:

$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.

Итак, мне нужно, чтобы моя коллекция была переведена и отсортирована на его текущем языке в форме. Кто-нибудь знает, как этого можно добиться?


person Manu    schedule 24.09.2013    source источник
comment
Правильный способ перевода выбранных полей: stackoverflow.com/a/14150093/1232526   -  person Noy    schedule 28.11.2013
comment
@Noy: Он говорит о гораздо более сложном случае, связанном с переводимыми объектами Gedmo. Предложенный вами способ здесь не применим.   -  person Ryall    schedule 13.04.2016


Ответы (1)


У меня была такая же проблема, как у вас. Я не знаю, есть ли лучшее решение для решения проблемы, но оно работает для меня. Решение переопределяет тип формы сущности.

формы.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();
    }
}

Надеюсь, поможет.

person Sfblaauw    schedule 27.02.2014
comment
Было бы полезно, если бы это было частью библиотеки DoctrineExtensions. Я сделал свой TranslatableEntityType. - person Ryall; 13.04.2016