Как изменить структуру файла экспорта товаров CSV

Здравствуйте! Такой вопрос — как можно изменить структуру файла экспорта товаров CSV? Сейчас категории и товары выводятся строчками, к тому же, если у товара несколько артикулов, они также выводятся строками, что приводит к дублированию по столбцу Наименование. Нужно чтобы файл экспорта выводил все в столбцах, например:

Назв. товара | осн.категория товара | доп.категория товара | артикул1 | цена 1 | артикул2 | цена2

2 ответа

  • 2
    Петр 21 марта 2018 11:54 #

    кажись никак, я сам сделал хелпер себе чтобы делал автоматом выгрузку всего прайса по расписанию

    и также выстраивал всю структуру под себя в CSV

    • +1
      Ольга Ольга 21 марта 2018 12:03 #

      а где находится файл, который выстраивает структуру экспорта CSV?

      • +1
        Петр Петр 21 марта 2018 12:18 #

        думаю здесь wa-apps\shop\lib\actions\csv

        • +1
          Ольга Ольга 21 марта 2018 12:56 #

          Спасибо) я так понимаю структуру выстраивает shopCsvProductrun.controller.php. Но что нужно изменить, чтобы, например, хотя бы артикулы с ценами строились в отдельные столбцы, а не в строчки?

      • +1
        Петр Петр 21 марта 2018 12:41 #

        если нужно я вот такой cli состряпал

        <?php 
        
        class shopExportcsvCli extends waCliController
        
        {
        	private function product ($product) {
        	
        	$shop_product = new shopProduct($product);
        	if (!isset($product['features'])) {
        						$product_feature_model  = array();
                                if (!$product_feature_model) {
                                    $product_feature_model = new shopProductFeaturesModel();
                                }
                                $product['features'] = $product_feature_model->getValues($product['id']);
        						
            }
        	$product['type_name'] = $shop_product->type['name'];
        	$product['skus'] = $shop_product->skus;
        	$model = new shopProductStocksModel();
        	//$model->getBySkuId($product['sku_id']);
        	foreach ($product['skus']  as &$sku) {
        						$stoks = array();
        						$stoks = $model->getBySkuId($sku['id']);
        						if (isset($stoks[$sku['id']])) {
        							$sku['stock'] = $stoks[$sku['id']];
        						}
        	}
        	unset($stoks);
        	unset($sku);
        	
        	//wa_dump($product);
        	
        	$tax_model = new shopTaxModel();
            $taxes = $tax_model->getAll();
        	$product['tax_name'] = '';
        	if (!empty($product['tax_id'])) {
        		foreach ($taxes as $tax) {
        			if ($tax['id'] === $product['tax_id']) {
        				$product['tax_name'] = $tax['name'];
        			}
        		}
                            
            }
        	
        	
        	//wa_dump($product);
        	return $product;
        	}
        	
        	private function exportcsv () {
        		
        		$path = rtrim(waRequest::post('path'), ' /');
        		$path = wa()->getDataPath($path, true, 'site');
        		if (file_exists($path)) {
        			$fp = fopen($path.'/export-all-product.csv', 'w');
        			fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));
        			$this->collection = new shopProductsCollection('all');
        			$this->collection->orderBy('name');
        			$count = $this->collection->count();
        			$products = $this->collection->getProducts('*','',$count, false);
        			$stockmodel = new shopStockModel();
        			$stocks = $stockmodel->getAll();
        			$stock_name = '';
        			foreach ($stocks as $stock) {
        				$stock_name .= 'В наличии @'.$stock['name'].';';
        			} 
        			$s = count($stocks);
        			$features_model = new shopFeatureModel();
        			$features = $features_model->getFeatures(true);
        			if ($features) {
        				$feature_name = '';
        				$feature_code = array();
        				foreach ($features as $feature) {
        					$feature_name .= $feature['name'].';';
        					$feature_code[] = $feature['code'];
        				}
        			}
        			unset($feature);
        			$csv_file = 'Наименование - '.date('d-m-Y').';Артикул;Валюта;Цена;Цена витрина;Доступен для заказа;В наличии;'.$stock_name.'Тип товаров;Облагается налогом;'.$feature_name."\r\n";
        			
        			foreach ($products as &$product){
        				$product = $this->product($product);
        				foreach ($product['skus'] as $skus) {
        					$stocks = '';
        					if ($skus['stock']) {
        						foreach ($skus['stock'] as $stock) {
        							$stocks .= $stock['count'].';';
        						}
        						unset($stock);
        					}else{
        						for ($i = 1; $i <= $s; $i++) {
        							$stocks .= ' ;';
        						}
        					}
        					
        					$feature = '';
        						
        							foreach ($feature_code as $p_feature) {
        								if (array_key_exists($p_feature, $product['features'])) {
        									$feature .= '"'.$product['features'][$p_feature].'";';
        								} else {
        									$feature .= ' ;';
        								}
        							}
        					//wa_dumpc($feature_code); wa_dumpc($product['features']); wa_dump($feature);
        					$csv_file .= '"'.str_replace ('"','', $product['name']).'";"'.$skus['sku'].'";'.$product['currency'].';'.str_replace (".",",", $skus['price']).';'.str_replace (".",",", $skus['primary_price']).';'.$product['status'].';'.$skus['count'].';'.$stocks.$product['type_name'].';"'.$product['tax_name'].'";'.$feature."\r\n";
        				}
        				unset($skus);
        			}
        			
        			fwrite($fp,trim($csv_file));
        			
        			fclose($fp);
        		}else{
        			echo ' нет такой дериктории ';
        		}
        	}
        
        	public function execute()
            {
               
                	$this->exportcsv();
                 
                exit;
            }
        }

        аккуратно там есть ошибки, я так и не разобрался со списком товаров чтобы норм отображалось в экселе есть глюк с кавычками

        "


        • +1
          Ольга Ольга 21 марта 2018 12:58 #

          Отлично, спасибо, уже что-то, попробую разобраться))

          • +1
            Петр Петр 21 марта 2018 13:02 #

            тут wa-apps\shop\lib\actions\csv, я вам не помогу, для меня дремучий лес, я пытался, в итоге родился

            shopExportcsvCli

            самодельный

            • +1
              Ольга Ольга 21 марта 2018 13:26 #

              Спасибо вам, что любезно поделились своим решением! А можно еще пару намеков как этим пользоваться))) куда загружать файл? как его подключить?

              • +1
                Петр Петр 21 марта 2018 13:36 #
                загрузить его можно в wa-apps\shop\lib\cli

                назвать shopExportcsv.cli.php

                команда для крона cli.php shop Exportcsv

                путь до cli.php согласно вашему хостингу

                можно выполнить эту команду в командной строке самостоятельно без крона

                • +1
                  Ольга Ольга 21 марта 2018 13:39 #

                  Ок, понятно, большое спасибо)))

                  • +1
                    Петр Петр 6 апреля 2018 10:25 #

                    характеристики $product['features'][$p_feature] лучше обернуть в trim()

                    примерно 100 строка

  • 1

    А для чего вам такая странная структура?

    • +1
      Ольга Ольга 21 марта 2018 13:14 #

      Почему странная? как-раз такая структура часто нужна для импорта, например, в crm системы или на популярные торговые площадки. Все данные одного товара находятся в столбцах.

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите