Перейти к содержимому


Фото
* * * * * 7 голосов

Экспорт товаров с выбором категорий

Экспорт товаров

  • Чтобы отвечать, сперва войдите на форум
80 ответов в теме

#21 Noxter

Noxter
  • Забаненый
  • 1 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 26.05.2015 - 23:50

Если выбрать:
<option value='0'>Все категории</option>
то экспорт прекращает работу и ничего не формирует.

Изменено: Noxter, 26.05.2015 - 23:55


#22 ignasius

ignasius
  • Пользователь
  • 12 сообщений
  • Верстка, Пользователь
  • Версия CMS:2.x
  • Откуда:Украина

Опубликовано 15.06.2015 - 14:02

А скажем если мне надо разбить товар не по категориям, а по брендам?



#23 Noxter

Noxter
  • Забаненый
  • 1 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 15.06.2015 - 14:18

А скажем если мне надо разбить товар не по категориям, а по брендам?

Могу индивидуально написать функционал за оплату.

#24 ignasius

ignasius
  • Пользователь
  • 12 сообщений
  • Верстка, Пользователь
  • Версия CMS:2.x
  • Откуда:Украина

Опубликовано 15.06.2015 - 14:38

Могу индивидуально написать функционал за оплату.

И сколько это будет стоить?



#25 ignasius

ignasius
  • Пользователь
  • 12 сообщений
  • Верстка, Пользователь
  • Версия CMS:2.x
  • Откуда:Украина

Опубликовано 16.06.2015 - 09:29

Отбой, я уже сам сделал



#26 filth

filth
  • Пользователь
  • 348 сообщений
  • Пользователь

Опубликовано 21.08.2015 - 16:55

Отбой, я уже сам сделал

Поделись)))



#27 Noxter

Noxter
  • Забаненый
  • 1 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 21.08.2015 - 21:04


Поделись)))


Есть готовое решение http://simpla-addons...-po-kategoriyam права поделиться смогу не безвозмездно.

#28 Kors

Kors
  • Фрилансер
  • 3 522 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 28.08.2015 - 08:36

В simpla/ajax/export.php вместо

private $filename = 'export.csv';

напиши

$category_id = $this->request->get('category_id');
   if(!empty($category_id))
   {
       $category = $this->categories->get_category((int)$category_id);
   }
private $filename = $category->name.'.csv';

Это топорно (лишний запрос будет), но не критично.

 

Такое безобразие работать точно не будет, потому как нарушаются правила формирования кода класса.

Явно  советчик поленился потратить пару минут на проверку совета.

Указанный код надо вставлять В ДРУГОМ МЕСТЕ (например, в начале функции fetch), и без "private"...



#29 artbe

artbe
  • Пользователь
  • 196 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 28.08.2015 - 09:04

Такое безобразие работать точно не будет, потому как нарушаются правила формирования кода класса.

Явно  советчик поленился потратить пару минут на проверку совета.

Указанный код надо вставлять В ДРУГОМ МЕСТЕ (например, в начале функции fetch), и без "private"...

 

simpla/ajax/export.php вставляю:

public function fetch()
	{
		
$category_id = $this->request->get('category_id');
if(!empty($category_id))
{
$category = $this->categories->get_category((int)$category_id);
}
$filename = $category->name.'.csv';

...

В результате ругается, скрин прилагаю

a4db8d8f8b409d4b5d1db191b121d652.jpg

 

UPD.     private $filename = 'export.csv'; - закоментировал выше


Изменено: artbe, 28.08.2015 - 09:05


#30 Kors

Kors
  • Фрилансер
  • 3 522 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 28.08.2015 - 09:15

Пробуйте:

1. private $filename = 'export.csv'; - восстановить как было.

2. Вместо$filename = ...  написать  $this->filename = ...



#31 mishanya

mishanya
  • Фрилансер
  • 2 575 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 28.08.2015 - 09:24

simpla/ajax/export.php вставляю:

...

В результате ругается, скрин прилагаю

 

UPD.     private $filename = 'export.csv'; - закоментировал выше

 

нужно обращаться к $this->filename

 

также надо передавать это имя файла назад, т.к. в скрипте прописано явно и будет скачивать всегда export.csv

window.location.href = 'files/export/export.csv';

еще я бы вставил строку с переименованием файла все-таки в условие по айди

private $filename = 'export.csv';
...
$category_id = $this->request->get('category_id');
if(!empty($category_id)) {
  $category = $this->categories->get_category((int)$category_id);
  $this->filename = $category->name.'.csv';
}
...

в этом случае если айди не придет файл будет иметь дефолтное название а не пустое.


Изменено: mishanya, 28.08.2015 - 09:28


#32 Kors

Kors
  • Фрилансер
  • 3 522 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 28.08.2015 - 09:49

Очень правильно заметил недостатки mishanya, спасибо.

 

В конце функции fetch тогда вместо

            return array('end'=>true, 'page'=>$page, 'totalpages'=>$total_products/$this->products_count);        
вставить
             return array('end'=>$this->filename, 'page'=>$page, 'totalpages'=>$total_products/$this->products_count);        
 

И строку

window.location.href = 'files/export/export.csv';

заменить на

window.location.href = 'files/export/'+data.end;



#33 artbe

artbe
  • Пользователь
  • 196 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 28.08.2015 - 13:58

Благодарю, все работает, файл выгружается с названием категории.

Однако теперь другая ошибка, в самом .csv файле - Название категории отображается "траслитом"

 

Скрин прилагаю. + если выбрать категорию, где нет товаров - то слайдер просто виснет

 

31442bb44816d720710bae78b62d4440.jpg



#34 mishanya

mishanya
  • Фрилансер
  • 2 575 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 28.08.2015 - 14:02

Благодарю, все работает, файл выгружается с названием категории.

Однако теперь другая ошибка, в самом .csv файле - Название категории отображается "траслитом"

 

Скрин прилагаю. + если выбрать категорию, где нет товаров - то слайдер просто виснет

 

31442bb44816d720710bae78b62d4440.jpg

 

это не транслит. это кодировка плывет у вас.



#35 artbe

artbe
  • Пользователь
  • 196 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 28.08.2015 - 14:08

это не транслит. это кодировка плывет у вас.

 

Подскажите пожалуйста как лечить, если вставлю после условия:

		setlocale(LC_ALL, 'ru_RU.1251');
		$this->db->query('SET NAMES cp1251');

то, происходит банальная ошибка, экспорт проходит на 103% и виснет, а самого файла нет.

 

Начало функции fetch:

	public function fetch()
	{
		if(!$this->managers->access('export'))
			return false;

		// Эксель кушает только 1251
		setlocale(LC_ALL, 'ru_RU.1251');
		$this->db->query('SET NAMES cp1251');
		
		
		$category_id = $this->request->get('category_id');
			if(!empty($category_id)) {
			  $category = $this->categories->get_category((int)$category_id);
			  $this->filename = $category->name.'.csv';
			}
		
		$category_id = $this->request->get('category_id');
		$category_children = array();
		if(!empty($category_id))
		{
			$category = $this->categories->get_category((int)$category_id);
			if (isset($category))
				$category_children = $category->children;
		}

Повторяются 2 переменные: $category_id = $this->request->get('category_id');



#36 mishanya

mishanya
  • Фрилансер
  • 2 575 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 28.08.2015 - 14:18

Подскажите пожалуйста как лечить, если вставлю после условия: 

................

 

Повторяются 2 переменные: $category_id = $this->request->get('category_id');

 

вообще я бы рекомендовал открывать csv файлы в openoffice и тогда не будет проблем с кодировками и не нужно будет ставить их в файл.

 

то что повторяються ничего страшного. по сути, вы можете объединить код:

		$category_id = $this->request->get('category_id');
			if(!empty($category_id)) {
			  $category = $this->categories->get_category((int)$category_id);
			  $this->filename = $category->name.'.csv';
			}
		
		$category_id = $this->request->get('category_id');
		$category_children = array();
		if(!empty($category_id))
		{
			$category = $this->categories->get_category((int)$category_id);
			if (isset($category))
				$category_children = $category->children;
		}

в один кусок

		$category_id = $this->request->get('category_id');
		$category_children = array();
		if(!empty($category_id))
		{

			$category = $this->categories->get_category((int)$category_id);
			if (isset($category)) {
				$category_children = $category->children;
                                $this->filename = $category->name.'.csv';
                        }
		}

Изменено: mishanya, 28.08.2015 - 14:19


#37 artbe

artbe
  • Пользователь
  • 196 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 28.08.2015 - 15:37

вообще я бы рекомендовал открывать csv файлы в openoffice и тогда не будет проблем с кодировками и не нужно будет ставить их в файл.

 

то что повторяються ничего страшного. по сути, вы можете объединить код:

		$category_id = $this->request->get('category_id');
			if(!empty($category_id)) {
			  $category = $this->categories->get_category((int)$category_id);
			  $this->filename = $category->name.'.csv';
			}
		
		$category_id = $this->request->get('category_id');
		$category_children = array();
		if(!empty($category_id))
		{
			$category = $this->categories->get_category((int)$category_id);
			if (isset($category))
				$category_children = $category->children;
		}

в один кусок

		$category_id = $this->request->get('category_id');
		$category_children = array();
		if(!empty($category_id))
		{

			$category = $this->categories->get_category((int)$category_id);
			if (isset($category)) {
				$category_children = $category->children;
                                $this->filename = $category->name.'.csv';
                        }
		}

 

Как раз и открываю с openofica. Дико извеняюсь, но такой при таком способе - экспорт виснет. Грузит и останавливает на 333% и все на этом. Не могли, ли бы глянуть на файл export.php, полный листинг привожу:

<?php

require_once('../../api/Simpla.php');

class ExportAjax extends Simpla
{	
	private $columns_names = array(
			'category'=>         'Категория',
			'name'=>             'Товар',
			'price'=>            'Цена',
			'currency'=>         'Валюта',
			'url'=>              'Адрес',
			'visible'=>          'Видим',
			'featured'=>         'Рекомендуемый',
			'brand'=>            'Бренд',
			'variant'=>          'Вариант',
			'compare_price'=>    'Старая цена',
			'sku'=>              'Артикул',
			'stock'=>            'Склад',
			'meta_title'=>       'Заголовок страницы',
			'meta_keywords'=>    'Ключевые слова',
			'meta_description'=> 'Описание страницы',
			'annotation'=>       'Аннотация',
			'body'=>             'Описание',
			'images'=>           'Изображения'
			);
			
	private $column_delimiter = ';';
	private $subcategory_delimiter = '/';
	private $products_count = 10;
	private $export_files_dir = '../files/export/';
	private $filename = 'export.csv';
	

	public function fetch()
	{
		if(!$this->managers->access('export'))
			return false;
		
		$category_id = $this->request->get('category_id');
		if(!empty($category_id)) {
		  $category = $this->categories->get_category((int)$category_id);
		  $this->filename = $category->name.'.csv';
		}

		// Эксель кушает только 1251
		setlocale(LC_ALL, 'ru_RU.1251');
		$this->db->query('SET NAMES cp1251');
		
	$category_id = $this->request->get('category_id');
		$category_children = array();
		if(!empty($category_id))
		{

			$category = $this->categories->get_category((int)$category_id);
			if (isset($category)) {
				$category_children = $category->children;
                                $this->filename = $category->name.'.csv';
                        }
		}
	
		// Страница, которую экспортируем
		$page = $this->request->get('page');
		if(empty($page) || $page==1)
		{
			$page = 1;
			// Если начали сначала - удалим старый файл экспорта
			if(is_writable($this->export_files_dir.$this->filename))
				unlink($this->export_files_dir.$this->filename);
		}
		
		// Открываем файл экспорта на добавление
		$f = fopen($this->export_files_dir.$this->filename, 'ab');
		
		// Добавим в список колонок свойства товаров
		$features = $this->features->get_features();
		foreach($features as $feature)
			$this->columns_names[$feature->name] = $feature->name;
		
		// Если начали сначала - добавим в первую строку названия колонок
		if($page == 1)
		{
			fputcsv($f, $this->columns_names, $this->column_delimiter);
		}
		
		// Все товары
		$products = array();
 		//foreach($this->products->get_products(array('page'=>$page, 'limit'=>$this->products_count)) as $p)
		foreach($this->products->get_products(array('page'=>$page, 'category_id'=>$category_children, 'limit'=>$this->products_count)) as $p)	
 		{
 			$products[$p->id] = (array)$p;
 			
	 		// Свойства товаров
	 		$options = $this->features->get_product_options($p->id);
	 		foreach($options as $option)
	 		{
	 			if(!isset($products[$option->product_id][$option->name]))
					$products[$option->product_id][$option->name] = str_replace(',', '.', trim($option->value));
	 		}

 			
 		}
 		
 		if(empty($products))
 			return false;
 		
 		// Категории товаров
 		foreach($products as $p_id=>&$product)
 		{
	 		$categories = array();
	 		$cats = $this->categories->get_product_categories($p_id);
	 		foreach($cats as $category)
	 		{
	 			$path = array();
	 			$cat = $this->categories->get_category((int)$category->category_id);
	 			if(!empty($cat))
 				{
	 				// Вычисляем составляющие категории
	 				foreach($cat->path as $p)
	 					$path[] = str_replace($this->subcategory_delimiter, '\\'.$this->subcategory_delimiter, $p->name);
	 				// Добавляем категорию к товару 
	 				$categories[] = implode('/', $path);
 				}
	 		}
	 		$product['category'] = implode(', ', $categories);
 		}
 		
 		// Изображения товаров
 		$images = $this->products->get_images(array('product_id'=>array_keys($products)));
 		foreach($images as $image)
 		{
 			// Добавляем изображения к товару чезер запятую
 			if(empty($products[$image->product_id]['images']))
 				$products[$image->product_id]['images'] = $image->filename;
 			else
 				$products[$image->product_id]['images'] .= ', '.$image->filename;
 		}
 
 		$variants = $this->variants->get_variants(array('product_id'=>array_keys($products)));

		foreach($variants as $variant)
 		{		
			if(isset($products[$variant->product_id]))
				{
					$v                    = array();
					$v['variant']         = $variant->name;
					$v['price']           = $variant->price;
					$v['currency'] 		  = $variant->currency;
						
					if ($variant->base_price)
						$v['price']           = $variant->base_price;
					else
						$v['price']           = $variant->price;
						
					if ($variant->base_price)
						$v['base_compare_price']           = $variant->base_compare_price;
					else
						$v['compare_price']   = $variant->compare_price;
						
					$v['sku']             = $variant->sku;
					$v['stock']           = $variant->stock;
					if($variant->infinity)
						$v['stock']           = '';
					$products[$variant->product_id]['variants'][] = $v;
				}
		}
		
		foreach($products as &$product)
 		{
 			$variants = $product['variants'];
 			unset($product['variants']);
 			
 			if(isset($variants))
 			foreach($variants as $variant)
 			{
 				$result = array();
 				$result =  $product;
 				foreach($variant as $name=>$value)
 					$result[$name]=$value;

	 			foreach($this->columns_names as $internal_name=>$column_name)
	 			{
	 				if(isset($result[$internal_name]))
		 				$res[$internal_name] = $result[$internal_name];
	 				else
		 				$res[$internal_name] = '';
	 			}
	 			fputcsv($f, $res, $this->column_delimiter);

	 		}
		}
		
		$total_products = $this->products->count_products(array('category_id'=>$category_children));
		
		if($this->products_count*$page < $total_products)
			return array('end'=>false, 'page'=>$page, 'category_id'=>$category_children, 'totalpages'=>$total_products/$this->products_count);
		else
			//return array('end'=>true, 'page'=>$page, 'category_id'=>$category_children, 'totalpages'=>$total_products/$this->products_count);
			return array('end'=>$this->filename, 'page'=>$page, 'category_id'=>$category_children, 'totalpages'=>$total_products/$this->products_count);

		fclose($f);

	}
	
}

$export_ajax = new ExportAjax();
$data = $export_ajax->fetch();
if($data)
{
	header("Content-type: application/json; charset=utf-8");
	header("Cache-Control: must-revalidate");
	header("Pragma: no-cache");
	header("Expires: -1");
	$json = json_encode($data);
	print $json;
}

Сделано, все как сказали


Изменено: artbe, 28.08.2015 - 15:38


#38 sergeypay

sergeypay
  • Пользователь
  • 34 сообщений
  • Программирование, SEO
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 28.08.2015 - 18:35

а как можно отсортировать? нужно отсортировать так как в админке Каталога, тоесть сначала идут все товары с "категории 1/подкатегории 1" и после того как вывелись все товары с этой подкатегории выводились товары с "категории 1/подкатегории 2"?



#39 sergeypay

sergeypay
  • Пользователь
  • 34 сообщений
  • Программирование, SEO
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 01.09.2015 - 16:38

Подскажите как сделать сортировку по категориям и подкатегориям...



#40 koteyka

koteyka

    Фрилансер

  • Пользователь
  • 1 345 сообщений
  • Программирование
  • Версия CMS:2.x
  • Откуда:Днепропетровск

Опубликовано 01.09.2015 - 17:11

В api/Categories.php замени

	public function get_product_categories($product_id)
	{
		$query = $this->db->placehold("SELECT product_id, category_id, position FROM __products_categories WHERE product_id in(?@) ORDER BY position", (array)$product_id);
		$this->db->query($query);
		return $this->db->results();
	}	

на

	public function get_product_categories($product_id)
	{
		$query = $this->db->placehold("SELECT product_id, category_id, position FROM __products_categories WHERE product_id in(?@) ORDER BY name", (array)$product_id);
		$this->db->query($query);
		return $this->db->results();
	}	

или просто замени в запросе position на name.

Но это повлияет не только на экспорт, а и на вывод на сайте. Чтобы было только в экспорте, то нужно эту функцию переносить в файл экспорта и обращаться к ней через $this.


Изменено: koteyka, 01.09.2015 - 17:12






Также с меткой «Экспорт товаров»

0 пользователей читают эту тему

0 пользователей, 0 гостей, 0 скрытых