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

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


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

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

 

При залитии в Симплу товаров с одинаковыми названиями для них генерируется одинаковые урл, из-за это товары могут не корректно отображаться на сайте. Например если у нас есть активный товар с урлом /products/tovar и другой неактивный и урлом /products/tovar, периодически они могут замещать друг друга.

т.е. При нажатии на товар в категории будет писать что товар не найден, то тех пор, пока не изменишь урл неактивного товара на /products/tovar_1.

 

Вопрос, возможно есть решение для автоматической генерации урлов типу /products/tovar_1, /products/tovar_2, /products/tovar_3 во время импорта?

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

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

 

При залитии в Симплу товаров с одинаковыми названиями для них генерируется одинаковые урл, из-за это товары могут не корректно отображаться на сайте. Например если у нас есть активный товар с урлом /products/tovar и другой неактивный и урлом /products/tovar, периодически они могут замещать друг друга.

т.е. При нажатии на товар в категории будет писать что товар не найден, то тех пор, пока не изменишь урл неактивного товара на /products/tovar_1.

 

Вопрос, возможно есть решение для автоматической генерации урлов типу /products/tovar_1, /products/tovar_2, /products/tovar_3 во время импорта?

 

нужно в simpla/ajax/import.php, в районе строки 150 где

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

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

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

нужно в simpla/ajax/import.php, в районе строки 150 где

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

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

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

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

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

 

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

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

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

Я подумал что то проверка) 

Я знаю что её туда нужно добавить, по этому и спрашиваю)

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

Я подумал что то проверка) 

Я знаю что её туда нужно добавить, по этому и спрашиваю)

 

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

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

замените код что выше (150я строка), на

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 url=?', $product['url']);
$url_exists = $this->db->result('count');

и дальше в этом же файле строкм 248 заменить

if(empty($product_id))
	$product_id = $this->products->add_product($product);

на

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

А можно еще вопросик?

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

Тут вы подсчитываете количество таких адресов, верно?

 

А тут вы в конце добавляете id товара в конце урл?

$this->products->update_product($product_id, array('url'=>$product['url'].$product_id));

Можно как-то вместо id товара добавлять количество урлов +1? Хотя это нужно будет проверять до тех пор, пока не останется не одного урла типу /products/tovar_1, /products/tovar_2, /products/tovar_3.

Может лучше посчитать количество товаров с одинаковым названием и к тому количеству делать +1?

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

 

замените код что выше (150я строка), на

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 url=?', $product['url']);
$url_exists = $this->db->result('count');

и дальше в этом же файле строкм 248 заменить

if(empty($product_id))
	$product_id = $this->products->add_product($product);

на

if(empty($product_id)) {
	$product_id = $this->products->add_product($product);
					
	if($url_exists)
	         $this->products->update_product($product_id, array('url'=>$product['url'].$product_id));
}

Я так понимаю, нужно изменить так:

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

и там что-то типу такого

	if($url_exists)
	         $this->products->update_product($product_id, array('url'=>$product['url'].$url_exists));
}

Но это чисто предположения и мне кажется, что лучше их даже не пробовать))

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

нет. я же написал. нужно 

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

заменить на 

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 url=?', $product['url']);
$url_exists = $this->db->result('count');

и дальше заменить 

if(empty($product_id))
	$product_id = $this->products->add_product($product);

на 

if(empty($product_id)) {
	$product_id = $this->products->add_product($product);
					
	if($url_exists)
	    $this->products->update_product($product_id, array('url'=>$product['url'].$product_id));
}

не нужно придумывать ничего. как написано так и менять

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

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

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

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

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

 

Вот полный вариант моей теории))

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)
	    $this->products->update_product($product_id, array('url'=>$product['url'].$url_exists));
}
Ссылка на сообщение
Поделиться на другие сайты

Все предложенные решения имеют следующие недостатки:

1. Они относительно хорошо выполняют свою работу только при СОЗДАНИИ товара. Если же товар обновляется, то URL формируется по-старому, без изменений.

ТО есть если Вы хотите исправить URL-ы, делаете экспорт, а потом импорт полученного файла в расчете на исправление URL-ов, то ничего не выйдет. Надо предварительно удалять товары, а это может породить массу других проблем. 

 

2. Сама проверка проводится недостаточно хорошо. Проверяется, есть ли уже такой URL, и если есть, то проводится модификация. Но и модифицированный URL уже может существовать и тогда надо модифицировать иначе - это автор метода упускает.

 

А вообще - предложенный метод - изобретение своего велосипеда. Готовый код для модификации URL-а есть в стандартном  API в функции   add_product($product)...

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

Все предложенные решения имеют следующие недостатки:

1. Они относительно хорошо выполняют свою работу только при СОЗДАНИИ товара. Если же товар обновляется, то URL формируется по-старому, без изменений.

ТО есть если Вы хотите исправить URL-ы, делаете экспорт, а потом импорт полученного файла в расчете на исправление URL-ов, то ничего не выйдет. Надо предварительно удалять товары, а это может породить массу других проблем. 

 

2. Сама проверка проводится недостаточно хорошо. Проверяется, есть ли уже такой URL, и если есть, то проводится модификация. Но и модифицированный URL уже может существовать и тогда надо модифицировать иначе - это автор метода упускает.

 

А вообще - предложенный метод - изобретение своего велосипеда. Готовый код для модификации URL-а есть в стандартном  API в функции   add_product($product)...

 

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

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

   А вообще - предложенный метод - изобретение своего велосипеда. Готовый код для модификации URL-а есть в стандартном  API в функции   add_product($product)...

 

есть и он должен работать и при импорте, видимо у автора он не работает.

 

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

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

Все предложенные решения имеют следующие недостатки:

1. Они относительно хорошо выполняют свою работу только при СОЗДАНИИ товара. Если же товар обновляется, то URL формируется по-старому, без изменений.

ТО есть если Вы хотите исправить URL-ы, делаете экспорт, а потом импорт полученного файла в расчете на исправление URL-ов, то ничего не выйдет. Надо предварительно удалять товары, а это может породить массу других проблем. 

 

2. Сама проверка проводится недостаточно хорошо. Проверяется, есть ли уже такой URL, и если есть, то проводится модификация. Но и модифицированный URL уже может существовать и тогда надо модифицировать иначе - это автор метода упускает.

 

А вообще - предложенный метод - изобретение своего велосипеда. Готовый код для модификации URL-а есть в стандартном  API в функции   add_product($product)...

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

 

А как вам вариант если просто считать количество товаров с одинаковым названием и это ко-лово + 1 добавлять к урлу?

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

значит что двух таких товаров быть не может.

 

А это вывод совсем НЕ правильный.

Надеюсь, сами сообразите, почему.

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

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

 

А как вам вариант если просто считать количество товаров с одинаковым названием и это ко-лово + 1 добавлять к урлу?

 

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

 

в моем же варианте, айди товара всегда уникален.

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

 

А это вывод совсем НЕ правильный.

Надеюсь, сами сообразите, почему.

 

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

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

А как вам вариант если просто считать количество товаров с одинаковым названием и это ко-лово + 1 добавлять к урлу?

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

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

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

Шило на мыло?

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

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

Допустим, есть

1. товар с URL nokia400.

2. у таблицы товаров текущий autoincrement = 400

3. Добавляется НОВЫЙ товар nokia

4. В результате работы Вашего метода благополучно возникнут два разных товара с URL nokia400...

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

Допустим, есть

1. товар с URL nokia400.

2. у таблицы товаров текущий autoincrement = 400

3. Добавляется НОВЫЙ товар nokia

4. В результате работы Вашего метода благополучно возникнут два разных товара с URL nokia400...

 

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

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

есть и он должен работать и при импорте, видимо у автора он не работает.

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

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

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

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

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

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

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

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

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

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

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

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