Перейти к содержанию
Официальный форум поддержки Simpla

Рекомендуемые сообщения

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

simpla 2.1.5

Ссылка на сообщение
Поделиться на другие сайты

спасибо большоей
было полезно почитать
но все оказалось на много проще...
при первом импорте товара, ссылки создаются.
но если повторно скормить CSV магазину, то произойдет обновление товара согласно этому файлу.
чтоб ссылки не слетали, нужно в импортируемом файле CSV просто удалить колонку АДРЕС

Ссылка на сообщение
Поделиться на другие сайты
  • 1 месяц спустя...

Ребята прошу помощи  (ПОВТОР) пишу уже повторно, нужно срочное решение вопроса!

 

Суть проблемы такова :

Я пользуюсь программой PDS Price для формирования файла импорта для симплы

При выгрузке происходит следующее, заливается файл и ссылка получается вида    

 



 

http://site.com/apple-ipod-nano-7gen-16gb-(silver)
 
 

 

 

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

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

Понятное дело что можно и ручками, но когда товаров несколько тысяч это делать не реально

Чем можете помочь, подскажите? Как заставить симплу формировать правильные урлы? 

Ссылка на сообщение
Поделиться на другие сайты

Я в курсе, умник

Пишу уже повторно, нужно срочное решение вопроса!   - поэтому и указал!!!

НУЖНО СРОЧНО, а от разработчика ответа не следует

Ссылка на сообщение
Поделиться на другие сайты

Попробуй в файле simpla/ajax/import.php после

$res = preg_replace('/[^\p{L}\p{Nd}\d-]/ui', '', $res); (строка 369)

добавить

$res = rawurlencode($res);

Ссылка на сообщение
Поделиться на другие сайты

Нахожу в файле импорта у себя только такой код

		$res = preg_replace("/[\s]+/ui", '-', $res);

если вставить после этого ссылка станвоится вида 

http://SITE.com/products/philips-saeco-talea-touch-plus-%2b-mi-(ri9829%2f11)

и опять не активна

 

 

Сам файл импорта вот

<?php

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

class ImportAjax extends Simpla
{	
	// Соответствие полей в базе и имён колонок в файле
	private $columns_names = array(
			'name'=>             array('product', 'name', 'товар', 'название', 'наименование'),
			'url'=>              array('url', 'адрес'),
			'visible'=>          array('visible', 'published', 'видим'),
			'featured'=>         array('featured', 'hit', 'хит', 'рекомендуемый'),
			'category'=>         array('category', 'категория'),
			'brand'=>            array('brand', 'бренд'),
			'variant'=>          array('variant', 'вариант'),
			'price'=>            array('price', 'цена'),
			'compare_price'=>    array('compare price', 'старая цена'),
			'sku'=>              array('sku', 'артикул'),
			'stock'=>            array('stock', 'склад', 'на складе'),
			'meta_title'=>       array('meta title', 'заголовок страницы'),
			'meta_keywords'=>    array('meta keywords', 'ключевые слова'),
			'meta_description'=> array('meta description', 'описание страницы'),
			'annotation'=>       array('annotation', 'аннотация', 'краткое описание'),
			'description'=>      array('description', 'описание'),
			'images'=>           array('images', 'изображения')
			);
	
	// Соответствие имени колонки и поля в базе
	private $internal_columns_names = array();

	private $import_files_dir      = 'simpla/files/import/'; // Временная папка		
	private $import_file           = 'import.csv';           // Временный файл
	private $category_delimiter = ',';                       // Разделитель каегорий в файле
	private $subcategory_delimiter = '/';                    // Разделитель подкаегорий в файле
	private $column_delimiter      = ';';
	private $products_count        = 10;
	private $columns               = array();

	public function import()
	{
		// Для корректной работы установим локаль UTF-8
		setlocale(LC_ALL, 'ru_RU.UTF-8');
		
		// Определяем колонки из первой строки файла
		$f = fopen($this->import_files_dir.$this->import_file, 'r');
		$this->columns = fgetcsv($f, null, $this->column_delimiter);

		// Заменяем имена колонок из файла на внутренние имена колонок
		foreach($this->columns as &$column)
		{ 
			if($internal_name = $this->internal_column_name($column))
			{
				$this->internal_columns_names[$column] = $internal_name;
				$column = $internal_name;
			}
		}

		// Если нет названия товара - не будем импортировать
		if(!in_array('name', $this->columns) && !in_array('sku', $this->columns))
			return false;
	 	
		// Переходим на заданную позицию, если импортируем не сначала
		if($from = $this->request->get('from'))
			fseek($f, $from);
		
		// Массив импортированных товаров
		$imported_items = array();	
		
		// Проходимся по строкам, пока не конец файла
		// или пока не импортировано достаточно строк для одного запроса
		for($k=0; !feof($f) && $k<$this->products_count; $k++)
		{ 
			// Читаем строку
			$line = fgetcsv($f, 0, $this->column_delimiter);

			$product = null;			

			if(is_array($line))			
			// Проходимся по колонкам строки
			foreach($this->columns as $i=>$col)
			{
				// Создаем массив item[название_колонки]=значение
 				if(isset($line[$i]) && !empty($line) && !empty($col))
					$product[$col] = $line[$i];
			}
			
			// Импортируем этот товар
	 		if($imported_item = $this->import_item($product))
				$imported_items[] = $imported_item;
		}

		/*
		if(count($variants_ids)>0)
		{
			// Для отчета выбираем импортированные товары
	 		$variants = (array)$this->variants->get_variants(array('id'=>$variants_ids));
	 		$products_ids = array();

	 		foreach($variants as $v)
	 			$products_ids[] = $v->product_id;
	 		
	 		$products = array();	
	 		foreach($this->products->get_products(array('id'=>$products_ids)) as $p)
	 			$products[$p->id] = $p;
	 		

	 		foreach($variants as $v)
	 		{
	 			$imported_items[$v->id]->variant_id = $v->id;
	 			$imported_items[$v->id]->product_id = $v->product_id;
	 			$imported_items[$v->id]->variant_name = $v->name;
	 			$imported_items[$v->id]->product_name = $products[$v->product_id]->name;
	 		}
 		}
 		else
 		{
 			$imported_items = null;
 		}
		*/
		
		// Запоминаем на каком месте закончили импорт
 		$from = ftell($f);
 		
 		// И закончили ли полностью весь файл
 		$result->end = feof($f);

		fclose($f);
		$size = filesize($this->import_files_dir.$this->import_file);
		
		// Создаем объект результата
		$result->from = $from;          // На каком месте остановились
		$result->totalsize = $size;     // Размер всего файла
		$result->items = $imported_items;   // Импортированные товары
	
		return $result;
	}
	
	// Импорт одного товара $item[column_name] = value;
	private function import_item($item)
	{
		// Проверим не пустое ли название и артинкул (должно быть хоть что-то из них)
		if(empty($item['name']) && empty($item['sku']))
			return false;

		// Подготовим товар для добавления в базу
		if(isset($item['name']))
			$product['name'] = trim($item['name']);

		if(isset($item['meta_title']))
			$product['meta_title'] = trim($item['meta_title']);

		if(isset($item['meta_keywords']))
			$product['meta_keywords'] = trim($item['meta_keywords']);

		if(isset($item['meta_description']))
			$product['meta_description'] = trim($item['meta_description']);

		if(isset($item['annotation']))
			$product['annotation'] = trim($item['annotation']);

		if(isset($item['description']))
			$product['body'] = trim($item['description']);
	
		if(isset($item['visible']))
			$product['visible'] = intval($item['visible']);

		if(isset($item['featured']))
			$product['featured'] = intval($item['featured']);
	
		if(isset($item['url']))
			$product['url'] = trim($item['url']);
		elseif(isset($item['name']))
			$product['url'] = $this->translit($item['name']);
	
		// Если задан бренд
		$item['brand'] = trim($item['brand']);	
		if(!empty($item['brand']))
		{
			// Найдем его по имени
			$this->db->query('SELECT id FROM __brands WHERE name=?', $item['brand']);
			if(!$product['brand_id'] = $this->db->result('id'))
				// Создадим, если не найден
				$product['brand_id'] = $this->brands->add_brand(array('name'=>$item['brand'], 'meta_title'=>$item['brand'], 'meta_keywords'=>$item['brand'], 'meta_description'=>$item['brand']));
		}
		
		// Если задана категория
		$category_id = null;
		$categories_ids = array();
		if(isset($item['category']))
		{
			foreach(explode($this->category_delimiter, $item['category']) as $c)
				$categories_ids[] = $this->import_category($c);
			$category_id = reset($categories_ids);
		}
	
		// Подготовим вариант товара
		if(isset($item['variant']))
			$variant['name'] = trim($item['variant']);
			
		if(isset($item['price']))
			$variant['price'] = str_replace(',', '.', trim($item['price']));
			
		if(isset($item['compare_price']))
			$variant['compare_price'] = trim($item['compare_price']);
			
		if(isset($item['stock']))
			if($item['stock'] == '')
				$variant['stock'] = null;
			else
				$variant['stock'] = trim($item['stock']);
			
		if(isset($item['sku']))
			$variant['sku'] = trim($item['sku']);
		
		// Если задан артикул варианта, найдем этот вариант и соответствующий товар
		if(!empty($variant['sku']))
		{ 
			$this->db->query('SELECT id as variant_id, product_id FROM __variants WHERE sku=? LIMIT 1', $variant['sku']);
			$result = $this->db->result();
			if($result)
			{
				// и обновим товар
				if(!empty($product))
					$this->products->update_product($result->product_id, $product);
				// и вариант
				if(!empty($variant))
					$this->variants->update_variant($result->variant_id, $variant);
				
				$product_id = $result->product_id;
				$variant_id = $result->variant_id;
				// Обновлен
				$imported_item->status = 'updated';
			}
		}
		
		// Если на прошлом шаге товар не нашелся, и задано хотя бы название товара
		if((empty($product_id) || empty($variant_id)) && isset($item['name']))
		{
			if(isset($item['variant']))
				$this->db->query('SELECT v.id as variant_id, p.id as product_id FROM __products p LEFT JOIN __variants v ON v.product_id=p.id AND v.name=? WHERE p.name=? LIMIT 1', $item['variant'], $item['name']);
			else
				$this->db->query('SELECT v.id as variant_id, p.id as product_id FROM __products p LEFT JOIN __variants v ON v.product_id=p.id WHERE p.name=? LIMIT 1', $item['name']);			
			
			$r =  $this->db->result();
			if($r)
			{
				$product_id = $r->product_id;
				$variant_id = $r->variant_id;
			}
			// Если товар найден - обноаляем,
			if(!empty($variant_id))
			{
				$this->variants->update_variant($variant_id, $variant);
				$this->products->update_product($product_id, $product);				
				$imported_item->status = 'updated';		
			}
			// Иначе - добавляем
			elseif(empty($variant_id))
			{
				if(empty($product_id))
					$product_id = $this->products->add_product($product);
				$variant['product_id'] = $product_id;
				$variant_id = $this->variants->add_variant($variant);
				$imported_item->status = 'added';		
			}
		}
		
		// Нужно вернуть обновленный товар
		$imported_item->variant = $this->variants->get_variant(intval($variant_id));			
		$imported_item->product = $this->products->get_product(intval($product_id));						

		// Добавляем категории к товару
		if(!empty($categories_ids))
			foreach($categories_ids as $c_id)
				$this->categories->add_product_category($product_id, $c_id);

 		// Изображения товаров
 		if(isset($item['images']))
 		{
 			// Изображений может быть несколько, через запятую
 			$images = explode(',', $item['images']);
 			foreach($images as $image)
 			{
 				$image = trim($image);
 				if(!empty($image))
 				{
	 				// Имя файла
					$image_filename = pathinfo($image, PATHINFO_BASENAME);
	 				
	 				// Добавляем изображение только если такого еще нет в этом товаре
					$this->db->query('SELECT filename FROM __images WHERE product_id=? AND (filename=? OR filename=?) LIMIT 1', $product_id, $image_filename, $image);
					if(!$this->db->result('filename'))
					{
						$this->products->add_image($product_id, $image);
					}
				}
 			}
 		}
 		// Характеристики товаров
 		foreach($item as $feature_name=>$feature_value)
 		{
 			// Если нет такого названия колонки, значит это название свойства
 			if(!in_array($feature_name, $this->internal_columns_names))
 			{ 
 				// Свойство добавляем только если для товара указана категория
				if($category_id)
				{
					$this->db->query('SELECT f.id FROM __features f WHERE f.name=? LIMIT 1', $feature_name);
					if(!$feature_id = $this->db->result('id'))
						$feature_id = $this->features->add_feature(array('name'=>$feature_name));
						
					$this->features->add_feature_category($feature_id, $category_id);				
					$this->features->update_option($product_id, $feature_id, $feature_value);
				}
				
 			}
 		} 		
 		return $imported_item;
	}
	
	
	// Отдельная функция для импорта категории
	private function import_category($category)
	{			
		// Поле "категория" может состоять из нескольких имен, разделенных subcategory_delimiter-ом
		// Только неэкранированный subcategory_delimiter может разделять категории
		$delimiter = $this->subcategory_delimiter;
		$regex = "/\\DELIMITER((?:[^\\\\\DELIMITER]|\\\\.)*)/";
		$regex = str_replace('DELIMITER', $delimiter, $regex);
		$names = preg_split($regex, $category, 0, PREG_SPLIT_DELIM_CAPTURE);
		$id = null;   
		$parent = 0; 
		
		// Для каждой категории
		foreach($names as $name)
		{
			// Заменяем \/ на /
			$name = trim(str_replace("\\$delimiter", $delimiter, $name));
			if(!empty($name))
			{
				// Найдем категорию по имени
				$this->db->query('SELECT id FROM __categories WHERE name=? AND parent_id=?', $name, $parent);
				$id = $this->db->result('id');
				
				// Если не найдена - добавим ее
				if(empty($id))
					$id = $this->categories->add_category(array('name'=>$name, 'parent_id'=>$parent, 'meta_title'=>$name,  'meta_keywords'=>$name,  'meta_description'=>$name, 'url'=>$this->translit($name)));

				$parent = $id;
			}	
		}
		return $id;
	}

	private function translit($text)
	{
		$ru = explode('-', "А-а-Б-б-В-в-Ґ-ґ-Г-г-Д-д-Е-е-Ё-ё-Є-є-Ж-ж-З-з-И-и-І-і-Ї-ї-Й-й-К-к-Л-л-М-м-Н-н-О-о-П-п-Р-р-С-с-Т-т-У-у-Ф-ф-Х-х-Ц-ц-Ч-ч-Ш-ш-Щ-щ-Ъ-ъ-Ы-ы-Ь-ь-Э-э-Ю-ю-Я-я"); 
		$en = explode('-', "A-a-B-b-V-v-G-g-G-g-D-d-E-e-E-e-E-e-ZH-zh-Z-z-I-i-I-i-I-i-J-j-K-k-L-l-M-m-N-n-O-o-P-p-R-r-S-s-T-t-U-u-F-f-H-h-TS-ts-CH-ch-SH-sh-SCH-sch---Y-y---E-e-YU-yu-YA-ya");

	 	$res = str_replace($ru, $en, $text);
		$res = preg_replace("/[\s]+/ui", '-', $res);
	 	$res = strtolower($res);
	    return $res;  
	}
	
	// Фозвращает внутреннее название колонки по названию колонки в файле
	private function internal_column_name($name)
	{
 		$name = trim($name);
 		$name = str_replace('/', '', $name);
 		$name = str_replace('\/', '', $name);
		foreach($this->columns_names as $i=>$names)
		{
			foreach($names as $n)
				if(!empty($name) && preg_match("/^".preg_quote($name)."$/ui", $n))
					return $i;
		}
		return false;				
	}
}

$import_ajax = new ImportAjax();
header("Content-type: application/json; charset=UTF-8");
header("Cache-Control: must-revalidate");
header("Pragma: no-cache");
header("Expires: -1");		
		
$json = json_encode($import_ajax->import());
print $json;

 

 

Попробуй в файле simpla/ajax/import.php после

$res = preg_replace('/[^\p{L}\p{Nd}\d-]/ui', '', $res); (строка 369)

добавить

$res = rawurlencode($res);

Ссылка на сообщение
Поделиться на другие сайты

РАЗРАБОТЧИКИ вы помочь можете????

При обновлении прайса этот тупой импорт делает следующее: на уже существующих товарах и которые были ранее исправлены ручками через админ панель он меняет URL и если в названии скобок появляется значит и скобки, соответственно "СТРАНИЦА не найдена" это серьезный бок, что делать!!!

Ссылка на сообщение
Поделиться на другие сайты

РАЗРАБОТЧИКИ вы помочь можете????

При обновлении прайса этот тупой импорт делает следующее: на уже существующих товарах и которые были ранее исправлены ручками через админ панель он меняет URL и если в названии скобок появляется значит и скобки, соответственно "СТРАНИЦА не найдена" это серьезный бок, что делать!!!

Ответа от разработчика Вы не дождетесь скорее всего никогда. Экспорт и импорт товаров в симпле полностью корректно не работал никогда.

 

Чем еще Вас порадовать... Попробуйте прочесть второе предложение в Вашем посте. Оно не читабельно. Понять, что Вы имеете в виду не представляется возможным.

 

Если Вы хотите, что бы Вам помогли бесплатным советом - соизвольте выражать свои мысли понятно.

Ссылка на сообщение
Поделиться на другие сайты

Я ГОТОВ ЗА это заплатить я не говорю что бесплатно, если кто то поможет и устранит это проблему я считаю справедливым насыпать человеку за его труд немного баксов )

СУТЬ ТАКАЯ 

 

1.Я сгенерировал прайс програмкой.

2.Заливаю на симплу.

3. Вижу ссылки вида

http://site.ua/products/htc-windows-phone-8x-(ua)

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

http://cross.ua/products/htc-desire-sv-black-ua

5. Далее через программку от поставщиков получаю прайс, пытаюсь обновить цены.

6. Обновляю и ссылка снова обновляется до вида

http://site.ua/products/htc-windows-phone-8x-(ua)

 

И в тоге страница опять не доступна, клиент который заходит на страницу и видит ошибку "Страница на найдена"

 

Ответа от разработчика Вы не дождетесь скорее всего никогда. Экспорт и импорт товаров в симпле полностью корректно не работал никогда.

 

Чем еще Вас порадовать... Попробуйте прочесть второе предложение в Вашем посте. Оно не читабельно. Понять, что Вы имеете в виду не представляется возможным.

 

Если Вы хотите, что бы Вам помогли бесплатным советом - соизвольте выражать свои мысли понятно.

Ссылка на сообщение
Поделиться на другие сайты

Правильно ли я понимаю, url товаров импортируется тоже из файла. Однако, при импорте не происходит очищение url от скобок?

 

if(isset($item['url']))
  $product['url'] = trim($item['url']);
elseif(isset($item['name']))
  $product['url'] = $this->translit($item['name']);
 
После этого в лоб обработать url в нужный Вам формат.
 
$product['url'] = str_replace(array("(", ")"), "", $product['url']);
Ссылка на сообщение
Поделиться на другие сайты

В файле импорта нету получается вообще URl и он создает его автоматически, и при этом делает его таким как в файле, например знаки плюса, знак восклицания тоже остается или слеши все остается

Сейчас попробую вашу подсказку

 

Правильно ли я понимаю, url товаров импортируется тоже из файла. Однако, при импорте не происходит очищение url от скобок?

 

if(isset($item['url']))
  $product['url'] = trim($item['url']);
elseif(isset($item['name']))
  $product['url'] = $this->translit($item['name']);
 
После этого в лоб обработать url в нужный Вам формат.
 
$product['url'] = str_replace(array("(", ")"), "", $product['url']);
Ссылка на сообщение
Поделиться на другие сайты

Вроде помогло

Добавил немного своих символов получилась такая строка 

 

$product['url'] = str_replace(array("(", ")", "!", "=", "!", "?", ".", "/", "+"), "", $product['url']);

СПАСИБО ОГРОМНОЕ

 

 

 

Правильно ли я понимаю, url товаров импортируется тоже из файла. Однако, при импорте не происходит очищение url от скобок?

 

if(isset($item['url']))
  $product['url'] = trim($item['url']);
elseif(isset($item['name']))
  $product['url'] = $this->translit($item['name']);
 
После этого в лоб обработать url в нужный Вам формат.
 
$product['url'] = str_replace(array("(", ")"), "", $product['url']);
Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...