HostCMS
Выдано 65 988 лицензий.
На главную страницу Карта сайта

Поиск по товарам интернет магазина без модуля поиска (на Халяве)

Список форумовПолезные решения на базе HostCMS

Поиск по товарам интернет магазина без модуля поиска (на Халяве)
denisov999

Регистрация: 23.10.2009
Создаем узел /search/ в структуре и добавляем там тип — динамическая страница, вставляем следующий код:

<?php
if (@$_GET['src'] != '') {
$stext = $_GET['src'];
$query = "SELECT shop_items_catalog_item_id FROM shop_items_catalog_table";
$res = mysql_query($query) or die(mysql_error());
$num = 0;
while ($row=mysql_fetch_array($res)) {
$allid[$num++] = $row['shop_items_catalog_item_id'];
}
$query = "SELECT * FROM shop_items_catalog_table WHERE shop_items_catalog_name LIKE '%".$stext."%'";
$res = mysql_query($query) or die(mysql_error());
$number = mysql_num_rows($res);
if ($number == 0) {
echo "<br/><b>Результаты поиска по запросу (</b>".$stext."<b>): </b>ничего не найдено";
} else {
echo "<br/><b>Результаты поиска по запросу (</b>".$stext."<b>): </b><br/><br/>";
$num = 0;
while ($row=mysql_fetch_array($res)) {
$goodsid[$num++] = $row['shop_items_catalog_item_id'];
}
$gid = '';
$result = array_diff($allid, $goodsid);
foreach ($result as $aid)
{
$gid .= $aid.", ";
}
$shop = & singleton('shop');
$param['current_group_id'] = false;
$param['items_on_page'] = $num;
$param['NotIn'] = $gid;
$external_propertys = array();
$shop->ShowShop(1,'МагазинКаталогТоваровПоиск',$param,$external_propertys);
}
} else {
echo "<br/><b>Результаты поиска: </b>поисковый запрос пуст!";
}
?>


Результат:
http://бест-маркет.рф/search/?src=шпроты
Профиль | Сообщений: 103 | Дата создания: 13.05.2011 21:33:38
Re: Поиск по товарам интернет магазина без модуля поиска (на Халяве)
avtozakup

Регистрация: 27.03.2011

А можно поподробнее? Разжевать так сказать для тупых
Профиль | Сообщений: 116 | Дата создания: 14.05.2011 13:01:25
Re: Поиск по товарам интернет магазина без модуля поиска (на Халяве)
Kotoff

Регистрация: 03.02.2008
Ох, denisov999, вот у вас прекрасная идея, и при этом ужасающий образец говнокода! Ну как так можно, а?

Во1х, вы не фильтруете запрос пользователя. Поскольку, во2х, вы при этом еще и не используете стандартный класс DataBase от hostcms, а вместо этого делаете какой-то свой запрос к БД, то засунуть SQL-инъекцию через ваш поиск — нефиг делать!
В3х, вы в первом запросе получаете все id товаров со _всех_ магазинов в системе! А если их несколько, да в каждом по многу товаров? Не жалеете вы ни сервер, ни движок MySQL, ни пользователя, который будет ждать пока все это выполнится.
В4х, ваш метод через исключение лишних товаров, тоже, конечно, работает, но слишком уж затратен как по памяти так и по времени. Не зря он вас пугал в соседней теме!
В5х, вы грубо нарушаете всю парадигму MVC, выводя заголовки страницы прямо из ТДС с помощью оператора echo. Такие вещи надо передавать в xml-документ через external propertys и выводить через xsl-шаблон.

Ну и еще есть к чему придраться по мелочи… Но я лучше не буду больше придираться, а опубликую здесь добработанный код.
<?php

/**
* @author James V. Kotov
*/
// идентификатор магазина
$shop_id = 1; // подставьте свой!

// название xsl-шаблона
$xsl_name = 'МагазинКаталогТоваровПоиск'; // подставьте свое

// а дальше ничего не трогайте :)

// начальное значение числа элементов на странице.
// должно быть равно нулю (на случай когда нет запроса / ничего не найдено)
$items_on_page = 0;

$param = array();
$external_propertys = array();

// проверяем, передан ли запрос
if (isset($_GET['src']) && to_str($_GET['src']) != '') {

    // очищаем запрос от возможных инъекций функцией to_str())
    $text = to_str($_GET['src']);

    $external_propertys['search_query'] = $text; // передадим в xml поисковый запрос
    
    // создадим экземпляр объекта DateClass
    $DateClass = &singleton('DateClass');
    // вычисли текущую дату в формате MySQL
    $sql_time = $DateClass->DateUnixToSQL(time());

    // формируем запрос к БД
    /* в запросе учитываем:
        - id магазина
        - активность товара
        - дату публикации товара
        - дату окончания публикации товара
        - поисковый запрос
       Все как в настоящем "фирменном" запросе :-)    
    */    
    $query = "  SELECT shop_items_catalog_item_id  
                FROM shop_items_catalog_table
                WHERE
                        shop_items_catalog_table.shop_shops_id = {$shop_id}
                    AND
                        shop_items_catalog_table.shop_items_catalog_is_active = '1'
                    AND
                        shop_items_catalog_table.shop_items_catalog_access IN (0,-1)
                    AND
                        (shop_items_catalog_table.shop_items_catalog_putend_date >= '{$sql_time}' OR shop_items_catalog_table.shop_items_catalog_putend_date = '0000-00-00 00:00:00')
                    AND
                        shop_items_catalog_table.shop_items_catalog_putoff_date <= '{$sql_time}'
                    AND
                        shop_items_catalog_table.shop_items_catalog_name LIKE '%{$text}%'";

    // создаем экземпляр класса DataBase
    $DataBase = &singleton('DataBase');

    // выполняем запрос
    $result = $DataBase->select($query);

    // получаем общее число строк, возвращенных запросом
    $count = $DataBase->get_count_row();

    // создаем массив для хранения id найденных товаров
    $items = array();

    // если запрос прошел успешно и вернул хотя бы один товар
    if ($result && $count) {

        $items_on_page = $count; // выведем на странице все найденные элементы

        while ($row = mysql_fetch_assoc($result))
            $items[] = $row['shop_items_catalog_item_id']; // заполняем наш массив идентификаторами найденных товаров

    } else
        $external_propertys['search_header'] = 'Ничего не найдено.'; // иначе передадим в xml сообщение что ничего не нашлось

    // если массив $items не пустой
    if (sizeof($items)) {

        // "раскрываем" массив в строку, через запятую
        $items_string = implode(',', $items);

        // создаем фильтр
        $element = array();

        $element['type'] = 0; // фильтр по основному свойству товара
        $element['prefix'] = ' and ('; // префикс
        $element['name'] = 'shop_items_catalog_table.shop_items_catalog_item_id'; // полное название поля, включая название таблицы
        $element['if'] = '>'; // фиктивное условие.
        $element['value'] = '0'; //фиктивное условие.

        // а вот тут собственно само условие, задающее вывод только нужных нам товаров!
        // SQL-оператор IN с перечнем нужных идентификаторов в скобках!
        $element['sufix'] = " AND shop_items_catalog_table.shop_items_catalog_item_id IN ({$items_string}) )";

        $param['select'][] = $element; // ну и передаем фильтр в параметры метода ShowShop()

    }
} else
    $external_propertys['search_header'] = 'Поисковый запрос пуст!'; // передадим в xml сообщение что запрос пустой

// создадим экземпляр объекта shop
$shop = &singleton('shop');

$param['current_group_id'] = false; // вывод из всех групп магазина
$param['items_on_page'] = $items_on_page; // передаем число товаров на странице

$shop->ShowShop($shop_id, $xsl_name, $param, $external_propertys);

?>


Вот как-то так. Не тестировал, но должно работать. Если что не так — спрашивайте

UPD: Дополнил запрос учетом активности товаров и дат начала/окончания публикации. Чтобы было как в «родных» запросах HostCMS

Внимание! В связи со сменой основного места работы, я временно не беру заказы на разработку под HostCMS.
Профиль | Сообщений: 1556 | Дата создания: 14.05.2011 13:08:02
Re: Поиск по товарам интернет магазина без модуля поиска (на Халяве)
Kotoff

Регистрация: 03.02.2008
avtozakup, надеюсь что и вам станет понятнее.

Внимание! В связи со сменой основного места работы, я временно не беру заказы на разработку под HostCMS.
Профиль | Сообщений: 1556 | Дата создания: 14.05.2011 13:11:07
Re: Поиск по товарам интернет магазина без модуля поиска (на Халяве)
avtozakup

Регистрация: 27.03.2011
Kotoff,
Ничего мне не понятно ) Что куда добавлять и где создавать? Туториал требуется
Профиль | Сообщений: 116 | Дата создания: 14.05.2011 13:25:36
Re: Поиск по товарам интернет магазина без модуля поиска (на Халяве)
Kotoff

Регистрация: 03.02.2008
avtozakup, создайте ТДС с этим кодом, создайте узел структуры с этой ТДС, создайте XSL-шаблон на основе шаблона от каталога товаров и добавьте в него форму для поиска, и в общем-то все 

Внимание! В связи со сменой основного места работы, я временно не беру заказы на разработку под HostCMS.
Профиль | Сообщений: 1556 | Дата создания: 14.05.2011 13:28:52
Re: Поиск по товарам интернет магазина без модуля поиска (на Халяве)
Kotoff

Регистрация: 03.02.2008
А пошаговой инструкции, извините, не будет.

Внимание! В связи со сменой основного места работы, я временно не беру заказы на разработку под HostCMS.
Профиль | Сообщений: 1556 | Дата создания: 14.05.2011 13:29:39
Re: Поиск по товарам интернет магазина без модуля поиска (на Халяве)
avtozakup

Регистрация: 27.03.2011
Kotoff,
Что такое ТДС?
Профиль | Сообщений: 116 | Дата создания: 14.05.2011 13:30:18
Re: Поиск по товарам интернет магазина без модуля поиска (на Халяве)
Kotoff

Регистрация: 03.02.2008
Уууу…
ТДС — Типовая динамическая страница.

Внимание! В связи со сменой основного места работы, я временно не беру заказы на разработку под HostCMS.
Профиль | Сообщений: 1556 | Дата создания: 14.05.2011 13:32:08
Re: Поиск по товарам интернет магазина без модуля поиска (на Халяве)
avtozakup

Регистрация: 27.03.2011
Чую сейчас я насоздаю…
Профиль | Сообщений: 116 | Дата создания: 14.05.2011 13:35:19

12345

Авторизация
Логин: Пароль:  

Список форумовПолезные решения на базе HostCMS

О нас говорят!

Гибкие инструменты проектирования позволяют реализовать практически любую функциональность. Наличие серьезной платформы, которая постоянно развивается, позволяет нам полностью сосредоточить внимание на задачах наших клиентов.

Зуй Алексей Юрьевич
Директор
Проектное бюро «Аполитика»

Акции партнеров

Хостинг от TimeWeb

Год хостинга в подарок при покупке любой редакции HostCMS в компании TimeWeb.

Рекомендуем хостинг

STG-HOST.COM

Тариф «HostCMS» за 200 руб./мес.

Создаете сайты?

У нас есть партнерское предложение по поставке системы управления сайтом:

О HostCMS
Редакции HostCMS
Возможности
Поддержка
Области применения
Партнерская программа
Заказать сайт