import.php 13.2 KB
<?php

namespace common\modules\product\models;

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\base\Model;

class Import extends Model {
    public $file;

    public $errors = [];
    public $output = [];

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
//            [['file'], 'safe'],
            [['file'], 'file'],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'file' => Yii::t('product', 'File'),
        ];
    }

    public function go() {

        $new_products = $linked_products = 0;

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

        if ( !($handle = $this->getProductsFile()) ) {
            $this->errors[] = 'File not found';
            return FALSE;
        }

        $j = 0;

        while (($data = fgetcsv ($handle, 10000, ";")) !== FALSE)
        {
            $j++;
            /*if ($j > 10) {
                return TRUE;
            }*/

            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[10];

            // 11 Цена
            $product_cost = $data[9];

            // 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 ) {
                // 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()) {
                $this->errors[] = 'Product #'. $_product->name .' not saved';
                continue;
            }

            // нужно для проставления характеристик относящихся к модификациям
            $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) {
                        $url = 'http://rukzachok.com.ua/upload/mod/' . urlencode($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();
                            }
                        }
                    }
                }
            }

            $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->output[] = "$j: Product {$_product->name} #{$_product->product_id} saved (". ($is_new_product ? 'new product' : 'exists product') .")";
        }

        fclose ($handle);

        return TRUE;
    }

    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');
    }
}