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

Проблема с url товаров


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

Так, может, надо выяснить и поправить? Или хотя бы автору про это намекнуть.

Зачем изобретать новые методы-велосипеды с новыми ошибками?

 

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

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

Ну подумайте сами. Допустим у Вас есть 20 товаров с именем Сумка.

Вы посчитали к-во 20. Добавили единицу.

А потом всем 20 товарам сделали URL sumka21.

Шило на мыло?

А зачем всем 20ти товарам, разве не для каждого отдельного товара идет проверка? У следующего будет URL sumka22

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

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

 

Конечно, небольшая. Тем не менее это ошибка. И на форуме у некоторых спецов выработался нехороший стиль вместо исправления ошибки начинать рассуждения о том, редкая она или частая. Вроде как собаке кость кинули - тебе, потребитель, и так сойдет. Радуйся, мол, что бесплатно...

И во-вторых, есть стандартный готовый код, где все уже сделано правильно...

 

А вот вероятность замечания п.1 - очень даже большая. Однако Вы на него почему-то не реагируете...

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

А зачем всем 20ти товарам, разве не для каждого отдельного товара идет проверка? У следующего будет URL sumka22

Смотря как программировать. Если так, как Вы написали, будет у всех sumka21. Если у Вас  идея другая, то и описывать ее надо ТОЧНО, а не кое-как...

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

Смотря как программировать. Если так, как Вы написали, будет у всех sumka21. Если у Вас  идея другая, то и описывать ее надо ТОЧНО, а не кое-как...

Может вы встречали нормальное решение?

Изменено пользователем Des
Ссылка на сообщение
Поделиться на другие сайты

Смотря как программировать. Если так, как Вы написали, будет у всех sumka21. Если у Вас  идея другая, то и описывать ее надо ТОЧНО, а не кое-как...

Я проверил, работает так как нужно, если есть товар sumka, добавляет товар sumka1, а если еще несколько товаров залить, будет sumka2, sumka3, sumka4

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

Я проверил, работает так как нужно, если есть товар sumka, добавляет товар sumka1, а если еще несколько товаров залить, будет sumka2, sumka3, sumka4

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

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

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

Точно, этот момент я не учёл

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

Точно, этот момент я не учёл

 

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

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

А как вам такой вариант:

 

Оставляем

if(!empty($item['url']))
	$product['url'] = trim($item['url']);
elseif(!empty($item['name']))
	$product['url'] = $this->translit($item['name']);

// выберем все товары из базы и проверим есть ли уже такой юрл
$this->db->query('SELECT count(*) as count FROM __products WHERE name=?', $product['name']);
$url_exists = $this->db->result('count');

А во второй части делаем проверку

if(empty($product_id)) {
	$product_id = $this->products->add_product($product);
					
	if($url_exists==1)
	    $this->products->update_product($product_id, array('url'=>$product['url'].'-1'));
        elseif($url_exists>1)
            //тогда выбираем url всех товаров с таким названием и находим большее число после "-" в данных url, делаем +1 и записываем текущему товару. 
      
}
Ссылка на сообщение
Поделиться на другие сайты

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

Возможно из-за версии Simpla 2.2.4, может в более свежих есть. 

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

Возможно из-за версии Simpla 2.2.4, может в более свежих есть. 

 

в api/Products.php функция add_products

 

там должен быть такой код:

		// Если есть товар с таким URL, добавляем к нему число
		while($this->get_product((string)$product['url']))
		{
			if(preg_match('/(.+)_([0-9]+)$/', $product['url'], $parts))
				$product['url'] = $parts[1].'_'.($parts[2]+1);
			else
				$product['url'] = $product['url'].'_2';
		}
Ссылка на сообщение
Поделиться на другие сайты

 

в api/Products.php функция add_products

 

там должен быть такой код:

		// Если есть товар с таким URL, добавляем к нему число
		while($this->get_product((string)$product['url']))
		{
			if(preg_match('/(.+)_([0-9]+)$/', $product['url'], $parts))
				$product['url'] = $parts[1].'_'.($parts[2]+1);
			else
				$product['url'] = $product['url'].'_2';
		}

Странно, но такая штука есть, но не работает

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

Странно, но такая штука есть, но не работает

 

может у вас не выбирает товар по юрл. скиньте ваш Products.php или дайте доступ, посмотрю.

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

С файлом импорта различия только в данном куске кода

// Иначе - добавляем
			elseif(empty($variant_id))
			{
				if(empty($product_id))
					$product_id = $this->products->add_product($product);

                $this->db->query('SELECT max(v.position) as pos FROM __variants v WHERE v.product_id=? LIMIT 1', $product_id);
                $pos =  $this->db->result('pos');

				$variant['position'] = $pos+1;
				$variant['product_id'] = $product_id;
				$variant_id = $this->variants->add_variant($variant);
				$imported_item->status = 'added';
			}

А именно, нет следующей части

                $this->db->query('SELECT max(v.position) as pos FROM __variants v WHERE v.product_id=? LIMIT 1', $product_id);
                $pos =  $this->db->result('pos');

				$variant['position'] = $pos+1;
Ссылка на сообщение
Поделиться на другие сайты

может у вас не выбирает товар по юрл. скиньте ваш Products.php или дайте доступ, посмотрю.

http://www.ex.ua/816728829993

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

А зачем следующие части в файле импорта новой версии и почему раньше их не использовали?

		// Подготовим товар для добавления в базу
		$product = array();
		// Подготовим вариант товара
		$variant = array();
Ссылка на сообщение
Поделиться на другие сайты
		if(!empty($variant_id) && !empty($product_id))
                {
                 }

а также в старой версии нет данной проверки

 

 

Также запрос в данном куске

		// Если задан артикул варианта, найдем этот вариант и соответствующий товар
		if(!empty($variant['sku']))
		{ 
			$this->db->query('SELECT id as variant_id, product_id FROM __variants, __products WHERE sku=? AND __variants.product_id = __products.id LIMIT 1', $variant['sku']);
			$result = $this->db->result();

отличается от старого варианта

		// Если задан артикул варианта, найдем этот вариант и соответствующий товар
		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($category_id && $feature_value!=='')

отличается от старого варианта

// Свойство добавляем только если для товара указана категория
				if($category_id)
Ссылка на сообщение
Поделиться на другие сайты

А зачем следующие части в файле импорта новой версии и почему раньше их не использовали?

 

Точный ответ может дать лишь автор. Но вряд ли Вы от него дождетесь такого удовольствия...

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

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

// выберем все товары из базы и проверим есть ли уже такой юрл

$this->db->query('SELECT count(*) as count FROM __products WHERE name=?', $product['name']);

$url_exists = $this->db->result('count');

А зачем так? Т.е. зачем проверять товар по имени? Можно же просто выбрать урл и сравнить его. И еще, наверное, будет рациональнее выбрать все урлы за один запрос в массив, а потом сравнивать из него, не делая запрос каждый раз.

П.С. Хотя, в массиве окажутся урлы только имеющихся товаров... Не вариант это, если одинаковые названия будут в файле импорта, просчитался.

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

А зачем так? Т.е. зачем проверять товар по имени? Можно же просто выбрать урл и сравнить его. И еще, наверное, будет рациональнее выбрать все урлы за один запрос в массив, а потом сравнивать из него, не делая запрос каждый раз.

П.С. Хотя, в массиве окажутся урлы только имеющихся товаров... Не вариант это, если одинаковые названия будут в файле импорта, просчитался.

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

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

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

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

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

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

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

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

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

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

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