diff --git a/common/modules/product/models/Import.php b/common/modules/product/models/Import.php
new file mode 100644
index 0000000..abbbc56
--- /dev/null
+++ b/common/modules/product/models/Import.php
@@ -0,0 +1,534 @@
+ 'csv'],
+ ];
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function attributeLabels()
+ {
+ return [
+ 'file' => Yii::t('product', 'File'),
+ ];
+ }
+
+ public function getType() {
+ if (!$this->type) {
+ $this->type = 'products';
+ }
+ return $this->type;
+ }
+
+ public function goPrices($from = 0, $limit = null) {
+ set_time_limit(0);
+ $new_products = $linked_products = 0;
+
+ if ( !($handle = $this->getProductsFile('uploadFilePrices')) ) {
+ $this->errors[] = 'File not found';
+ return FALSE;
+ }
+
+ $filesize = filesize(Yii::getAlias('@uploadDir') .'/'. Yii::getAlias('@uploadFilePrices'));
+ if ($from) {
+ fseek($handle, $from);
+ }
+
+ $j = 0;
+
+ $is_utf = (preg_match('//u', file_get_contents(Yii::getAlias('@uploadDir') .'/'. Yii::getAlias('@uploadFilePrices'), null, null, null, 1000000)));
+
+ while (($data = fgetcsv ($handle, 10000, ";")) !== FALSE && (empty($limit) || $j++ < $limit))
+ {
+ foreach ($data as &$value)
+ {
+ if (!$is_utf) {
+ $value = iconv ('windows-1251', "UTF-8//TRANSLIT//IGNORE", $value);
+ }
+ $value = trim ($value);
+ }
+
+ // данные строк
+ $modification_code = @$data[0];
+ $price = floatval(@$data[1]);
+ $price_promo = floatval(@$data[2]);
+ $count = intval(@$data[3]);
+ $city_name = @$data[4];
+ $product_title = @$data[5];
+
+ if (empty ($modification_code)) {
+ continue;
+ }
+ // товары в пути
+ if (empty ($city_name))
+ {
+// $this->saveNotFoundRecord (
+// [$modification_code, $product_title],
+// Yii::getAlias('@uploadFilePricesAway')
+// );
+
+ $this->output[] = 'Товар '. $product_title . ' в пути';
+
+ continue;
+ }
+
+ if ( ($productVariant = ProductVariant::find()->filterWhere(['sku' => $modification_code])->one()) === null ) {
+ // 'Нет даной модификации в базе';
+// $this->saveNotFoundRecord (
+// [$modification_code, $product_title],
+// Yii::getAlias('@uploadFilePricesNoVariant')
+// );
+
+ $this->output[] = 'Для товара '. $product_title . ' не найдено соотвествие';
+
+ continue;
+ }
+
+
+ $quantity = 0;
+
+ // ===== Set stock ====
+ if ( $city_name ) {
+ if ( ($stock = Stock::find()->filterWhere(['ilike', 'name', trim($city_name)])->one()) === null ) {
+ // Create stock
+ $stock = new Stock();
+ $stock->name = trim($city_name);
+ $stock->save();
+ }
+
+ $productVariant->stocks[$stock->stock_id] = $count;
+ $quantity = $quantity + $count;
+ }
+
+ if ($price_promo) {
+ $productVariant->price_old = $price;
+ $productVariant->price = $price_promo;
+ } else {
+ $productVariant->price = $price;
+ $productVariant->price_old = $price_promo;
+ }
+
+ $productVariant->stock = $quantity;
+
+ $productVariant->save();
+
+ $this->output[] = 'Товар '. $product_title .' успешно сохранен';
+ }
+
+ $result = [
+ 'end' => feof($handle),
+ 'from' => ftell($handle),
+ 'totalsize' => $filesize,
+ 'items' => $this->output,
+
+ ];
+
+ fclose ($handle);
+
+ if ($result['end']) {
+ unlink(Yii::getAlias('@uploadDir') .'/'. Yii::getAlias('@uploadFilePrices'));
+ }
+
+ return $result;
+ }
+
+ public function goProducts($from = 0, $limit = null) {
+ set_time_limit(0);
+ $new_products = $linked_products = 0;
+
+ if ( !($handle = $this->getProductsFile('uploadFileProducts')) ) {
+ $this->errors[] = 'File not found';
+ return FALSE;
+ }
+
+ $filesize = filesize(Yii::getAlias('@uploadDir') .'/'. Yii::getAlias('@uploadFileProducts'));
+
+ if ($from) {
+ fseek($handle, $from);
+ }
+
+ $j = 0;
+
+ $is_utf = (preg_match('//u', file_get_contents(Yii::getAlias('@uploadDir') .'/'. Yii::getAlias('@uploadFileProducts'), null, null, null, 1000000)));
+
+ $result_items = [];
+
+ while (($data = fgetcsv ($handle, 10000, ";")) !== FALSE && (empty($limit) || $j++ < $limit))
+ {
+ foreach ($data as &$value)
+ {
+ if (!$is_utf) {
+ $value = iconv ('windows-1251', "UTF-8//TRANSLIT//IGNORE", $value);
+ }
+ $value = trim ($value);
+ }
+
+ // будет всегда 19 элементов
+ for ($i = 0; $i <= 18; $i++)
+ {
+ if (! isset ($data[$i]))
+ {
+ $data[$i] = null;
+ }
+ }
+
+ // 1 Группа (категория)
+ $catalog_name = $data[0];
+ if (empty ($catalog_name))
+ {
+ $result_items[] = "Не указана категория (строка $j)";
+ continue;
+ }
+
+ // 2 Бренд
+ $brand_name = $data[1];
+ if (empty ($brand_name))
+ {
+ $result_items[] = "Не указан бренд (строка $j)";
+ continue;
+ }
+
+ // 3 Название товара
+ $product_name = $data[2];
+ if (empty ($product_name))
+ {
+ $result_items[] = "Не указано наименование товара (строка $j)";
+ continue;
+ }
+
+ // 4 Описание Укр
+ $product_body_uk = $data[3];
+
+ // 5 Описание Рус
+ $product_body_ru = $data[4];
+
+ // 6 Фильтр (через запятую)
+ $filters = explode (',', $data[5]);
+
+ // 7 Доп фильтр через запятую
+ $filters_extra = explode (',', $data[6]);
+
+ // 8 Пол череззапятую (мужской, женский, детский, унисекс)
+ $gender = explode (',', $data[7]);
+
+ // 9 Год
+ $years = explode (',', $data[8]);
+
+ // 11 Цена акция
+ $product_cost_old = floatval($data[10]);
+
+ // 10 Цена
+ if ($product_cost_old) {
+ $product_cost_old = floatval($data[9]);
+ $product_cost = floatval($data[10]);
+ }
+
+ // 12 Акция
+ $product_akciya = (bool)$data[11];
+
+ // 13 Сопуд. Тов.
+ $similar = explode (',', $data[12]);
+
+ // 14 Новинки
+ $product_new = (bool)$data[13];
+
+ // 15 Топ продаж
+ $product_top = (bool)$data[14];
+
+ // 16 Сетка Характеристик
+ $feature = explode ('=', $data[15]);
+
+ // 17 ВИДЕО КОД
+ $product_video = $data[16];
+
+ // 18 Галлерея фото
+ if (trim($data[17])) {
+ $fotos = explode (',', trim($data[17]));
+ }
+
+ // 19 Штрих код товара.
+ // расшифровал - это модификации товара!
+
+ $product_image = explode ('=', $data[18]);
+ $product_image = @$product_image[3];
+
+ if ( ($_product = Product::find()->filterWhere(['ilike', 'name', trim($product_name)])->one()) === null ) {
+ $_product = new Product();
+ }
+
+ $is_new_product = empty($_product->product_id);
+
+ // ==== Set category ====
+ if ( ($category = CategoryName::find()->filterWhere(['ilike', 'value', trim($catalog_name)])->one()) === null ) {
+ // Create category
+ $category = new Category();
+ $category->name = trim($catalog_name);
+ $category->save();
+ }
+ $_product->categories = [$category->category_id];
+
+ // ===== Set brand ====
+ if ( $brand_name ) {
+ if ( ($brand = BrandName::find()->filterWhere(['ilike', 'value', trim($brand_name)])->one()) !== null ) {
+ $_product->brand_id = $brand->brand_id;
+ } else {
+ // Create brand
+ $brand = new Brand();
+ $brand->name = trim($brand_name);
+ $brand->save();
+ $_product->brand_id = $brand->brand_id;
+ }
+ }
+
+ $_product->name = $product_name;
+ $_product->video = $product_video;
+ $_product->description = $product_body_ru;
+ $_product->is_top = $product_top;
+ $_product->akciya = $product_akciya;
+ $_product->is_new = $product_new;
+
+ if (!$_product->save()) {
+ $result_items[] = 'Product #'. $_product->name .' not saved' . " (строка $j)";
+ continue;
+ }
+
+ if (!empty($fotos)) {
+ foreach($fotos as $foto) {
+ $source_image = Yii::getAlias('@uploadDir') . '/product_images/'. urlencode($foto);
+
+ if (file_exists($source_image)) {
+ if (($productImage = ProductImage::find()->andFilterWhere(['ilike', 'image', $foto])->andFilterWhere(['product_id' => $_product->product_id])->one()) === null) {
+ copy($source_image, Yii::getAlias('@productsDir') . "/" . $foto);
+ $productImage = new ProductImage();
+ $productImage->product_id = $_product->product_id;
+ $productImage->image = $foto;
+ $productImage->save();
+ }
+ }
+ }
+ }
+
+ // нужно для проставления характеристик относящихся к модификациям
+ $MOD_ARRAY = [];
+
+ for ($i = 18; $i < count ($data); $i ++)
+ {
+ if (! empty ($data[$i]))
+ {
+ $mod_arr = explode ('=', $data[$i]);
+ $mod_art = $mod_arr[0];
+ $mod_size = $mod_arr[1];
+ $mod_color = $mod_arr[2];
+ $mod_image = $mod_arr[3];
+ $mod_cost = floatval($product_cost);
+ $mod_old_cost = floatval($product_cost_old);
+
+ // Check product variant
+ if ( ($_productVariant = ProductVariant::find()->andFilterWhere(['ilike', 'sku', $mod_art])->andFilterWhere(['product_id' => $_product->product_id])->one()) === null ) {
+ $_productVariant = new ProductVariant();
+ $_productVariant->product_id = $_product->product_id;
+ }
+ $_productVariant->product_unit_id = 1;
+
+ $_productVariant->sku = $mod_art;
+ $_productVariant->price = $mod_cost;
+ $_productVariant->price_old = $mod_old_cost;
+ $_productVariant->stock = 1;
+
+ $product_variant_type_name = '';
+ if (! empty ($mod_color)) {
+ $product_variant_type_name = 'Цвет';
+ $_productVariant->name = $mod_color;
+ }
+ elseif (! empty ($mod_size)) {
+ $product_variant_type_name = 'Размер';
+ $_productVariant->name = $mod_size;
+ }
+
+ // ===== Set variant type ====
+ if ( $product_variant_type_name ) {
+ if ( ($product_variant_type = ProductVariantType::find()->filterWhere(['ilike', 'name', $product_variant_type_name])->one()) !== null ) {
+ $_productVariant->product_variant_type_id = $product_variant_type->product_variant_type_id;
+ } else {
+ $product_variant_type = new ProductVariantType();
+ $product_variant_type->name = $product_variant_type_name;
+ $product_variant_type->save();
+ $_productVariant->product_variant_type_id = $product_variant_type->product_variant_type_id;
+ }
+ }
+ $_productVariant->save(false);
+
+ $MOD_ARRAY[] = $_productVariant->product_variant_id;
+
+ if ($mod_image) {
+ $source_image = Yii::getAlias('@uploadDir') . '/product_images/'. urlencode($mod_image);
+ if (file_exists($source_image)) {
+ if (($variantImage = ProductImage::find()->andFilterWhere(['ilike', 'image', $mod_image])->andFilterWhere(['product_variant_id' => $_productVariant->product_variant_id])->one()) === null) {
+ copy($source_image, Yii::getAlias('@productsDir') . "/" . $mod_image);
+ $variantImage = new ProductImage();
+ $variantImage->product_id = $_product->product_id;
+ $variantImage->product_variant_id = $_productVariant->product_variant_id;
+ $variantImage->image = $mod_image;
+ $variantImage->save();
+ }
+ }
+ }
+ }
+ }
+
+ $options = [];
+
+ if (! empty ($filters)) {
+ // Set Naznachenie (tax_group_id = 20)
+ foreach($filters as $filter) {
+ $filter = trim($filter);
+ if (!$filter) {
+ continue;
+ }
+ if ( ($value = TaxValueString::find()->innerJoinWith('taxOption')->andFilterWhere(['ilike', 'value', $filter])->andFilterWhere(['tax_option.tax_group_id' => ProductHelper::PRODUCT_TAX_GROUP_ID_TARGET])->one()) === null ) {
+ // Create option
+ $option = new TaxOption();
+ $option->tax_group_id = 20;
+ $option->save();
+
+ $value = new TaxValueString();
+ $value->tax_option_id = $option->tax_option_id;
+ $value->value = $filter;
+ $value->save();
+
+ $option->default_value = $value->tax_value_id;
+ $option->save();
+ }
+ $options[] = $value->tax_option_id;
+ }
+ }
+
+ if (! empty ($years)) {
+ // Set God (tax_group_id = 21)
+ foreach($years as $filter) {
+ $filter = trim($filter);
+ if (!$filter) {
+ continue;
+ }
+ if ( ($value = TaxValueString::find()->innerJoinWith('taxOption')->andFilterWhere(['ilike', 'value', $filter])->andFilterWhere(['tax_option.tax_group_id' => ProductHelper::PRODUCT_TAX_GROUP_ID_YEAR])->one()) === null ) {
+ // Create option
+ $option = new TaxOption();
+ $option->tax_group_id = 21;
+ $option->save();
+
+ $value = new TaxValueString();
+ $value->tax_option_id = $option->tax_option_id;
+ $value->value = $filter;
+ $value->save();
+
+ $option->default_value = $value->tax_value_id;
+ $option->save();
+ }
+ $options[] = $value->tax_option_id;
+ }
+ }
+
+ if (! empty ($gender)) {
+ // Set Pol (tax_group_id = 22)
+ foreach($gender as $filter) {
+ $filter = trim($filter);
+ if (!$filter) {
+ continue;
+ }
+ if ( ($value = TaxValueString::find()->innerJoinWith('taxOption')->andFilterWhere(['ilike', 'value', $filter])->andFilterWhere(['tax_option.tax_group_id' => ProductHelper::PRODUCT_TAX_GROUP_ID_SEX])->one()) === null ) {
+ // Create option
+ $option = new TaxOption();
+ $option->tax_group_id = 22;
+ $option->save();
+
+ $value = new TaxValueString();
+ $value->tax_option_id = $option->tax_option_id;
+ $value->value = $filter;
+ $value->save();
+
+ $option->default_value = $value->tax_value_id;
+ $option->save();
+ }
+ $options[] = $value->tax_option_id;
+ }
+ }
+
+ if (!empty($options)) {
+ $_product->options = $options;
+ }
+
+ $_product->save();
+
+ $result_items[] = "Product {$_product->name} #{$_product->product_id} saved (". ($is_new_product ? 'new product' : 'exists product') .")" . " (строка $j)";
+ }
+
+ $result = [
+ 'end' => feof($handle),
+ 'from' => ftell($handle),
+ 'totalsize' => $filesize,
+ 'items' => $result_items,
+
+ ];
+
+ fclose ($handle);
+
+ if ($result['end']) {
+ unlink(Yii::getAlias('@uploadDir') .'/'. Yii::getAlias('@uploadFileProducts'));
+ }
+
+ return $result;
+ }
+
+ private function getProductsFile($file_type) {
+ $filename = Yii::getAlias('@uploadDir') .'/'. Yii::getAlias('@'. $file_type);
+ if (!is_file($filename)) {
+ $this->errors[] = "File $filename not found";
+ return FALSE;
+ }
+ return fopen ($filename, 'r');
+ }
+
+ private function saveNotFoundRecord (array $line, $filename)
+ {
+ $str = implode (';', $line)."\n";
+ $str = iconv ("UTF-8//TRANSLIT//IGNORE", "windows-1251", $str);
+
+ $fg = fopen (Yii::getAlias('@uploadDir') .'/'. $filename, 'a+');
+ fputs ($fg, $str);
+ fclose ($fg);
+ }
+}
\ No newline at end of file
diff --git a/common/modules/product/models/ProductVariantTypeSearch.php b/common/modules/product/models/ProductVariantTypeSearch.php
new file mode 100644
index 0000000..c4804b4
--- /dev/null
+++ b/common/modules/product/models/ProductVariantTypeSearch.php
@@ -0,0 +1,70 @@
+ $query,
+ ]);
+
+ $this->load($params);
+
+ if (!$this->validate()) {
+ // uncomment the following line if you do not want to return any records when validation fails
+ // $query->where('0=1');
+ return $dataProvider;
+ }
+
+ // grid filtering conditions
+ $query->andFilterWhere([
+ 'product_variant_type_id' => $this->product_variant_type_id,
+ ]);
+
+ $query->andFilterWhere(['like', 'name', $this->name])
+ ->andFilterWhere(['like', 'name2', $this->name2]);
+
+ return $dataProvider;
+ }
+}
diff --git a/common/modules/product/models/import.php b/common/modules/product/models/import.php
deleted file mode 100644
index a3c3a7a..0000000
--- a/common/modules/product/models/import.php
+++ /dev/null
@@ -1,535 +0,0 @@
- 'csv'],
- ];
- }
-
- /**
- * @inheritdoc
- */
- public function attributeLabels()
- {
- return [
- 'file' => Yii::t('product', 'File'),
- ];
- }
-
- public function getType() {
- if (!$this->type) {
- $this->type = 'products';
- }
- return $this->type;
- }
-
- public function goPrices($from = 0, $limit = null) {
- set_time_limit(0);
- $new_products = $linked_products = 0;
-
- if ( !($handle = $this->getProductsFile('uploadFilePrices')) ) {
- $this->errors[] = 'File not found';
- return FALSE;
- }
-
- $filesize = filesize(Yii::getAlias('@uploadDir') .'/'. Yii::getAlias('@uploadFileProducts'));
-
- if ($from) {
- fseek($handle, $from);
- }
-
- $j = 0;
-
- $is_utf = (preg_match('//u', file_get_contents(Yii::getAlias('@uploadDir') .'/'. Yii::getAlias('@uploadFilePrices'), null, null, null, 1000000)));
-
- while (($data = fgetcsv ($handle, 10000, ";")) !== FALSE && (empty($limit) || $j++ < $limit))
- {
- foreach ($data as &$value)
- {
- if (!$is_utf) {
- $value = iconv ('windows-1251', "UTF-8//TRANSLIT//IGNORE", $value);
- }
- $value = trim ($value);
- }
-
- // данные строк
- $modification_code = @$data[0];
- $price = floatval(@$data[1]);
- $price_promo = floatval(@$data[2]);
- $count = intval(@$data[3]);
- $city_name = @$data[4];
- $product_title = @$data[5];
-
- if (empty ($modification_code)) {
- continue;
- }
- // товары в пути
- if (empty ($city_name))
- {
- $this->saveNotFoundRecord (
- [$modification_code, $product_title],
- Yii::getAlias('@uploadFilePricesAway')
- );
-
- $this->output[] = 'Товар '. $product_title . ' в пути';
-
- continue;
- }
-
- if ( ($productVariant = ProductVariant::find()->filterWhere(['sku' => trim($modification_code)])->one()) === null ) {
- // 'Нет даной модификации в базе';
- $this->saveNotFoundRecord (
- [$modification_code, $product_title],
- Yii::getAlias('@uploadFilePricesNoVariant')
- );
-
- $this->output[] = 'Для товара '. $product_title . ' не найдено соотвествие';
-
- continue;
- }
-
- $quantity = 0;
-
- // ===== Set stock ====
- if ( $city_name ) {
- if ( ($stock = Stock::find()->filterWhere(['ilike', 'name', trim($city_name)])->one()) === null ) {
- // Create stock
- $stock = new Stock();
- $stock->name = trim($city_name);
- $stock->save();
- }
-
- $productVariant->stocks[$stock->stock_id] = $count;
- $quantity = $quantity + $count;
- }
-
- if ($price_promo) {
- $productVariant->price_old = $price;
- $productVariant->price = $price_promo;
- } else {
- $productVariant->price = $price;
- $productVariant->price_old = $price_promo;
- }
-
- $productVariant->stock = $quantity;
-
- $productVariant->save();
-
- $this->output[] = 'Товар '. $product_title .' успешно сохранен';
- }
-
- $result = [
- 'end' => feof($handle),
- 'from' => ftell($handle),
- 'totalsize' => $filesize,
- 'items' => $this->output,
-
- ];
-
- fclose ($handle);
-
- if ($result['end']) {
- unlink(Yii::getAlias('@uploadDir') .'/'. Yii::getAlias('@uploadFilePrices'));
- $this->output[] = 'Импорт цен успешно завершен!';
- }
-
- return $result;
- }
-
- public function goProducts($from = 0, $limit = null) {
- set_time_limit(0);
- $new_products = $linked_products = 0;
-
- if ( !($handle = $this->getProductsFile('uploadFileProducts')) ) {
- $this->errors[] = 'File not found';
- return FALSE;
- }
-
- $filesize = filesize(Yii::getAlias('@uploadDir') .'/'. Yii::getAlias('@uploadFileProducts'));
-
- if ($from) {
- fseek($handle, $from);
- }
-
- $j = 0;
-
- $is_utf = (preg_match('//u', file_get_contents(Yii::getAlias('@uploadDir') .'/'. Yii::getAlias('@uploadFileProducts'), null, null, null, 1000000)));
-
- $result_items = [];
-
- while (($data = fgetcsv ($handle, 10000, ";")) !== FALSE && (empty($limit) || $j++ < $limit))
- {
- foreach ($data as &$value)
- {
- if (!$is_utf) {
- $value = iconv ('windows-1251', "UTF-8//TRANSLIT//IGNORE", $value);
- }
- $value = trim ($value);
- }
-
- // будет всегда 19 элементов
- for ($i = 0; $i <= 18; $i++)
- {
- if (! isset ($data[$i]))
- {
- $data[$i] = null;
- }
- }
-
- // 1 Группа (категория)
- $catalog_name = $data[0];
- if (empty ($catalog_name))
- {
- $result_items[] = "Не указана категория (строка $j)";
- continue;
- }
-
- // 2 Бренд
- $brand_name = $data[1];
- if (empty ($brand_name))
- {
- $result_items[] = "Не указан бренд (строка $j)";
- continue;
- }
-
- // 3 Название товара
- $product_name = $data[2];
- if (empty ($product_name))
- {
- $result_items[] = "Не указано наименование товара (строка $j)";
- continue;
- }
-
- // 4 Описание Укр
- $product_body_uk = $data[3];
-
- // 5 Описание Рус
- $product_body_ru = $data[4];
-
- // 6 Фильтр (через запятую)
- $filters = explode (',', $data[5]);
-
- // 7 Доп фильтр через запятую
- $filters_extra = explode (',', $data[6]);
-
- // 8 Пол череззапятую (мужской, женский, детский, унисекс)
- $gender = explode (',', $data[7]);
-
- // 9 Год
- $years = explode (',', $data[8]);
-
- // 11 Цена акция
- $product_cost_old = floatval($data[10]);
-
- // 10 Цена
- if ($product_cost_old) {
- $product_cost_old = floatval($data[9]);
- $product_cost = floatval($data[10]);
- }
-
- // 12 Акция
- $product_akciya = (bool)$data[11];
-
- // 13 Сопуд. Тов.
- $similar = explode (',', $data[12]);
-
- // 14 Новинки
- $product_new = (bool)$data[13];
-
- // 15 Топ продаж
- $product_top = (bool)$data[14];
-
- // 16 Сетка Характеристик
- $feature = explode ('=', $data[15]);
-
- // 17 ВИДЕО КОД
- $product_video = $data[16];
-
- // 18 Галлерея фото
- if (trim($data[17])) {
- $fotos = explode (',', trim($data[17]));
- }
-
- // 19 Штрих код товара.
- // расшифровал - это модификации товара!
-
- $product_image = explode ('=', $data[18]);
- $product_image = @$product_image[3];
-
- if ( ($_product = Product::find()->filterWhere(['ilike', 'name', trim($product_name)])->one()) === null ) {
- $_product = new Product();
- }
-
- $is_new_product = empty($_product->product_id);
-
- // ==== Set category ====
- if ( ($category = CategoryName::find()->filterWhere(['ilike', 'value', trim($catalog_name)])->one()) === null ) {
- // Create category
- $category = new Category();
- $category->name = trim($catalog_name);
- $category->save();
- }
- $_product->categories = [$category->category_id];
-
- // ===== Set brand ====
- if ( $brand_name ) {
- if ( ($brand = BrandName::find()->filterWhere(['ilike', 'value', trim($brand_name)])->one()) !== null ) {
- $_product->brand_id = $brand->brand_id;
- } else {
- // Create brand
- $brand = new Brand();
- $brand->name = trim($brand_name);
- $brand->save();
- $_product->brand_id = $brand->brand_id;
- }
- }
-
- $_product->name = $product_name;
- $_product->video = $product_video;
- $_product->description = $product_body_ru;
- $_product->is_top = $product_top;
- $_product->akciya = $product_akciya;
- $_product->is_new = $product_new;
-
- if (!$_product->save()) {
- $result_items[] = 'Product #'. $_product->name .' not saved' . " (строка $j)";
- continue;
- }
-
- if (!empty($fotos)) {
- foreach($fotos as $foto) {
- $source_image = Yii::getAlias('@uploadDir') . '/product_images/'. urlencode($foto);
-
- if (file_exists($source_image)) {
- if (($productImage = ProductImage::find()->andFilterWhere(['ilike', 'image', $foto])->andFilterWhere(['product_id' => $_product->product_id])->one()) === null) {
- copy($source_image, Yii::getAlias('@productsDir') . "/" . $foto);
- $productImage = new ProductImage();
- $productImage->product_id = $_product->product_id;
- $productImage->image = $foto;
- $productImage->save();
- }
- }
- }
- }
-
- // нужно для проставления характеристик относящихся к модификациям
- $MOD_ARRAY = [];
-
- for ($i = 18; $i < count ($data); $i ++)
- {
- if (! empty ($data[$i]))
- {
- $mod_arr = explode ('=', $data[$i]);
- $mod_art = $mod_arr[0];
- $mod_size = $mod_arr[1];
- $mod_color = $mod_arr[2];
- $mod_image = $mod_arr[3];
- $mod_cost = floatval($product_cost);
- $mod_old_cost = floatval($product_cost_old);
-
- // Check product variant
- if ( ($_productVariant = ProductVariant::find()->andFilterWhere(['ilike', 'sku', $mod_art])->andFilterWhere(['product_id' => $_product->product_id])->one()) === null ) {
- $_productVariant = new ProductVariant();
- $_productVariant->product_id = $_product->product_id;
- }
- $_productVariant->product_unit_id = 1;
-
- $_productVariant->sku = $mod_art;
- $_productVariant->price = $mod_cost;
- $_productVariant->price_old = $mod_old_cost;
- $_productVariant->stock = 1;
-
- $product_variant_type_name = '';
- if (! empty ($mod_color)) {
- $product_variant_type_name = 'Цвет';
- $_productVariant->name = $mod_color;
- }
- elseif (! empty ($mod_size)) {
- $product_variant_type_name = 'Размер';
- $_productVariant->name = $mod_size;
- }
-
- // ===== Set variant type ====
- if ( $product_variant_type_name ) {
- if ( ($product_variant_type = ProductVariantType::find()->filterWhere(['ilike', 'name', $product_variant_type_name])->one()) !== null ) {
- $_productVariant->product_variant_type_id = $product_variant_type->product_variant_type_id;
- } else {
- $product_variant_type = new ProductVariantType();
- $product_variant_type->name = $product_variant_type_name;
- $product_variant_type->save();
- $_productVariant->product_variant_type_id = $product_variant_type->product_variant_type_id;
- }
- }
- $_productVariant->save(false);
-
- $MOD_ARRAY[] = $_productVariant->product_variant_id;
-
- if ($mod_image) {
- $source_image = Yii::getAlias('@uploadDir') . '/product_images/'. urlencode($mod_image);
- if (file_exists($source_image)) {
- if (($variantImage = ProductImage::find()->andFilterWhere(['ilike', 'image', $mod_image])->andFilterWhere(['product_variant_id' => $_productVariant->product_variant_id])->one()) === null) {
- copy($source_image, Yii::getAlias('@productsDir') . "/" . $mod_image);
- $variantImage = new ProductImage();
- $variantImage->product_id = $_product->product_id;
- $variantImage->product_variant_id = $_productVariant->product_variant_id;
- $variantImage->image = $mod_image;
- $variantImage->save();
- }
- }
- }
- }
- }
-
- $options = [];
-
- if (! empty ($filters)) {
- // Set Naznachenie (tax_group_id = 20)
- foreach($filters as $filter) {
- $filter = trim($filter);
- if (!$filter) {
- continue;
- }
- if ( ($value = TaxValueString::find()->innerJoinWith('taxOption')->andFilterWhere(['ilike', 'value', $filter])->andFilterWhere(['tax_option.tax_group_id' => ProductHelper::PRODUCT_TAX_GROUP_ID_TARGET])->one()) === null ) {
- // Create option
- $option = new TaxOption();
- $option->tax_group_id = 20;
- $option->save();
-
- $value = new TaxValueString();
- $value->tax_option_id = $option->tax_option_id;
- $value->value = $filter;
- $value->save();
-
- $option->default_value = $value->tax_value_id;
- $option->save();
- }
- $options[] = $value->tax_option_id;
- }
- }
-
- if (! empty ($years)) {
- // Set God (tax_group_id = 21)
- foreach($years as $filter) {
- $filter = trim($filter);
- if (!$filter) {
- continue;
- }
- if ( ($value = TaxValueString::find()->innerJoinWith('taxOption')->andFilterWhere(['ilike', 'value', $filter])->andFilterWhere(['tax_option.tax_group_id' => ProductHelper::PRODUCT_TAX_GROUP_ID_YEAR])->one()) === null ) {
- // Create option
- $option = new TaxOption();
- $option->tax_group_id = 21;
- $option->save();
-
- $value = new TaxValueString();
- $value->tax_option_id = $option->tax_option_id;
- $value->value = $filter;
- $value->save();
-
- $option->default_value = $value->tax_value_id;
- $option->save();
- }
- $options[] = $value->tax_option_id;
- }
- }
-
- if (! empty ($gender)) {
- // Set Pol (tax_group_id = 22)
- foreach($gender as $filter) {
- $filter = trim($filter);
- if (!$filter) {
- continue;
- }
- if ( ($value = TaxValueString::find()->innerJoinWith('taxOption')->andFilterWhere(['ilike', 'value', $filter])->andFilterWhere(['tax_option.tax_group_id' => ProductHelper::PRODUCT_TAX_GROUP_ID_SEX])->one()) === null ) {
- // Create option
- $option = new TaxOption();
- $option->tax_group_id = 22;
- $option->save();
-
- $value = new TaxValueString();
- $value->tax_option_id = $option->tax_option_id;
- $value->value = $filter;
- $value->save();
-
- $option->default_value = $value->tax_value_id;
- $option->save();
- }
- $options[] = $value->tax_option_id;
- }
- }
-
- if (!empty($options)) {
- $_product->options = $options;
- }
-
- $_product->save();
-
- $result_items[] = "Product {$_product->name} #{$_product->product_id} saved (". ($is_new_product ? 'new product' : 'exists product') .")" . " (строка $j)";
- }
-
- $result = [
- 'end' => feof($handle),
- 'from' => ftell($handle),
- 'totalsize' => $filesize,
- 'items' => $result_items,
-
- ];
-
- fclose ($handle);
-
- if ($result['end']) {
- unlink(Yii::getAlias('@uploadDir') .'/'. Yii::getAlias('@uploadFileProducts'));
- }
-
- return $result;
- }
-
- private function getProductsFile($file_type) {
- $filename = Yii::getAlias('@uploadDir') .'/'. Yii::getAlias('@'. $file_type);
- if (!is_file($filename)) {
- $this->errors[] = "File $filename not found";
- return FALSE;
- }
- return fopen ($filename, 'r');
- }
-
- private function saveNotFoundRecord (array $line, $filename)
- {
- $str = implode (';', $line)."\n";
- $str = iconv ("UTF-8//TRANSLIT//IGNORE", "windows-1251", $str);
-
- $fg = fopen (Yii::getAlias('@uploadDir') .'/'. $filename, 'a+');
- fputs ($fg, $str);
- fclose ($fg);
- }
-}
\ No newline at end of file
--
libgit2 0.21.4