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

Модернизация поиска AJAX


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

При поиске можно вывести ещё и цену очень удобно. не надо заходить и смотреть 
 
Стиль
.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}
В  папке AJAX
ajax/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>

post-3162-0-78462000-1380872103_thumb.png

Ссылка на сообщение
Поделиться на другие сайты
  • Ответов 79
  • Дата создания
  • Последний ответ

Лучшие авторы в теме

Лучшие авторы в теме

Изображения в теме

  • 5 месяцев спустя...

Доделал еще незначительно поиск:

 

1. Научил искать по названиям категорий

2. Подстановка ссылки на товар и категорию и соответственно переход.

3. Для категории идет подпись "Перейти в категорию"

 

Если кому интересно пишите.

 

Пока идет разработка новой версии моего магазина, можете посмотреть демку: http://demo.energodom.com.ua/ в живую.

post-16962-0-05250200-1394618695_thumb.jpg

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

Установка моей версии "Допилинного поиска AJAX"

 

1. Открываем файл: ajax/search_products.php

2. Вместо: 

$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 - изменены запросы к БД с различными условиями вывода и компановки результатов поиска! Пункт 3

autocomplete.zip

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

подскажите, а как из AJAX поиска убрать товары, которых нет в наличии?

 

а то из-за этого вообще пришлось его отключить(

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

подскажите, а как из AJAX поиска убрать товары, которых нет в наличии?

 

а то из-за этого вообще пришлось его отключить(

удалить товары с сайта)

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

Вариант №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);
Ссылка на сообщение
Поделиться на другие сайты

 

Вариант №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);

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

 

%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%

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

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

 

%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%

Сейчас посмотрю, что можно сделать, протестируете...

 

-----

Обновление: тестируйте, выложил. У меня всё норм работает!

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

НОВЫЙ ЗАПРОС, ФИКСЫ:

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);
Ссылка на сообщение
Поделиться на другие сайты

 

НОВЫЙ ЗАПРОС, ФИКСЫ:

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);

а как можно все таки сделать, чтобы выводился товар без характеристик?

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

а как можно все таки сделать, чтобы выводился товар без характеристик?

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

 

Кстати, готов обновленный запрос, который создает ссылку для товаров с вариантами типа:

Iphone Белый   -    /products/apple-iphone-4s-16gb?variant=1

Iphone Черный -    /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);
Ссылка на сообщение
Поделиться на другие сайты

а как можно все таки сделать, чтобы выводился товар без характеристик?

Написал решение запроса необходимое Вам, смотрите сообщение: 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);
Ссылка на сообщение
Поделиться на другие сайты
  • 5 месяцев спустя...
  • 3 недели спустя...

Можно сказать для все 2.* но смотреть нужно код, поидеи подойдет.

Вставил всё как вы говорили, но на поиске моём что бы я не вводил, одно и тоже вылазит, без картинок в предачу, как решить проблему?Опиши что да куда именно сувать (в какие файлы)

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

Вставил всё как вы говорили, но на поиске моём что бы я не вводил, одно и тоже вылазит, без картинок в предачу, как решить проблему?Опиши что да куда именно сувать (в какие файлы)

все расписано здесь: 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 с картинками за ним и ещё в гривнях чего то а не  врубляйх.

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

Человек сделал доработку и бесплатно выложил инструкцию, а вы хотите чтобы он, забесплатно, ещё и вам на сайт её установил? Приведите хоть один аргумент, почему он должен это сделать.

 

Новый опыт? -  Человек уже делал такую задачу, ничему новому он не научится

Деньги? - Денег человек за это не получит

Перспектива работы в дальнейшем? - Судя по диалогу, вряд-ли.

 

А больше я не вижу, что может смотивировать человека на работу.

Прежде писать ерунду, читать научитесь, я не прошу беслптано установку ничего, 10$ это понты, но человек нигде не отвечает, не надо флудить.

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

Подскажите пожалуйста, как сделать, чтобы поиск искал слова в описании товара?

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

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

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

Если запрос подойдет, сообщите

Можно поинтересоваться для какой цели знак подчеркивания в категориях?

demo.energodom.com.ua/_bytovaya-tehnika

Для seo модуля?

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

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

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

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

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

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

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

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

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

Загрузка...

×
×
  • Создать...