ImportController.php 15.1 KB
<?php

namespace console\controllers;

use common\modules\product\models\Category;
use common\modules\product\models\CategoryName;
use common\modules\product\models\ProductImage;
use common\modules\product\models\ProductVariantType;
use common\modules\rubrication\models\TaxOption;
use common\modules\rubrication\models\TaxValueString;
use Yii;
use common\modules\product\models\Brand;
use common\modules\product\models\BrandName;
use common\modules\product\models\Product;
use common\modules\product\models\ProductVariant;
use common\modules\product\models\RemoteProducts;
use yii\console\Controller;
use yii\helpers\Console;

class ImportController extends Controller {
    private function getProductsFile() {
        $filename = Yii::getAlias('@uploadDir') .'/'. Yii::getAlias('@uploadFileProducts');
        if (!is_file($filename)) {
            $this->stderr("File $filename not found");
            return FALSE;
        }
        return fopen ($filename, 'r');
    }

    public function actionIndex() {
        $new_products = $linked_products = 0;

        $db = yii::$app->db;

        if ( !($handle = $this->getProductsFile()) ) {
            return Controller::EXIT_CODE_ERROR;
        }

        $j = 0;

        while (($data = fgetcsv ($handle, 10000, ";")) !== FALSE)
        {
            $j++;

            foreach ($data as &$value)
            {
                //$value = mb_convert_encoding ($value,  "UTF-8", mb_detect_encoding ($value));
                $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))
            {
                CONTINUE;
            }

            // 2  Бренд
            $brand_name = $data[1];
            if (empty ($brand_name))
            {
                CONTINUE;
            }

            // 3  Название товара
            $product_name = $data[2];
            if (empty ($product_name))
            {
                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]);

            // 10 Цена старая
            $product_cost_old = $data[9];

            // 11 Цена
            $product_cost = $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 Галлерея фото
            $fotos = explode (',', $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 ) {
                $_product->categories = [$category->category_id];
            } else {
                // 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;


            $_product->save();


            // @todo Set image
            /*// картинки
            if (is_file ($dir.'/mod/' . $product_image))
            {
                $resizeObj = new resize ($dir.'/mod/' . $product_image);
                $resizeObj->resizeImage (135, 200, 'auto');
                $resizeObj->saveImage ($dir.'/products/ico/' . $product_image, 100);
                $resizeObj->resizeImage (370, 370, 'auto');
                $resizeObj->saveImage ($dir.'/products/big/' . $product_image, 100);
            }*/

            // ==== mods ====

            // (типа штрих код товара)

            // нужно для проставления характеристик относящихся к модификациям
            $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   = $product_cost;
                    $mod_old_cost = $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();

                    $MOD_ARRAY[] = $_productVariant->product_variant_id;

                    if ($mod_image) {
                        $url = 'http://rukzachok.com.ua/upload/mod/' . $mod_image;
                        $image = file_get_contents($url);
                        if ($image) {
                            if (($variantImage = ProductImage::find()->andFilterWhere(['ilike', 'image', $mod_image])->andFilterWhere(['product_variant_id' => $_productVariant->product_variant_id])->one()) === null) {
                                file_put_contents(Yii::getAlias('@productsDir') . "/" . $mod_image, $image);
                                $variantImage = new ProductImage();
                                $variantImage->product_id = $_product->product_id;
                                $variantImage->product_variant_id = $_productVariant->product_variant_id;
                                $variantImage->image = $mod_image;
                                $variantImage->save();
                            }
                        }
                    }
                }
            }

            /*// ==== fotos ====

            foreach ($fotos as $foto)
            {
                $fields = [
                    'product_id' => $product_id,
                    'image' => $foto
                ];

                $modelFotos = Fotos::find ()
                    ->where ('image=:image', [
                        ':image' => $foto
                    ])
                    ->one ();

                if (empty ($modelFotos->id))
                {
                    $db->createCommand ()
                        ->insert ('products_fotos', $fields)
                        ->execute ();
                }
                else
                {
                    $db->createCommand ()
                        ->update ('products_fotos', $fields, 'id = ' . $modelFotos->id)
                        ->execute ();
                }

                if (is_file ($dir.'/fotos/' . $foto))
                {
                    $resizeObj = new resize ($dir.'/fotos/' . $foto);
                    $resizeObj->resizeImage (100, 100, 'crop');
                    $resizeObj->saveImage ($dir.'/fotos/ico/' . $foto, 100);
                    $resizeObj->resizeImage (400, 400, 'crop');
                    $resizeObj->saveImage ($dir.'/fotos/big/' . $foto, 100);
                }
            }*/

            $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' => 20])->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' => 21])->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' => 22])->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();

            $this->stdout("$j: Product {$_product->name} #{$_product->product_id} saved (". ($is_new_product ? 'new product' : 'exists product') .")\n");

            /*if ($j > 100) {
                $this->stdout("Dev OK");
                exit;
            }*/

        }

        fclose ($handle);

        return Controller::EXIT_CODE_NORMAL;
    }

    public function goProducts() {

    }
}