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

#
Поиск по товарам интернет магазина без модуля поиска (на Халяве)
Создаем узел /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=шпроты
#
Re: Поиск по товарам интернет магазина без модуля поиска (на Халяве)

А можно поподробнее ? Разжевать так сказать для тупых
#
Re: Поиск по товарам интернет магазина без модуля поиска (на Халяве)
Ох, 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
Заказов не беру. Консультирую редко.
#
Re: Поиск по товарам интернет магазина без модуля поиска (на Халяве)
avtozakup, надеюсь что и вам станет понятнее.
Заказов не беру. Консультирую редко.
#
Re: Поиск по товарам интернет магазина без модуля поиска (на Халяве)
Kotoff,
Ничего мне не понятно ) Что куда добавлять и где создавать ? Туториал требуется
#
Re: Поиск по товарам интернет магазина без модуля поиска (на Халяве)
avtozakup, создайте ТДС с этим кодом, создайте узел структуры с этой ТДС, создайте XSL-шаблон на основе шаблона от каталога товаров и добавьте в него форму для поиска, и в общем-то все
Заказов не беру. Консультирую редко.
#
Re: Поиск по товарам интернет магазина без модуля поиска (на Халяве)
А пошаговой инструкции, извините, не будет.
Заказов не беру. Консультирую редко.
#
Re: Поиск по товарам интернет магазина без модуля поиска (на Халяве)
Kotoff,
Что такое ТДС ?
#
Re: Поиск по товарам интернет магазина без модуля поиска (на Халяве)
Уууу...
ТДС - Типовая динамическая страница.
Заказов не беру. Консультирую редко.
#
Re: Поиск по товарам интернет магазина без модуля поиска (на Халяве)
Чую сейчас я насоздаю...
Авторизация