/
v.bolshakov
/
AIEcosystem-Testing
Обзор
Документация
Войти
/
v.bolshakov
/
AIEcosystem-Testing
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
dev
backend/forms/data/tm/TmForm.php
232 строки
6 KB
Developer
Initial commit
03 авг 2026, 17:43
03 авг 2026, 17:43
7433917
Код
Авторство
О чём код?
<?php namespace backend\forms\data\tm; use common\forms\base\ObjectIdForm; use common\helpers\TextHelper; use common\helpers\TmHelper; use common\kdf\KLanguage; use common\kdf\KModelStatus; use common\models\tm\LinkUserTm; use common\models\tm\Tm; use common\models\tm\TmTermMongo; use PhpOffice\PhpSpreadsheet\IOFactory; use Yii; use yii\helpers\ArrayHelper; use yii\web\UploadedFile; /** * Форма TM * * @author Dmitry E. Semenov <sde.tomsk@gmail.com> * @copyright Self (c) 2026 */ class TmForm extends ObjectIdForm { /** * title * @var null */ public $name = null; /** * source_language_id * @var null */ public $source_language_id = null; /** * target_language_id * @var null */ public $target_language_id = null; /** * user_id * @var null */ public $user_id = null; /** * File * @var null */ public $file = null; /** * @inheritdoc */ public function attributeLabels() { return ArrayHelper::merge(parent::attributeLabels(), [ 'name' => Yii::t('app', 'TM name'), 'source_language_id' => Yii::t('app', 'Source language'), 'target_language_id' => Yii::t('app', 'Target language'), ]); } /** * @inheritdoc */ public function rules() { return ArrayHelper::merge(parent::rules(), [ [['source_language_id', 'target_language_id', 'name', 'user_id'], 'required'], [['name'], 'string'], [['source_language_id', 'target_language_id', 'user_id'], 'number'], ['file', 'safe'], ]); } /** * @inheritdoc */ public function loadModel($condition) { parent::loadModel($condition); $this->user_id = ArrayHelper::getValue($condition, 'parent_id'); $a = Tm::getAlias(); $obj = Tm::find() ->alias($a) ->andWhere([ $a . '.id' => $this->oid, ]) ->one(); if ($obj) { $this->initState($obj); } } /** * @inheritdoc */ public function getPublicFields() { return ArrayHelper::merge(parent::getPublicFields(), [ 'name', 'source_language_id' => function () { return $this->prepareSelectField(KLanguage::find(), 'source_language_id', 'title'); }, 'target_language_id' => function () { return $this->prepareSelectField(KLanguage::find(), 'target_language_id', 'title'); }, ]); } /** * @inheritdoc */ protected function doSave() { $tm = Tm::findOrNew($this->oid); $tm->setAttributes([ 'name' => $this->name, 'source_language_id' => $this->source_language_id, 'target_language_id' => $this->target_language_id, 'rec_status' => KModelStatus::PUBLISHED ]); if (!$tm->save()) { $this->addErrors($tm->errors); return false; } $link = LinkUserTm::findOrNew([ 'tm_id' => $tm->id ]); $link->setAttributes([ 'user_id' => $this->user_id, ]); if (!$link->save()) { $this->addErrors($link->errors); return false; } $upload = UploadedFile::getInstance($this, 'file'); if ($upload) { if ($upload->hasError) { $this->addError('file', Yii::t('app', 'Error upload file')); return false; } $import = []; if ($upload->extension == 'csv') { if (($handle = fopen($upload->tempName, "r")) !== false) { while (($data = fgetcsv($handle, 8000, ";")) !== false) { $import[] = [ 'A' => ArrayHelper::getValue($data, 0), 'B' => ArrayHelper::getValue($data, 1), ]; } fclose($handle); } } else { $spreadsheet = IOFactory::load($upload->tempName); $sheetData = $spreadsheet ->getActiveSheet() ->toArray(null, false, false, true); $import = array_slice($sheetData, 1); } $index = 0; $documents = []; $matrix = []; foreach ($import as $data) { $a = TextHelper::normalizeWhitespace(ArrayHelper::getValue($data, 'A')); $b = TextHelper::normalizeWhitespace(ArrayHelper::getValue($data, 'B')); if ($a and $b) { $documents[] = [ 'tm_id' => $tm->id, 'source' => $a, 'target' => $b, ]; $index++; if ($index % 10000 == 0) { $matrix[] = $documents; $documents = []; } } } $matrix[] = $documents; /** @var \yii\mongodb\Connection $mongodb */ $mongodb = Yii::$app->mongodb; $collectionName = TmTermMongo::collectionName(); $command = $mongodb->createCommand(); foreach ($matrix as $documents) { $command->batchInsert($collectionName, $documents); } $tm->updateAttributes([ 'term_count' => $index ]); } $this->model = $tm; return true; } /** * @inheritdoc */ protected function doDelete() { $this->model->delete(); return true; } }