Yii2: как получить поле с переводом?
Извините, если не понятно сформировал вопрос. Суть задачи: у меня есть мультиязычный сайт. В админ панели клиент заполняет данные на 3х языках. Например, новости. У них есть title. Я не создаю это поле в базе, а делаю его как public $title.
Дальше у меня есть метод, который получает перевод
public function t($row) {
/** тут по полю находится перевод **/
}
И вот я думал написать гетер, что бы можно было обращаться как к обычному полю
public function getTitle()
{
return $this->t('title');
}
Но Yii2 ругается. Как можно это обойти, что бы обращаться как к обычному полю?
Ответы (1 шт):
Не самая лучшая идея хранить именно так как у Вас, но жизнь бывает диктует свои условия...
Как бы сделал я. Создал базовую модель в которой описал метод t и все модели таблиц типа news унаследовал от нее.
Либо сделал trait и в каждую таблицу а-ля news его включал.
Первый вариант мне нравиться больше т.к мы будем много знать о таблице (например ее название) не передавая это как дополнительный параметр в функцию перевода.
Не дам 100% гарантии, что это все будет работать, но думаю при любом раскладе, хоть как-то я Вам помог :)
class BaseModel extends \yii\db\ActiveRecord
{
/**
* Возвращает перевод указанного поля в зависимости от таблицы для которой он вызван и текущего языка
* @param string $fieldName Имя поля в таблице для которого нужен перевод
* @return string
*/
public function t($fieldName = null ) {
$result = '';
if ( !is_null( $fieldname ) && trim( $fieldName ) != '' ) {
//Имя таблицы - `news`
$tableName = self::tableName();
//текущий язык (учитывайте что он хранится в виде `en-US`, `ru-RU` и т.д
//а у Вас по условиям задачи как `en`, 'ru'
$lang = \Yii::$app->language;
$model = Translations::findOne(['table' => $tableName, 'lang' => $lang, 'column' => $fieldName]);
if ( !is_null( $model ) ) {
$result = $model->value;
}
}
return $result;
}
}
Ну и собственно сам класс новостей
class News extends BaseModel {
/**
* {@inheritdoc}
*/
public static function tableName()
{
return 'news';
}
...
/**
* Возвращает перевод для поля `title` в зависимости от текущего языка
* хотя я бы напрямую вызывал сразу ->t()
* @return string
*/
public function getTitle() {
return $this->t('title');
}
}