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