Commit 63b9774b83c7646c0e3ce98fbcad091dcbe07ea9

Authored by andryeyev
1 parent 492fcbc5

+ Импорт структуры с файла.csv вида Категория-1;Категория-2;Категория-3

backend/controllers/ImportController.php 0 → 100644
  1 +<?php
  2 +
  3 +namespace backend\controllers;
  4 +
  5 +use Yii;
  6 +use backend\models\Import;
  7 +use yii\web\UploadedFile;
  8 +
  9 +class ImportController extends \yii\web\Controller
  10 +{
  11 + public function actionIndex()
  12 + {
  13 + $model = new Import();
  14 + return $this->render('index', [
  15 + 'model' => $model
  16 + ]);
  17 + }
  18 +
  19 + public function actionUpload()
  20 + {
  21 + $model = new Import();
  22 +
  23 + if ($model->load(Yii::$app->request->post()))
  24 + {
  25 + $model->file = UploadedFile::getInstances($model, 'file');
  26 +
  27 + // Копируем файл в директорию
  28 + $path = $_SERVER['DOCUMENT_ROOT'].'/import/';
  29 +
  30 + foreach ($model->file as $file)
  31 + {
  32 + //var_dump(substr ($path.$file->name, 0, -10)); die;
  33 + Import::importFile ($file);
  34 + }
  35 + }
  36 + }
  37 +
  38 +}
... ...
backend/models/Import.php 0 → 100644
  1 +<?php
  2 +
  3 +namespace backend\models;
  4 +
  5 +use Yii;
  6 +use yii\base\Model;
  7 +use common\models\Tools;
  8 +use common\models\Termin;
  9 +use yii\web\UploadedFile;
  10 +
  11 +/**
  12 + * Import товаров
  13 + */
  14 +class Import extends \yii\db\ActiveRecord
  15 +{
  16 + public $file;
  17 +
  18 + /**
  19 + * @inheritdoc
  20 + */
  21 + public function rules()
  22 + {
  23 + return [
  24 + [['file'], 'file', 'skipOnEmpty' => false, 'extensions' => 'csv', 'maxFiles' => 2],
  25 + ];
  26 + }
  27 +
  28 + static function importFile ($filename)
  29 + {
  30 + // создаем папку
  31 + if (! is_dir ($path = $_SERVER['DOCUMENT_ROOT'].'/import/'))
  32 + {
  33 + mkdir ($path, 0777, true);
  34 + }
  35 +
  36 + // копируем файл
  37 + copy ($filename->tempName, $path.$filename->name);
  38 +
  39 + // по умолчанию
  40 + // $termin_pid MEGA КАСТЫЛЬ!!! Это категория "Каталог товаров",
  41 + // под которую подтягуються термины, которые на нашли себе parent
  42 + $termin_pid = 8;
  43 + // $template_id шаблон каьегорий
  44 + $template_id = 3;
  45 + $lang_id = 2;
  46 + $type = 'H';
  47 +
  48 + // массив для импортп товаров
  49 + $MASS = [];
  50 +
  51 + // открываем файл и перебираем
  52 + $fp = fopen ($path.$filename->name, 'r');
  53 + while ($ROW = fgetcsv ($fp, 10000, ';'))
  54 + {
  55 + // чистим
  56 + foreach ($ROW as $key => &$value)
  57 + {
  58 + $value = trim ($value) == 'NULL' ? NULL : trim ($value);
  59 + }
  60 +
  61 + $ROW['category_title'] = $ROW[0];
  62 + $ROW['group_title'] = $ROW[1];
  63 + $ROW['subgroup_title'] = $ROW[2];
  64 +
  65 + // проверяем если через ","
  66 +
  67 + // var_dump($array[1]); die;
  68 +
  69 + // массив для поиска/добавления термина
  70 + $basic = [
  71 + 'type' => $type,
  72 + 'lang_id' => $lang_id,
  73 + 'template_id' => $template_id,
  74 + ];
  75 +
  76 + // категория
  77 + if ($ROW['category_title'] == NULL)
  78 + {
  79 + CONTINUE;
  80 + }
  81 +
  82 + $termin_id = Termin::addIfNotExists ($basic + [
  83 + 'termin_title' => $ROW['category_title'],
  84 + 'termin_pid' => $termin_pid, // MEGA КАСТЫЛЬ!!!
  85 + ]);
  86 +
  87 + // подгруппа
  88 + if ($ROW['group_title'] != NULL)
  89 + {
  90 + $termin_id = Termin::addIfNotExists ($basic + [
  91 + 'termin_title' => $ROW['group_title'],
  92 + 'termin_pid' => $termin_id,
  93 + ]);
  94 + }
  95 +
  96 + // группа
  97 + if ($ROW['subgroup_title'] != NULL)
  98 + {
  99 + $termin_id = Termin::addIfNotExists ($basic + [
  100 + 'termin_title' => $ROW['subgroup_title'],
  101 + 'termin_pid' => $termin_id,
  102 + ]);
  103 + }
  104 +
  105 + }
  106 +
  107 + // удаляем файл
  108 + chmod($path.$filename->name, 0777);
  109 + unlink ($path.$filename->name);
  110 +
  111 +/*
  112 + echo '<pre>';
  113 +
  114 + var_dump($category);
  115 + var_dump($group);
  116 + var_dump($subgroup);
  117 +
  118 + echo '</pre>';
  119 +
  120 + // ОБЩЕЕ
  121 + // PRODUCT
  122 + Артикул
  123 + Категория
  124 + Группа
  125 + Подгруппа
  126 + Описание
  127 + Штрих-код
  128 +
  129 + // СПРАВОЧНИК ИЛИ ДОП. ПОЛЯ
  130 + // ???
  131 + Торговая марка
  132 + Производитель
  133 + ID
  134 + Наименование
  135 + кол-во в пакете
  136 + Ед. Изм
  137 + опт / розница
  138 + Диаметр шляпки min
  139 + Диаметр шляпки max
  140 + Единица измерения
  141 + Цвет шляпки
  142 + Цвет шляпки (фильтр)
  143 + Цвет мякоти цвет мякоти (фильтр)
  144 + Длина ножки min
  145 + Длина ножки max
  146 + Единица измерения
  147 + примечание
  148 +*/
  149 + }
  150 +
  151 + public function findTerminOneQuery ($type, $name, $parent_name)
  152 + {
  153 +/*
  154 + return yii::$app->db->createCommand('
  155 + SELECT
  156 + `termin`.termin_id, `parent`.termin_id as termin_pid
  157 + FROM `termin`
  158 + INNER JOIN `termin_lang` ON `termin_lang`.termin_alias = "'.$name.'"
  159 + INNER JOIN `termin_relation` ON `termin_relation`.termin_id = `termin`.termin_id
  160 + LEFT JOIN (
  161 + IF NOT EXISTS (SELECT *
  162 + FROM `termin_lang`
  163 + INNER JOIN `termin` ON `termin`.termin_id = `termin_lang`.termin_id
  164 + AND `termin`.type = "'.$type.'"
  165 + WHERE `termin_lang`.termin_alias = "'.$parent_name.'"
  166 + )
  167 + THEN (SELECT *
  168 + FROM `termin_lang`
  169 + INNER JOIN `termin` ON `termin`.termin_id = `termin_lang`.termin_id
  170 + AND `termin`.type = "'.$type.'"
  171 + WHERE `termin_lang`.termin_alias = "'.$parent_name.'"
  172 + )
  173 + ELSE (SELECT *
  174 + FROM `termin_lang`
  175 + INNER JOIN `termin` ON `termin`.termin_id = `termin_lang`.termin_id
  176 + AND `termin`.type = "'.$type.'"
  177 + )
  178 + ) as `parent` ON `parent`.termin_id = `termin_relation`.termin_pid
  179 + WHERE `termin`.type = "'.$type.'"
  180 + ')->queryOne();
  181 +*/
  182 + }
  183 +
  184 +}
... ...
backend/views/import/index.php 0 → 100644
  1 +<?php
  2 +
  3 +use yii\helpers\Html;
  4 +use yii\widgets\ActiveForm;
  5 +use yii\helpers\ArrayHelper;
  6 +use kartik\select2\Select2;
  7 +
  8 +/* @var $this yii\web\View */
  9 +/* @var $model common\models\Menu */
  10 +/* @var $form yii\widgets\ActiveForm */
  11 +?>
  12 +
  13 +<div class="menu-form">
  14 +
  15 + <?php
  16 + $form = ActiveForm::begin([
  17 + 'action' => '/backend/web/index.php?r=import/upload',
  18 + 'options' => [
  19 + 'enctype' => 'multipart/form-data',
  20 + 'class' => 'import',
  21 + ]
  22 + ]);
  23 + ?>
  24 +
  25 + <?= $form->field($model, 'file[]')->fileInput(['multiple' => true ]) ?>
  26 +
  27 + <div class="form-group">
  28 + <?= Html::submitButton('button', ['class' => 'btn btn-primary']) ?>
  29 + </div>
  30 +
  31 + <?php ActiveForm::end(); ?>
  32 +
  33 +</div>
... ...
common/models/SqlQueryBuilder.php 0 → 100644
  1 +<?php
  2 +
  3 +namespace common\models;
  4 +
  5 +class SqlQueryBuilder
  6 +{
  7 + /**
  8 + * @var array list of data to build the query
  9 + */
  10 + protected $query = array(
  11 + 'select' => array(),
  12 + 'from' => '',
  13 + 'join' => array(),
  14 + 'where' => array(),
  15 + 'group' => array(),
  16 + 'having' => array(),
  17 + 'order' => array(),
  18 + 'limit' => array('offset' => 0, 'limit' => 0),
  19 + );
  20 +
  21 + /**
  22 + * Add fields in query selection
  23 + *
  24 + * @param string $fields List of fields to concat to other fields
  25 + * @return DbQuery
  26 + */
  27 + public function select ($fields)
  28 + {
  29 + if (! empty ($fields))
  30 + {
  31 + $this->query['select'][] = $fields;
  32 + }
  33 + return $this;
  34 + }
  35 +
  36 + /**
  37 + * Set table for FROM clause
  38 + *
  39 + * @param string $table Table name
  40 + * @return DbQuery
  41 + */
  42 + public function from ($table, $alias = null)
  43 + {
  44 + if (! empty ($table))
  45 + {
  46 + $this->query['from'][] = '`'.$table.'`'.($alias ? ' '.$alias : '');
  47 + }
  48 + return $this;
  49 + }
  50 +
  51 + /**
  52 + * Add JOIN clause
  53 + * E.g. $this->join('RIGHT JOIN '._DB_PREFIX_.'product p ON ...');
  54 + *
  55 + * @param string $join Complete string
  56 + * @return DbQuery
  57 + */
  58 + public function join ($join)
  59 + {
  60 + if (! empty ($join))
  61 + {
  62 + $this->query['join'][] = $join;
  63 + }
  64 + return $this;
  65 + }
  66 +
  67 + /**
  68 + * Add LEFT JOIN clause
  69 + *
  70 + * @param string $table Table name (without prefix)
  71 + * @param string $alias Table alias
  72 + * @param string $on ON clause
  73 + */
  74 + public function leftJoin ($table, $alias = null, $on = null)
  75 + {
  76 + return $this->join('LEFT JOIN `'.$table.'`'.($alias ? ' `'.$alias.'`' : '').($on ? ' ON '.$on : ''));
  77 + }
  78 +
  79 + /**
  80 + * Add INNER JOIN clause
  81 + * E.g. $this->innerJoin('product p ON ...')
  82 + *
  83 + * @param string $table Table name (without prefix)
  84 + * @param string $alias Table alias
  85 + * @param string $on ON clause
  86 + */
  87 + public function innerJoin ($table, $alias = null, $on = null)
  88 + {
  89 + return $this->join('INNER JOIN `'.$table.'`'.($alias ? ' '.$alias : '').($on ? ' ON '.$on : ''));
  90 + }
  91 +
  92 + /**
  93 + * Add LEFT OUTER JOIN clause
  94 + *
  95 + * @param string $table Table name (without prefix)
  96 + * @param string $alias Table alias
  97 + * @param string $on ON clause
  98 + */
  99 + public function leftOuterJoin ($table, $alias = null, $on = null)
  100 + {
  101 + return $this->join('LEFT OUTER JOIN `'.$table.'`'.($alias ? ' '.$alias : '').($on ? ' ON '.$on : ''));
  102 + }
  103 +
  104 + /**
  105 + * Add NATURAL JOIN clause
  106 + *
  107 + * @param string $table Table name (without prefix)
  108 + * @param string $alias Table alias
  109 + */
  110 + public function naturalJoin ($table, $alias = null)
  111 + {
  112 + return $this->join('NATURAL JOIN `'.$table.'`'.($alias ? ' '.$alias : ''));
  113 + }
  114 +
  115 + /**
  116 + * Add a restriction in WHERE clause (each restriction will be separated by AND statement)
  117 + *
  118 + * @param string $restriction
  119 + * @return DbQuery
  120 + */
  121 + public function where ($restriction)
  122 + {
  123 + if (! empty ($restriction))
  124 + {
  125 + $this->query['where'][] = $restriction;
  126 + }
  127 + return $this;
  128 + }
  129 +
  130 + /**
  131 + * Add a restriction in HAVING clause (each restriction will be separated by AND statement)
  132 + *
  133 + * @param string $restriction
  134 + * @return DbQuery
  135 + */
  136 + public function having ($restriction)
  137 + {
  138 + if (! empty ($restriction))
  139 + {
  140 + $this->query['having'][] = $restriction;
  141 + }
  142 + return $this;
  143 + }
  144 +
  145 + /**
  146 + * Add an ORDER B restriction
  147 + *
  148 + * @param string $fields List of fields to sort. E.g. $this->order('myField, b.mySecondField DESC')
  149 + * @return DbQuery
  150 + */
  151 + public function orderBy ($fields)
  152 + {
  153 + if (! empty ($fields))
  154 + {
  155 + $this->query['order'][] = $fields;
  156 + }
  157 + return $this;
  158 + }
  159 +
  160 + /**
  161 + * Add a GROUP BY restriction
  162 + *
  163 + * @param string $fields List of fields to sort. E.g. $this->group('myField, b.mySecondField DESC')
  164 + * @return DbQuery
  165 + */
  166 + public function groupBy ($fields)
  167 + {
  168 + if (! empty ($fields))
  169 + {
  170 + $this->query['group'][] = $fields;
  171 + }
  172 + return $this;
  173 + }
  174 +
  175 + /**
  176 + * Limit results in query
  177 + *
  178 + * @param string $fields List of fields to sort. E.g. $this->order('myField, b.mySecondField DESC')
  179 + * @return DbQuery
  180 + */
  181 + public function limit ($limit, $offset = 0)
  182 + {
  183 + $offset = (int)$offset;
  184 + if ($offset < 0)
  185 + {
  186 + $offset = 0;
  187 + }
  188 +
  189 + $this->query['limit'] = array(
  190 + 'offset' => $offset,
  191 + 'limit' => (int)$limit,
  192 + );
  193 + return $this;
  194 + }
  195 +
  196 + /**
  197 + * Generate and get the query
  198 + *
  199 + * @return string
  200 + */
  201 + public function build ()
  202 + {
  203 + $sql = 'SELECT '.((($this->query['select'])) ? implode (",\n", $this->query['select']) : '*')."\n";
  204 +
  205 + if (! $this->query['from'])
  206 + {
  207 + die('DbQuery->build() missing from clause');
  208 + }
  209 + $sql .= 'FROM '.implode (', ', $this->query['from'])."\n";
  210 +
  211 + if ($this->query['join'])
  212 + {
  213 + $sql .= implode ("\n", $this->query['join'])."\n";
  214 + }
  215 +
  216 + if ($this->query['where'])
  217 + {
  218 + $sql .= 'WHERE ('.implode (') AND (', $this->query['where']).")\n";
  219 + }
  220 +
  221 + if ($this->query['group'])
  222 + {
  223 + $sql .= 'GROUP BY '.implode(', ', $this->query['group'])."\n";
  224 + }
  225 +
  226 + if ($this->query['having'])
  227 + {
  228 + $sql .= 'HAVING ('.implode (') AND (', $this->query['having']).")\n";
  229 + }
  230 +
  231 + if ($this->query['order'])
  232 + {
  233 + $sql .= 'ORDER BY '.implode (', ', $this->query['order'])."\n";
  234 + }
  235 +
  236 + if ($this->query['limit']['limit'])
  237 + {
  238 + $limit = $this->query['limit'];
  239 + $sql .= 'LIMIT '.(($limit['offset']) ? $limit['offset'].', '.$limit['limit'] : $limit['limit']);
  240 + }
  241 +/*
  242 + ob_start();
  243 + var_dump($sql);
  244 + echo ob_get_clean();
  245 +*/
  246 + return $sql;
  247 + }
  248 +
  249 + public function __toString ()
  250 + {
  251 + return $this->build();
  252 + }
  253 +}
  254 +
... ...
common/models/Tools.php 0 → 100644
  1 +<?php
  2 +
  3 +namespace common\models;
  4 +
  5 +class Tools
  6 +{
  7 + /**
  8 + * Проверяет на наличие элементов в массиве, если нет - создает с значением или без
  9 + * @param array $mass
  10 + * @param array $exist
  11 + */
  12 + static function ifNotExist (&$mass, $exist)
  13 + {
  14 + if (! is_array ($mass))
  15 + {
  16 + $mass = array();
  17 + }
  18 +
  19 + foreach ($exist as $key => $value)
  20 + {
  21 + if (is_int ($key))
  22 + {
  23 + $exist[$value] = '';
  24 + unset ($exist[$key]);
  25 + }
  26 + }
  27 +
  28 + foreach ($exist as $key => $value)
  29 + {
  30 + if (! isset ($mass[$key])
  31 + || (isset ($mass[$key]) && $mass[$key] === ''))
  32 + {
  33 + $mass[$key] = $value;
  34 + }
  35 + }
  36 + }
  37 +
  38 + static function translit ($string, $setting = 'all')
  39 + {
  40 + $letter = array (
  41 +
  42 + 'а' => 'a', 'б' => 'b', 'в' => 'v',
  43 + 'г' => 'g', 'д' => 'd', 'е' => 'e',
  44 + 'ё' => 'e', 'ж' => 'zh', 'з' => 'z',
  45 + 'и' => 'i', 'й' => 'y', 'к' => 'k',
  46 + 'л' => 'l', 'м' => 'm', 'н' => 'n',
  47 + 'о' => 'o', 'п' => 'p', 'р' => 'r',
  48 + 'с' => 's', 'т' => 't', 'у' => 'u',
  49 + 'ф' => 'f', 'х' => 'h', 'ц' => 'c',
  50 + 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch',
  51 + 'ь' => "", 'ы' => 'y', 'ъ' => "",
  52 + 'э' => 'e', 'ю' => 'yu', 'я' => 'ya',
  53 + 'ї' => 'yi', 'є' => 'ye', 'і' => 'ee',
  54 +
  55 + 'А' => 'A', 'Б' => 'B', 'В' => 'V',
  56 + 'Г' => 'G', 'Д' => 'D', 'Е' => 'E',
  57 + 'Ё' => 'E', 'Ж' => 'Zh', 'З' => 'Z',
  58 + 'И' => 'I', 'Й' => 'Y', 'К' => 'K',
  59 + 'Л' => 'L', 'М' => 'M', 'Н' => 'N',
  60 + 'О' => 'O', 'П' => 'P', 'Р' => 'R',
  61 + 'С' => 'S', 'Т' => 'T', 'У' => 'U',
  62 + 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C',
  63 + 'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sch',
  64 + 'Ь' => "", 'Ы' => 'Y', 'Ъ' => "",
  65 + 'Э' => 'E', 'Ю' => 'Yu', 'Я' => 'Ya',
  66 + 'Ї' => 'Yi', 'Є' => 'Ye', 'І' => 'Ee'
  67 + );
  68 +
  69 + $symbol = array (
  70 + ' ' => '-', "'" => '', '"' => '',
  71 + '!' => '', "@" => '', '#' => '',
  72 + '$' => '', "%" => '', '^' => '',
  73 + ';' => '', "*" => '', '(' => '',
  74 + ')' => '', "+" => '', '~' => '',
  75 + '.' => '', ',' => '-', '?' => '',
  76 + '…' => '', '№' => 'N', '°' => '',
  77 + '`' => '', '|' => '', '&' => '-and-',
  78 + '<' => '', '>' => ''
  79 + );
  80 +
  81 + if ($setting == 'all')
  82 + {
  83 + $converter = $letter + $symbol;
  84 + }
  85 + else if ($setting == 'letter')
  86 + {
  87 + $converter = $letter;
  88 + }
  89 + else if ($setting == 'symbol')
  90 + {
  91 + $converter = $symbol;
  92 + }
  93 +
  94 + $url = strtr ($string, $converter);
  95 +
  96 + $url = str_replace ("---", '-', $url);
  97 + $url = str_replace ("--", '-', $url);
  98 +
  99 + return $url;
  100 + }
  101 +}
0 102 \ No newline at end of file
... ...