walexnokia Posted October 4, 2013 Report Share Posted October 4, 2013 При поиске можно вывести ещё и цену очень удобно. не надо заходить и смотреть Стиль .header-search-suggest-uah{color:#329a1c;line-height:1em;font-weight:bold;}JAVA SCRIPT <script> $(function() { // Автозаполнитель поиска $(".input_search").autocomplete({ serviceUrl:'ajax/search_products.php', minChars:1, noCache: false, onSelect: function(value, data){ $(".input_search").closest('form').submit(); }, fnFormatResult: function(value, data, currentValue){ var reEscape = new RegExp('(\\' + ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\'].join('|\\') + ')', 'g'); var pattern = '(' + currentValue.replace(reEscape, '\\$1') + ')'; return (data.image?"<img align=absmiddle src='"+data.image+"'> ":'') + value.replace(new RegExp(pattern, 'gi'), '<strong>$1<\/strong>')+(data.price?"</br>Цена:<div class='header-search-suggest-uah'>"+data.price+"</div>":''); } }); }); </script> {/literal}В папке AJAXajax/search_products.php <?php chdir('..'); require_once('api/Simpla.php'); $simpla = new Simpla(); $limit = 30; $keyword = $simpla->request->get('query', 'string'); был $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,p.views, v.price, i.filename as image FROM __products p JOIN __variants v ON v.product_id=p.id LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id AND v.product_id=p.id LIMIT 1) WHERE p.name LIKE "%'.mysql_real_escape_string($keyword).'%" AND visible=1 ORDER BY p.name LIMIT ?', $limit); $products = $simpla->db->results(); foreach($products as $product) { if(!empty($product->image)) { $product->image = $simpla->design->resize_modifier($product->image, 35, 35); $products_names[] = $product->name; $products_views[] = $product->views; после добавляем строчку $products_price[] = $product->price; } else $products_names[] = $product->name; $products_views[] = $product->views; после добавляем строчку $products_price[] = $product->price; $products_data[] = $product; } $res->query = $keyword; $res->suggestions = $products_names; $res->data = $products_data; header("Content-type: application/json; charset=UTF-8"); header("Cache-Control: must-revalidate"); header("Pragma: no-cache"); header("Expires: -1"); print json_encode($res);Ну а сам вывод стандартный <div id="search"> <form action="products"> <input class="input_search" type="text" name="keyword" value="{$keyword|escape}" placeholder="Поиск товара"/> <input class="button_search" value="" type="submit" /> </form> </div> Quote Link to post Share on other sites
Dimon789 Posted October 4, 2013 Report Share Posted October 4, 2013 выложите переделанные файлы так роще будет или отредактируйте код )) Quote Link to post Share on other sites
cernos Posted March 12, 2014 Report Share Posted March 12, 2014 Доделал еще незначительно поиск: 1. Научил искать по названиям категорий2. Подстановка ссылки на товар и категорию и соответственно переход.3. Для категории идет подпись "Перейти в категорию" Если кому интересно пишите. Пока идет разработка новой версии моего магазина, можете посмотреть демку: http://demo.energodom.com.ua/ в живую. Quote Link to post Share on other sites
cernos Posted March 14, 2014 Report Share Posted March 14, 2014 (edited) Установка моей версии "Допилинного поиска AJAX" 1. Открываем файл: ajax/search_products.php2. Вместо: $keyword = $simpla->request->get('query', 'string'); Вставляем $keyword = $simpla->request->get('query', 'string');$SearchCategory = $simpla->request->get('category', 'string'); /**ПОИСК КАТЕГОРИЙ**/ if($SearchCategory == 1) { $simpla->db->query('SELECT `parent_id`, `name`, `url`, `image` FROM `s_categories` WHERE (`name` LIKE "%'.mysql_real_escape_string($keyword).'%" OR `meta_keywords` LIKE "%'.mysql_real_escape_string($keyword).'%" OR `meta_keywords` LIKE "%'.mysql_real_escape_string($keyword).'%") AND visible=1 ORDER BY `name` LIMIT 2', $limit); $categories = $simpla->db->results(); foreach($categories as $category){ if($category->image == "")$category->image = "noimage_category.jpg"; $category->image = "/files/categories/".$category->image; $products_names[] = $category->name; getCategoryTreeUrl($category->url,$category->parent_id,Array()); $category->url = "/catalog/".$category->url; $category->thiss = "category"; $products_data[] = $category; } } 3. Находим запрос в базу стандартный:$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);Заменяем на .... ВЫБЕРИТЕ НУЖНЫЙ ИЗ ЧЕТЫРЕХ: 3.1. Стандартный вывод искомых товаров SIMPLA, НО из результатов поиска убираются товары, кол-во которых равно НУЛЮ. За это отвечает условие "AND (v.stock>0 OR v.stock is NULL)" при необходимости можно удалить, чтобы показывались все товары, даже которых нет в наличии.$simpla->db->query('SELECT p.id, p.name, p.url, v.price, i.filename as `image` FROM s_products p JOIN __variants v ON v.product_id=p.id LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id AND v.product_id=p.id LIMIT 1) WHERE p.name LIKE "%'.mysql_real_escape_string($keyword).'%" AND visible=1 AND (v.stock>0 OR v.stock is NULL) ORDER BY p.name LIMIT ?', $limit); 3.2. Запрос: Если у товара несколько вариантов, то выводит так же и имя варианта, напр. IPhone Белый, IPhone Черный$simpla->db->query('SELECT p.id, CONCAT_WS(" ",p.name,v.name) as `name`, p.url, v.price, i.filename as `image` FROM __products p JOIN __variants v ON v.product_id=p.id LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id AND v.product_id=p.id LIMIT 1) WHERE p.name LIKE "%'.mysql_real_escape_string($keyword).'%" AND visible=1 AND (v.stock>0 OR v.stock is NULL) ORDER BY p.name LIMIT ?', $limit); 3.3. Запрос для дополнения предыдущего, добавляет к ссылке товара ?variant=ID для перехода из поиска сразу к выбранному варианту товара$simpla->db->query('SELECT p.id, CONCAT_WS(" ",p.name,v.name) as `name`, REPLACE(CONCAT_WS("?", p.url, CAST(v.position AS CHAR)),"\'","") as `url`, v.price, i.filename as `image` FROM __products p JOIN __variants v ON v.product_id=p.id LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id AND v.product_id=p.id LIMIT 1) WHERE p.name LIKE "%'.mysql_real_escape_string($keyword).'%" AND visible=1 AND (v.stock>0 OR v.stock is NULL) ORDER BY p.name LIMIT ?',"?variant=", $limit); 3.4 Запрос, выводит только один товар, первый вариант товара в поиске, даже если их несколько.$simpla->db->query('SELECT p.id, p.name, p.url, v.price, i.filename as `image` FROM s_products p JOIN __variants v ON v.product_id=p.id LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id AND v.product_id=p.id LIMIT 1) WHERE p.name LIKE "%'.mysql_real_escape_string($keyword).'%" AND visible=1 AND (v.stock>0 OR v.stock is NULL) GROUP BY v.product_id ORDER BY p.name LIMIT ?', $limit); 4. Находим:foreach($products as $product) { if(!empty($product->image)) { $product->image = $simpla->design->resize_modifier($product->image, 35, 35); $products_names[] = $product->name; } else $products_names[] = $product->name; $products_data[] = $product; }Заменяем на:foreach($products as $product) { if(!empty($product->image)) { $product->image = $simpla->design->resize_modifier($product->image, 35, 35); $products_names[] = $product->name; } else{ $product->image = "noproductimage.jpg"; $products_names[] = $product->name; } $product->url = "/products/".$product->url; $products_data[] = $product; } ЕСЛИ У ВАС СТАНДАРТНЫЙ НЕ ИЗМЕННЫЙ ФАЙЛ, ТО ВОТ СОДЕРЖИМОЕ ВСЕГО ФАЙЛА:<?php chdir('..'); require_once('api/Simpla.php'); $simpla = new Simpla(); $limit = 30; $keyword = $simpla->request->get('query', 'string'); $SearchCategory = $simpla->request->get('category', 'string'); /**ПОИСК КАТЕГОРИЙ**/ if($SearchCategory == 1) { $simpla->db->query('SELECT `parent_id`, `name`, `url`, `image` FROM `s_categories` WHERE (`name` LIKE "%'.mysql_real_escape_string($keyword).'%" OR `meta_keywords` LIKE "%'.mysql_real_escape_string($keyword).'%" OR `meta_keywords` LIKE "%'.mysql_real_escape_string($keyword).'%") AND visible=1 ORDER BY `name` LIMIT 2', $limit); $categories = $simpla->db->results(); foreach($categories as $category){ if($category->image == "")$category->image = "noimage_category.jpg"; $category->image = "/files/categories/".$category->image; $products_names[] = $category->name; getCategoryTreeUrl($category->url,$category->parent_id,Array()); $category->url = "/catalog/".$category->url; $category->thiss = "category"; $products_data[] = $category; } } /**ПОИСК ТОВАРОВ**/ $simpla->db->query('SELECT p.id, CONCAT_WS(" ",p.name,v.name) as `name`, p.url, v.price, i.filename as `image` FROM __products p JOIN __variants v ON v.product_id=p.id LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id AND v.product_id=p.id LIMIT 1)WHERE p.name LIKE "%'.mysql_real_escape_string($keyword).'%" AND visible=1 AND (v.stock>0 OR v.stock is NULL) ORDER BY p.name LIMIT ?', $limit); $products = $simpla->db->results(); foreach($products as $product) { if(!empty($product->image)) { $product->image = $simpla->design->resize_modifier($product->image, 35, 35); $products_names[] = $product->name; } else{ $product->image = "noproductimage.jpg"; $products_names[] = $product->name; } $product->url = "/products/".$product->url; $products_data[] = $product; } $res->query = $keyword; $res->suggestions = $products_names; $res->data = $products_data; header("Content-type: application/json; charset=UTF-8"); header("Cache-Control: must-revalidate"); header("Pragma: no-cache"); header("Expires: -1"); print json_encode($res);Файлы JS и CSS.Удалите существующие в /js/autocomplete/ и замените на файлы из архива.autocomplete.zipПодключать, так: <link href="/js/autocomplete/autocomplete/auto.complete.css" rel="stylesheet" type="text/css" /> <script src="/js/autocomplete/autocomplete/jquery.autocomplete-min.js" type="text/javascript"></script> <script src="/js/autocomplete/autocomplete/auto.complete.js" type="text/javascript"></script> Чтобы настроить ширину всплывающих подсказок, откройте файл auto.complete.js и измените значение width Так же создайте для себя изображения, если отсутствует лого товара или категории, названия и месторасположения такие:Для категории: /files/categories/noimage_category.jpgДля товара: /files/products/noproductimage.jpgВроде бы все. И вроде ничего не упустил, пробуйте, менял код кое где на ходу, потому что генерация URL товаров и категорий у меня измененная! Сообщено обновлено 15.03.2014 - изменены запросы к БД с различными условиями вывода и компановки результатов поиска! Пункт 3autocomplete.zip Edited March 15, 2014 by cernos Quote Link to post Share on other sites
chubr Posted March 14, 2014 Report Share Posted March 14, 2014 подскажите, а как из AJAX поиска убрать товары, которых нет в наличии? а то из-за этого вообще пришлось его отключить( Quote Link to post Share on other sites
sergei5770 Posted March 14, 2014 Report Share Posted March 14, 2014 подскажите, а как из AJAX поиска убрать товары, которых нет в наличии? а то из-за этого вообще пришлось его отключить(удалить товары с сайта) Quote Link to post Share on other sites
chubr Posted March 14, 2014 Report Share Posted March 14, 2014 это не способ, товары вновь могут появится и симпла синхронизируется с 1С Quote Link to post Share on other sites
cernos Posted March 14, 2014 Report Share Posted March 14, 2014 Вариант №1 скрыть товар, скрытые товары не выводятся в поиске, Вариант №2 измените запрос к базе данных:По идеи так, но не проверял.$simpla->db->query('SELECT p.id, p.name, p.url, v.price, i.filename as image FROM __products p JOIN __variants v ON v.product_id=p.id LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id AND v.product_id=p.id LIMIT 1) WHERE p.name LIKE "%'.mysql_real_escape_string($keyword).'%" AND visible=1 AND v.stock>0 ORDER BY p.name LIMIT ?', $limit); Quote Link to post Share on other sites
cernos Posted March 14, 2014 Report Share Posted March 14, 2014 Если запрос подойдет, сообщите Quote Link to post Share on other sites
chubr Posted March 15, 2014 Report Share Posted March 15, 2014 Вариант №1 скрыть товар, скрытые товары не выводятся в поиске, Вариант №2 измените запрос к базе данных:По идеи так, но не проверял. $simpla->db->query('SELECT p.id, p.name, p.url, v.price, i.filename as image FROM __products p JOIN __variants v ON v.product_id=p.id LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id AND v.product_id=p.id LIMIT 1) WHERE p.name LIKE "%'.mysql_real_escape_string($keyword).'%" AND visible=1 AND v.stock>0 ORDER BY p.name LIMIT ?', $limit); вставил, теперь проданные не отображаются, но если у товара несколько характеристик, то он отображается в нескольких экземплярах Quote Link to post Share on other sites
cernos Posted March 15, 2014 Report Share Posted March 15, 2014 (edited) вставил, теперь проданные не отображаются, но если у товара несколько характеристик, то он отображается в нескольких экземплярах Сейчас посмотрю, что можно сделать, протестируете... -----Обновление: тестируйте, выложил. У меня всё норм работает! Edited March 15, 2014 by cernos Quote Link to post Share on other sites
cernos Posted March 15, 2014 Report Share Posted March 15, 2014 НОВЫЙ ЗАПРОС, ФИКСЫ:1. Если стоит на кол-ве товара значение NULL (тобишь не 0, а NULL, тогда когда в админке кол-во не устанавливается) или больше ноля - товар выводится в поиске2. При выводе найденого товара добавляется его ВАРИАНТ ИМЯ, Скажем Iphone Белый и Iphone Черный тем самым предотвращая дубли товаров. $simpla->db->query('SELECT p.id, CONCAT_WS(" ",p.name,v.name) as `name`, p.url, v.price, i.filename as `image` FROM __products p JOIN __variants v ON v.product_id=p.id LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id AND v.product_id=p.id LIMIT 1) WHERE p.name LIKE "%'.mysql_real_escape_string($keyword).'%" AND visible=1 AND (v.stock>0 OR v.stock is NULL) ORDER BY p.name LIMIT ?', $limit); Quote Link to post Share on other sites
chubr Posted March 15, 2014 Report Share Posted March 15, 2014 НОВЫЙ ЗАПРОС, ФИКСЫ:1. Если стоит на кол-ве товара значение NULL (тобишь не 0, а NULL, тогда когда в админке кол-во не устанавливается) или больше ноля - товар выводится в поиске2. При выводе найденого товара добавляется его ВАРИАНТ ИМЯ, Скажем Iphone Белый и Iphone Черный тем самым предотвращая дубли товаров. $simpla->db->query('SELECT p.id, CONCAT_WS(" ",p.name,v.name) as `name`, p.url, v.price, i.filename as `image` FROM __products p JOIN __variants v ON v.product_id=p.id LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id AND v.product_id=p.id LIMIT 1) WHERE p.name LIKE "%'.mysql_real_escape_string($keyword).'%" AND visible=1 AND (v.stock>0 OR v.stock is NULL) ORDER BY p.name LIMIT ?', $limit); а как можно все таки сделать, чтобы выводился товар без характеристик? Quote Link to post Share on other sites
cernos Posted March 15, 2014 Report Share Posted March 15, 2014 а как можно все таки сделать, чтобы выводился товар без характеристик?Что вы имеете ввиду? Чтобы показывался только один товар, первый из всех возможных его вариантов? Кстати, готов обновленный запрос, который создает ссылку для товаров с вариантами типа:Iphone Белый - /products/apple-iphone-4s-16gb?variant=1Iphone Черный - /products/apple-iphone-4s-16gb?variant=2 ЗАПРОС: $simpla->db->query('SELECT p.id, CONCAT_WS(" ",p.name,v.name) as `name`, REPLACE(CONCAT_WS("?", p.url, CAST(v.position AS CHAR)),"\'","") as `url`, v.price, i.filename as `image` FROM __products p JOIN __variants v ON v.product_id=p.id LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id AND v.product_id=p.id LIMIT 1) WHERE p.name LIKE "%'.mysql_real_escape_string($keyword).'%" AND visible=1 AND (v.stock>0 OR v.stock is NULL) ORDER BY p.name LIMIT ?',"?variant=", $limit); Quote Link to post Share on other sites
cernos Posted March 15, 2014 Report Share Posted March 15, 2014 а как можно все таки сделать, чтобы выводился товар без характеристик?Написал решение запроса необходимое Вам, смотрите сообщение: http://forum.simplacms.ru/topic/5728-модернизация-поиска-ajax/?p=53395 Пункт 3.4 Или вот запрос: $simpla->db->query('SELECT p.id, p.name, p.url, v.price, i.filename as `image` FROM s_products p JOIN __variants v ON v.product_id=p.id LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id AND v.product_id=p.id LIMIT 1) WHERE p.name LIKE "%'.mysql_real_escape_string($keyword).'%" AND visible=1 AND (v.stock>0 OR v.stock is NULL) GROUP BY v.product_id ORDER BY p.name LIMIT ?', $limit); Quote Link to post Share on other sites
DraveMor Posted September 3, 2014 Report Share Posted September 3, 2014 Это для какой версии Simpla ? Quote Link to post Share on other sites
cernos Posted September 19, 2014 Report Share Posted September 19, 2014 Можно сказать для все 2.* но смотреть нужно код, поидеи подойдет. Quote Link to post Share on other sites
MaLeN Posted September 25, 2014 Report Share Posted September 25, 2014 Можно сказать для все 2.* но смотреть нужно код, поидеи подойдет.Вставил всё как вы говорили, но на поиске моём что бы я не вводил, одно и тоже вылазит, без картинок в предачу, как решить проблему?Опиши что да куда именно сувать (в какие файлы) Quote Link to post Share on other sites
cernos Posted September 25, 2014 Report Share Posted September 25, 2014 Вставил всё как вы говорили, но на поиске моём что бы я не вводил, одно и тоже вылазит, без картинок в предачу, как решить проблему?Опиши что да куда именно сувать (в какие файлы)все расписано здесь: http://forum.simplacms.ru/topic/5728-%D0%BC%D0%BE%D0%B4%D0%B5%D1%80%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0-ajax/?do=findComment&comment=53395 Сложности с установкой? за 10$ помогу! Quote Link to post Share on other sites
MaLeN Posted September 29, 2014 Report Share Posted September 29, 2014 все расписано здесь: http://forum.simplacms.ru/topic/5728-%D0%BC%D0%BE%D0%B4%D0%B5%D1%80%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0-ajax/?do=findComment&comment=53395 Сложности с установкой? за 10$ помогу!А за просто так? Всё делаю по плану вашему всё по вставлял сам файл search - туда вставил ваши данные и потом вписал даные, тобишь запросы. И в неткр случаях вылазит когда воожу данные 2 строки одна без картинок и тд,а 2 с картинками за ним и ещё в гривнях чего то а не врубляйх. Quote Link to post Share on other sites
MaLeN Posted September 29, 2014 Report Share Posted September 29, 2014 Человек сделал доработку и бесплатно выложил инструкцию, а вы хотите чтобы он, забесплатно, ещё и вам на сайт её установил? Приведите хоть один аргумент, почему он должен это сделать. Новый опыт? - Человек уже делал такую задачу, ничему новому он не научитсяДеньги? - Денег человек за это не получитПерспектива работы в дальнейшем? - Судя по диалогу, вряд-ли. А больше я не вижу, что может смотивировать человека на работу.Прежде писать ерунду, читать научитесь, я не прошу беслптано установку ничего, 10$ это понты, но человек нигде не отвечает, не надо флудить. Quote Link to post Share on other sites
cernos Posted September 30, 2014 Report Share Posted September 30, 2014 Ответил в лс и скайп. Quote Link to post Share on other sites
bahonio Posted January 28, 2015 Report Share Posted January 28, 2015 (edited) Подскажите пожалуйста, как сделать, чтобы поиск искал слова в описании товара? Edited January 28, 2015 by bahonio Quote Link to post Share on other sites
Gragory Posted February 8, 2015 Report Share Posted February 8, 2015 как сделать поиск по вариантам товара, чтобы нажимая на вариант товара пользователь переходил на сам товар (не на вариант). И надо сделать так, чтобы в поиске варианты отображались списком под самим товаром Quote Link to post Share on other sites
yaskin Posted February 11, 2015 Report Share Posted February 11, 2015 Если запрос подойдет, сообщитеМожно поинтересоваться для какой цели знак подчеркивания в категориях?demo.energodom.com.ua/_bytovaya-tehnikaДля seo модуля? Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.