Поиск по артикулу 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 s_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 s_products p LEFT JOIN s_images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM s_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 s_products p LEFT JOIN s_images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM s_images WHERE product_id=p.id LIMIT 1), s_variants WHERE p.id=s_variants.product_id AND (p.name LIKE "%'.mysql_real_escape_string($keyword).'%" OR s_variants.sku LIKE "%'.mysql_real_escape_string($keyword).'%") AND visible=1 ORDER BY p.name LIMIT ?', $limit);
С этим файлом тоже все. Теперь выведем наш артикул на страницу.
Для этого идем в шаблоны нашей темы, файл product.tpl. И в нужном месте (например после заголовка) пишем: Арт.{$product->variant->sku}.
Вот и все. Вопросы в комментарии.
Обновлено.
Для версии 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 s_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 s_products p LEFT JOIN s_images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM s_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 s_products p LEFT JOIN s_images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM s_images WHERE product_id=p.id LIMIT 1), s_variants WHERE p.id=s_variants.product_id AND (p.name LIKE "%'.mysql_real_escape_string($keyword).'%" OR s_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
Коментарии
Пока нет комментариев.