Поиск по артикулу simpla

Поиск по артикулу simpla

Сейчас научимся делать поиск товара по артикулу на cms simpla. Функция очень полезная, потому что если много схожего товара, то выбрать нужный поможет только артикул. Бонусом реализуем аяксовый поиск, который позволит до окончания набора поисковой фразы показать релевантные варианты. В общем, поехали.

Заходим на ftp, идем в api/Products.php. После строки $keywords = explode(' ', $filter['keyword']); добавляем:

$keywords_table = ', s_variants v ';
$keywords_field = ', v.sku ';

Это делаем 2 раза (в 2 местах в файле).

Чуть ниже запрос:

$keyword_filter .= $this->db->placehold('AND (p.name LIKE
 "%'.mysql_real_escape_string(trim($keyword)).'%" OR p.meta_keywords LIKE 
"%'.mysql_real_escape_string(trim($keyword)).'%") ');

Меняем на:

$keyword_filter .= $this->db->placehold(' AND p.id=v.product_id AND (v.sku LIKE
 "%'.mysql_real_escape_string(trim($keyword)).'%" OR p.name LIKE
 "%'.mysql_real_escape_string(trim($keyword)).'%" OR p.meta_keywords LIKE
 "%'.mysql_real_escape_string(trim($keyword)).'%") ');

Это делаем 2 раза (в 2 местах в файле).

В этом же файле после строки $order = 'p.position DESC'; пишем:

$keywords_table = '';
$keywords_field = '';

Дальше после LEFT JOIN __brands b ON p.brand_id = b.id пишем:

$keywords_table

Также это делаем в 2 местах. С этим файлом закончили.

Теперь идем в ajax/search_products.php и меняем запрос:

$simpla->db->query('SELECT p.id, p.name, i.filename as image FROM __products p
 
LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id LIMIT 1)
 
WHERE p.name LIKE "%'.mysql_real_escape_string($keyword).'%" AND visible=1 ORDER BY p.name LIMIT ?', $limit);

На новый:

$simpla->db->query('SELECT p.id, p.name, i.filename as image FROM __products p
 
LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id LIMIT 1), __variants
 
WHERE p.id=__variants.product_id AND (p.name LIKE "%'.mysql_real_escape_string($keyword).'%" OR __variants.sku LIKE "%'.mysql_real_escape_string($keyword).'%") AND visible=1 ORDER BY p.name LIMIT ?', $limit);

С этим файлом тоже все. Теперь выведем наш артикул на страницу.

Для этого идем в шаблоны нашей темы, файл product.tpl. И в нужном месте (например после заголовка) пишем: Арт.{$product->variant->sku}.

Вот и все. Вопросы в комментарии.

Вы можете сразу скачать обновленные файлы.

Обновлено 21.10.2014

Для версии Simpla 2.3.3 (может и раньше) поиск по артикулу с сохранением живого поиска реализуется по-другому! Все написанное выше работать не будет!

Открываем файл api/Products.php и ищем там (97 и 175 строки - 2 места):

$keywords = explode(' ', $filter['keyword']);

Ниже вставляем (в оба места):

$keywords_table = ', s_variants v ';$keywords_field = ', v.sku ';

Теперь в этом же файле ищем запрос (99 и 177 строки - 2 места):

$keyword_filter .= $this->db->placehold('AND (p.name LIKE "%'.$this->db->escape(trim($keyword)).'%" OR p.meta_keywords LIKE "%'.$this->db->escape(trim($keyword)).'%") ');

Меняем его в этих 2-х местах на:

$keyword_filter .= $this->db->placehold(' AND p.id=v.product_id AND (v.sku LIKE "%'.mysql_real_escape_string(trim($keyword)).'%" OR p.name LIKE "%'.mysql_real_escape_string(trim($keyword)).'%" OR p.meta_keywords LIKE "%'.mysql_real_escape_string(trim($keyword)).'%") ');

Дальше ищем (внимание, строка 124 - таких места 2, но работать нужно только с первым!):

LEFT JOIN __brands b ON p.brand_id = b.id

Ниже пишем:

$keywords_table

С этим файлом все. Обновим живой поиск. Для этого открываем файл ajax/search_products.php, меняем запрос:

$simpla->db->query('SELECT p.id, p.name, i.filename as image FROM __products p
	                    LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id LIMIT 1)
	                    WHERE p.name LIKE "%'.$simpla->db->escape($keyword).'%" AND visible=1 ORDER BY p.name LIMIT ?', $limit);

На:

$simpla->db->query('SELECT p.id, p.name, i.filename as image FROM __products p LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id LIMIT 1), __variants WHERE p.id=__variants.product_id AND (p.name LIKE "%'.mysql_real_escape_string($keyword).'%" OR __variants.sku LIKE "%'.mysql_real_escape_string($keyword).'%") AND visible=1 ORDER BY p.name LIMIT ?', $limit);

Вот и все. Наслаждаемся:) Полезным будет - Как вывести артикул товара в админку.

Если после изменений у вас в админке на вкладке Товары наблюдается ошибка:

Notice: Undefined variable: keywords_table in

То добавьте в начало файла api/Products.php после $order = 'p.position DESC'; записи:

$keywords_table = '';
$keywords_field = '';

На версии 2.3.6 могут возникать ошибки. Они решаются заменой:

 mysql_real_escape_string

На:

$this->db->escape

Всем успехов и прибыльных Интернет-магазинов!

27.03.17
Для просмотра сайта обновите браузер.