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

Posted

技术标签:

【中文标题】在实体表单字段中创建查询【英文标题】:Create query in entity form field 【发布时间】:2013-09-29 19:36:24 【问题描述】:

我需要获取按字母顺序排序的国家/地区列表。由于我已将实体翻译成四种语言(英语、法语、西班牙语和中文),因此我使用gedmo doctrine extensions 来管理翻译。问题是当我在实体表单字段类型中获取此列表时:

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

我已尝试在查询中强制使用挂钩,如 here 所述:

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

但是 AFAIK,这仅在查询写为 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 object。

因此,我需要将我的收藏翻译成他当前的语言并在表格中进行分类。有谁知道这是怎么实现的?

【问题讨论】:

翻译选择字段的正确方法:***.com/a/14150093/1232526 @Noy:他说的是一个更高级的案例,涉及 Gedmo 可翻译实体。您建议的方式在这里不适用。 【参考方案1】:

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

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

希望对你有帮助。

【讨论】:

如果这是 DoctrineExtensions 库的一部分,将会很有用。我给了我一个TranslatableEntityType

以上是关于在实体表单字段中创建查询的主要内容,如果未能解决你的问题,请参考以下文章

使用 Sonata 字段类型在 Controller 中创建表单

表单 ModelChoiceField 查询集 + 额外选择字段 django 表单

将每个子实体数据用于集合字段类型的选项

在 PayPal Payflow Link 信用卡表单中创建自定义字段

如何在 Django 中创建“填空”表单

Symfony2 将自定义字段添加到表单构建器