Как вернуть локализованное свойство сущности в 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()
Есть ли способ передать локаль сущности? или есть еще лучший способ справиться с этой ситуацией?
Спасибо,
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()
-> текущая локаль применяется автоматически. как легко как это может быть:-)