首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在实体表单字段中创建查询

在实体表单字段中创建查询
EN

Stack Overflow用户
提问于 2013-09-24 14:17:05
回答 1查看 1.8K关注 0票数 8

我需要一份国家名单,按字母顺序排列。由于我将实体翻译成四种语言(英语、法语、西班牙语和汉语),所以我使用了gedmo理论扩展来管理翻译。问题是当我在实体表单字段类型中获取此列表时:

代码语言:javascript
复制
$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')

我试图在查询中强制使用钩子,如这里所解释的

代码语言:javascript
复制
$query->getQuery()->setHint(\Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE, $this->container->getParameter('locale'));

但是AFAIK,只有当查询被写为dql时才能工作:

代码语言:javascript
复制
    $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对象

所以,我需要用他目前的语言以一种形式翻译和分类我的藏品。有人知道这是怎么实现的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-27 21:45:45

我和你有同样的问题。我不知道是否有更好的解决办法来解决这个问题,但它对我有用。解决方案是覆盖实体窗体类型。

forms.xml

代码语言:javascript
复制
<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

代码语言:javascript
复制
<?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

代码语言:javascript
复制
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();
    }
}

希望能帮上忙。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18984113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档