'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 goProducts() { set_time_limit(0); $new_products = $linked_products = 0; if ( !($handle = $this->getProductsFile('uploadFileProducts')) ) { $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; } public function goPrices() { set_time_limit(0); $new_products = $linked_products = 0; if ( !($handle = $this->getProductsFile('uploadFilePrices')) ) { $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); } // данные строк $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(['ilike', '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; } $productVariant->price = $price; $productVariant->price_old = $price_promo; $productVariant->stock = $quantity; $productVariant->save(); $this->output[] = 'Товар '. $product_title .' успешно сохранен'; } fclose ($handle); } 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); } }