Как вернуть локализованное свойство сущности в Symfony 2


У меня есть сущность "Категория", содержащая

/**
 * @ORM\Column(type="string", length=255)
 */
protected $nameFr;

/**
 * @ORM\Column(type="string", length=255)
 */
protected $nameEn;

Теперь я пытаюсь отобразить локализованное имя в представлении, я могу отобразить одно или другое, используя:

{{ categories.nameFr }} and {{ categories.nameEn }}

Поэтому я создал метод под названием getName(), чтобы я мог использовать {{ categories.name }}

Мне нужно было только получить доступ к языковому стандарту, поэтому я добавил свойство protected $locale к сущности с настройщиком и получателем, и я установил языковой стандарт перед вызовом представления (кстати, я использую @Template для возврата):

$locale = $this->getRequest()->getLocale();
$categories->setLocale($locale);

return array(
    'categories' => $categories
);

Это работало, но теперь я реализован пакет разбиения на страницы KnpLabs/knppaginatorbundle, который требует отправки запроса вместо сущности:

$em = $this->getDoctrine()->getManager();

$categoriesQuery = $em->createQueryBuilder()
    ->select('category')
    ->from('OylexCategoryBundle:Category', 'category')
;

$locale = $this->getRequest()->getLocale();

$categoriesQuery->setLocale($locale);

$paginator  = $this->get('knp_paginator');
$categoriesPagination = $paginator->paginate(
    $categoriesQuery,
    $this->get('request')->query->get('page', 1),
    30
);

return array(
    'categoriesPagination' => $categoriesPagination
);

Это не удается с сообщением об ошибке: FatalErrorException: Error: Call to undefined method Doctrine\ORM\QueryBuilder::setLocale().

Если я вместо этого попробую метод setLocale() на $categoriesPagination, он завершится с сообщением об ошибке: FatalErrorException: Error: Call to undefined method Knp\Bundle\PaginatorBundle\Pagination\SlidingPagination::setLocale()

Есть ли способ передать локаль сущности? или есть еще лучший способ справиться с этой ситуацией?

Спасибо,

Author: Oylex, 2013-07-10

1 answers

Вы не должны делать что-то вроде propertyEn и propertyFr в целом.

Просто храните ваши переводы вместе со свойством локали, которое позволяет извлекать их из базы данных в запросе так же просто, как:

// example findByLocale($locale) method

->select('entity.property')
->from('AcmeMyBundle:Entity', 'entity')   
// or inside a repository $this->createQueryBuilder('entity')

->where('entity.locale = :locale')
->setParameter('locale', $locale)

Но все это уже делалось раньше...

Вам следует либо использовать Gemo\DoctrineExtensions\Переводимый, который можно легко интегрировать с symfony2 с помощью Stof\doctrineextensionsbundle

...или мой совет, если вы используете PHP 5.4+ с чертами доступные KnpLabs\Доктринальные руководства\Переводимые.

Для того, чтобы хорошо интегрировать их с вашими формами, используйте a2lix\translationformbundle.

Смотрите мой ответ здесь для быстрого ознакомления с использованием DoctrineBehaviors\Переводимого и текущего прокси-сервера локали, который я нашел действительно удобным решением.

Просто создайте класс Entity и EntityTranslation, включите прокси-строки... позвонить $entity->getProperty()

-> текущая локаль применяется автоматически. как легко как это может быть:-)

 4
Author: nifr, 2017-05-23 12:17:11