Symfony2 Gedmo可与APY DataGrid和KNP Paginator进行翻译

时间:2014-10-24 10:15:59

标签: symfony translation query-cache doctrine-extensions knppaginator

我在使用Gedmo \ DoctrineExtensions Translatable时遇到了一些问题。

首先是APY DataGrid - 无法在非默认语言环境中显示网格中的翻译字符串。如果我使用Translatable默认设置,则网格中的所有字符串都以默认语言显示。如果我在实体中实现Translatable并为表和其他东西添加注释,那么我可以在网格中看到翻译的字符串,但在切换语言环境之后这些保持不变。好像使用了QueryCache,但找不到如何设置不使用它。这是网格的一部分:

use APY\DataGridBundle\Grid\Source\Entity;

<...>

$source = new Entity('MainBundle:Entity');
$source->addHint(\Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER, 'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker');

当然,最好不要为它们制作注释和单独的实体。

第二个问题是KNP分页。实际上没有深入研究,但类似的问题。

主要问题是,当我通过实体的可翻译字段运行某些查询时。假设我有一个名为Krepšinis的实体(这是立陶宛语中的篮球),我已将此字符串翻译为 Basketball 。默认语言为 LT 。在默认语言中我执行搜索时,一切正常,但如果我将区域设置更改为 EN 并尝试搜索购物篮,则不会返回任何结果,如果我搜索 krep ,它会返回 Basketball 。搜索代码:

// Controller

$repository = $this
    ->getDoctrine()
    ->getManager()
    ->getRepository('MainBundle:Entity');

$query = $repository
    ->search($term)
    ->getQuery()
    ->useQueryCache(false)
    ->setHint(\Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER, 'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker');



// Repository

public function search($query)
{
    $qb = $this->createQueryBuilder('t');
    $term = $qb->expr()->literal('%' . $query . '%');
    $query = $qb->where($qb->expr()->like('t.name', $term));

    return $query;
}

感谢任何帮助

1 个答案:

答案 0 :(得分:0)

如果内容已翻译,则需要使用查询提示,因为您已经完成了。但是为了让它针对不同的语言环境进行缓存,您需要将语言环境提示设置为查询:

<?php
// hint the locale in order to make query cache id unique
$query->setHint(
    \Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE,
    'en' // take locale from session or request
);

documentation中对此进行了详细介绍。 ORM查询缓存基于DQL,查询参数和查询提示。