Я успешно использую StofDoctrineExtension Bundle для работы с переводами сущностей.
Поэтому мои свойства в сущностях имеют аннотацию @Translable — выше.
Когда я хочу показать сущность на определенном языке со связанными сущностями (для которых существует запись перевода в базе данных), я получаю следующую проблему:
Предполагается, что у меня есть сущность автора, которая сопоставлена с сущностью контакта (OneToOne), и я хочу показать подробности об авторе на языке «fr_fr», я использую следующий код:
$author = ...;
$author->setTranslatableLocale('fr_fr');
$this->get('fos_user.entity_manager')->refresh($author);
Этот код переводит автора на язык «fr_fr», но сопоставленная контактная сущность не переводится на целевой язык «fr_fr». Я, конечно, уже использую опцию cascade = refresh в отображении сущности автора на контакт:
/**
* @ORM\OneToOne(targetEntity="AuthorContact", inversedBy="author",
cascade={"persist", "remove", "refresh"})
* @ORM\JoinColumn(name="contact_id", referencedColumnName="id")
*/
protected $contact;
Когда я использую следующие «дополнительные строки» в моем контроллере для выборки для автора, я получаю перевод для обеих сущностей:
$author = ...;
$author->setTranslatableLocale('fr_fr');
$author->getContact()->setTranslatableLocale('fr_fr');
$this->get('fos_user.entity_manager')->refresh($author);
$this->get('fos_user.entity_manager')->refresh($author->getContact());
На мой вкус, это довольно некрасиво И почему это не работает, если в любом случае вы используете опцию «cascade = refresh»?
@edit: я думаю, что это ошибка каскадного обновления?
С уважением.
Проблема заключается не в сохранении каскада, а в каскадной локализации. Там нет такой способности, упомянутой в документах. В вашем случае перевод выполняется TranslatableListener
в postLoad
событие. Определить локаль getTranslatableLocale метод используется.
Есть несколько способов заставить вышеуказанный код работать.
Определите каскадное сохранение в setTranslatableLocale
метод
публичная функция setTranslatableLocale ($ locale)
{
$ this-> locale = $ locale;
$ This-> контактно> setTranslatableLocale ($ локали);
}
Не используйте @Locale
аннотации и полагаться на locale
из TranslatableListener
:
$ This-> translatableListener-> setTranslatableLocale ( ‘fr_FR’);
Это будет работать для обоих: TranslatableListener
а также TranslationWalker
, Для последнего вы также можете установить подсказку с локалью — это заставит загружать все сущности в нужной локали.
$ Query-> setHint (
\ Gedmo \ Translatable \ TranslatableListener :: HINT_TRANSLATABLE_LOCALE,
‘а как’
);
TranslatableListener
Других решений пока нет …