/
v.bolshakov
/
AIEcosystem-Testing
Обзор
Документация
Войти
/
v.bolshakov
/
AIEcosystem-Testing
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
dev
common/traits/TranslateRecordTrait.php
178 строк
4 KB
Developer
Initial commit
03 авг 2026, 17:43
03 авг 2026, 17:43
7433917
Код
Авторство
О чём код?
<?php namespace common\traits; use common\helpers\LanguageHelper; use Yii; use yii\db\Command; use yii\db\Exception; use yii\db\Query; use yii\helpers\ArrayHelper; use yii\helpers\VarDumper; /** * Расширение для переводов моделей * * @author Dmitry E. Semenov <sde.tomsk@gmail.com> * @copyright Self (c) 2021 */ trait TranslateRecordTrait { /** * Перегружаем метод - что бы получить перевод поля из базы данных * * @param string $field * @return mixed */ public function __get($field) { if ($perevod = ArrayHelper::getValue($this->getMap(), $field)) { return $this->getPerevodField($perevod, parent::__get($field)); } return parent::__get($field); } /** * @inheritdoc */ public static function find() { $langId = LanguageHelper::getLanguageId(); if ($langId > 0) { return parent::find() ->preparePerevod($langId); } else { return parent::find(); } } /** * Загрузка как есть * @return object|\yii\db\ActiveQuery * @throws \yii\base\InvalidConfigException */ public static function nativeFind() { return parent::find(); } /** * Загрузить перевод для конкретной записи * * @param integer $langId Язык перевода * @return mixed */ public function perevod($langId) { $new = self::find() ->preparePerevod($langId); $keys = []; $a = $this->getAlias(); foreach ($this->primaryKey() as $key) { $new->andWhere([$a . '.' . $key => $this->{$key}]); } return $new; } /** * Подготовить столбец для использования перевода * * @param string $field * @param null $yazik_id * @return string */ public static function prepareField($field, $yazik_id = null) { $a = self::getAlias(); if ($yazik_id and $yazik_id != LanguageHelper::DEFAULT_LANGUAGE) { $a .= '_p'; } return $a . '.' . $field; } /** * Выборка полей * @param $field * @param $langId * @param $a * @return string */ public static function prepareSelectField($field, $langId = null, $a = null) { if (!$a) { $a = call_user_func([get_called_class(), 'getAlias']); } if (!$langId) { $langId = LanguageHelper::getLanguageId(); } if ($langId and $langId != LanguageHelper::DEFAULT_LANGUAGE) { $p = $a . '_p'; return 'coalesce(' . $p . '.' . $field . ',' . $a . '.' . $field . ')'; } else { return $a . '.' . $field; } } /** * {@inheritdoc} */ public static function tableNamePerevod() { $tableName = call_user_func([get_called_class(), 'tableName']); return $tableName . '_perevod'; } /** * Обновление данных в талице с переводом * * @param $object_id * @param $perevod * @return void * @throws \yii\db\Exception */ public static function updateLang($object_id, $perevod, $column = 'title') { $tbl = self::tableNamePerevod(); $class = new self; $foreign_key = $class->fkName; foreach ($perevod as $yazik_id => $title) { if ($title) { $id = (new Query()) ->select(['id']) ->from($tbl) ->where([$foreign_key => $object_id, 'yazik_id' => $yazik_id]) ->scalar(); /* @var Command $db */ $db = Yii::$app->db->createCommand(); $data[$column] = $title; $data[$foreign_key] = $object_id; if ($id) { $db->update($tbl, $data, ['id' => $id]); } else { $data['yazik_id'] = $yazik_id; $db->insert($tbl, $data); } try { $db->execute(); } catch (Exception $exception) { Yii::debug(VarDumper::dumpAsString([ 'message' => $exception->getMessage() ])); } } } } }