| Поиск по товарам интернет магазина без модуля поиска (на Халяве) | |
|
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 |