Yii2: как получить поле с переводом?

Извините, если не понятно сформировал вопрос. Суть задачи: у меня есть мультиязычный сайт. В админ панели клиент заполняет данные на 3х языках. Например, новости. У них есть title. Я не создаю это поле в базе, а делаю его как public $title.

Дальше у меня есть метод, который получает перевод

public function t($row) {
/** тут по полю находится перевод **/
}

И вот я думал написать гетер, что бы можно было обращаться как к обычному полю

public function getTitle()
{
    return $this->t('title');
}

Но Yii2 ругается. Как можно это обойти, что бы обращаться как к обычному полю?


Ответы (1 шт):

Автор решения: phpBear

Не самая лучшая идея хранить именно так как у Вас, но жизнь бывает диктует свои условия... Как бы сделал я. Создал базовую модель в которой описал метод 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');
    }
}
→ Ссылка