Меня иногда просят рассказать, как делаются сложные фильтры поиска . Например, как он сделан на том же Яндекс.Маркете , где может быть сотня различных параметров отбора товаров? В этом материале я расскажу, как такое делается, ведь тут нет абсолютно ничего сложного. Всё это делается по единому принципу, о котором чи...
Меня иногда просят рассказать, как делаются сложные фильтры поиска. Например, как он сделан на том же Яндекс.Маркете, где может быть сотня различных параметров отбора товаров? В этом материале я расскажу, как такое делается, ведь тут нет абсолютно ничего сложного. Всё это делается по единому принципу, о котором читайте дальше.
Для начала должна быть таблица, по которой будет идти поиск. Пусть это будет упрощённая таблица для ноутбуков:
- id - уникальный идентификатор.
- price - цена.
- manufacturer - производитель.
- wi-fi - наличие Wi-Fi.
Теперь разберём форму поиска:
<form name="form" action="" method="post">
<table>
<tr>
<td>Цена от:</td>
<td><input type="text" name="price_start" /> рублей</td>
</tr>
<tr>
<td>Цена до:</td>
<td><input type="text" name="price_end" /> рублей</td>
</tr>
<tr>
<td colspan="2">Производитель</td>
</tr>
<tr>
<td>Apple</td>
<td>
<input type="checkbox" name="manufacturers[]" value="1" />
</td>
</tr>
<tr>
<td>Acer</td>
<td>
<input type="checkbox" name="manufacturers[]" value="2" />
</td>
</tr>
<tr>
<td>ASUS</td>
<td>
<input type="checkbox" name="manufacturers[]" value="3" />
</td>
</tr>
<tr>
<td>Наличие Wi-Fi:</td>
<td>
<input type="checkbox" name="wifi" />
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" name="filter" value="Подобрать ноутбуки" />
</td>
</tr>
</table>
</form>
Думаю, здесь, всё прозрачно. Единственное, что обратите внимание на manufacturers[]. Квадратные скобки означают, что в скрипт попадёт массив со всеми значениями, выбранными пользователем. Чтобы лучше это понять, просто выведите print_r($_POST), тогда Вы всё поймёте.
Теперь разберём скрипт. В целях упрощения скрипта я не стал его усложнять скриптами, отвечающими за безопасность, и ограничился функцией htmlspecialchars(). Однако, в реальности, обязательно надо проверять всё, что приходит от пользователя, используя, например, регулярные выражения и/или встроенные функции проверки переменных на их значение.
Главная задача скрипта - "собрать" SQL-запрос на основе того, что пришло от пользователя:
<?php
function addWhere($where, $add, $and = true) {
if ($where) {
if ($and) $where .= " AND $add";
else $where .= " OR $add";
}
else $where = $add;
return $where;
}
if (!empty($_POST["filter"])) {
$where = "";
if ($_POST["price_start"]) $where = addWhere($where, "`price` >= '".htmlspecialchars($_POST["price_start"]))."'";
if ($_POST["price_end"]) $where = addWhere($where, "`price` <= '".htmlspecialchars($_POST["price_end"]))."'";
if ($_POST["manufacturers"]) $where = addWhere($where, "`manufacturer` IN (".htmlspecialchars(implode(",", $_POST["manufacturers"])).")");
if ($_POST["wifi"]) $where = addWhere($where, "`wifi` = '1'");
$sql = "SELECT * FROM `my_table`";
if ($where) $sql .= " WHERE $where";
echo $sql;
}
?>
Как видите, сложные фильтры реализуются в PHP очень просто. Что касается "красивых" скриптов, где двигаются всякие ползунки и сразу меняется результат - это всё то же самое, только запросы отправляются не через форму, а через Ajax, а затем принимается ответ от сервера с результатом, который динамически выводится через чистый JavaScript, либо с использованием jQuery.
Вот по такому принципу делается любой фильтр поиска на PHP.
