Как стать автором
Обновить

Фильтруй базар: пишем простой и функциональный фильтр данных

Время на прочтение3 мин
Количество просмотров2.1K
image
Кто-то спросит, каким образом фильтры грубой очистки топлива на картинке справа относятся к PHP\IT в целом? Очень просто! Скрипт, о котором пойдет речь дальше, очень схож как по назначению, так и по функциональности с данными приспособлениями. Каждый понимает, что реализовать более менее универсальный фильтр «сверхтонкой очистки» (в нашем случае — выполняющий любые пожелания пользователя) на практике не всегда оказывается тривиальной задачей. Однако, реализовать что-то действительно простое, но при этом функциональное и достаточно применимое вполне реально. Что это, собственно, за «реально» и с чем его едят — смотрим под катом.

PHP — не мое основное занятие, но даже мне не раз уже приходилось сталкиваться с ситуацией, когда необходимо реализовать простой и функциональный фильтр данных для отображения тех или иных данных пользователю. Простейший пример — админка в практически любой системе. Да, это разработчику проще зайти в какой-нибудь PMA и руками вытащить себе любую плюшку, но заказчики, увы, на такое в большинстве своем не способны и не должны.

В итоге я написал скрипт, на вход которого в большинстве случаев (в зависимости от типа данных, об этом пойдет речь чуть ниже) достаточно подать всего 2 массива данных вида:

$FIELDS = array (
'active' => 'checkbox',
'sex' => 'select',
'type' => 'select',
'hp' => 'int',
'ep' => 'int',
'id' => 'int',
'bonus' => 'int',
'description' => 'text'
);

$NAMEFIELDS = array (
'active' => 'Активно',
'sex' => 'Пол',
'type' => 'Тип предмета',
'description' => 'Описание',
'hp' => 'Здоровье',
'ep' => 'Энергия',
'bonus' => 'Бонусы'
);

Первый массив представляет собой перечисление тех полей и типов, которые буду доступны для фильтрации, а второй — их символьное отображение для пользовательского интерфейса. На текущий момент у меня реализована обработка 4-х типов: числовой одиночный (просто число), выбор из заранее заготовленного списка (тип select), текстовый и булевый (да\нет). Как ни странно, этого оказалось вполне достаточным для того, чтобы прикрутить фильтр фактически к любой таблице и осуществить поиск по ней. Как я описывал выше, для мощных, сложных кросстабличных поисков используются другие механизмы, которые для каждой системы будут индивидуальны.

Для случая, если поле представляет собой множественный выбор (например, пол — мужской\женский\юнисекс), в функцию передается третий параметр следующего вида:

$additional = array (
'sex' => $SEX,
'type' => $TYPES
);

где $SEX и $TYPES как раз-таки массивы с возможным набором значений.

Кто-то начнет кричать, зачем изобретать велосипед при наличии «таких-то» фреймворков, но:
1. Я не люблю фреймворки :) Не будем спорить зачем и почему, это выйдет за рамки данного поста, у всего свое назначение
2. Всегда приятно сделать что-то более менее удобное самому.

Пример работы скрипта можно посмотреть вот тут (То же самое, но на ООП тут). При отправке запросов он Вам просто вернет сформированный запрос. Как можно заметить, при наборе одинаковых критериев (например, если несколько раз выбрать поле ID), можно получить еще более гибкую систему отбора данных.

Впрочем, я не претендую на открытия и т.п., я лишь делюсь тем, что счел для себя удобным и полезным. Быть может, пригодится и кому-то еще. Код, конечно, не заточен для групповой разработки и не содержит даже капли ООП, но при этом вполне понятен, читабелен и, если Вам надо что-то поправить\внести свои типы\заточить «под себя» — сделаете Вы это, думаю, с легкостью. Хотя, кому надо — наверняка уже давно все сделал, кто еще не успел — сможет подсмотреть ошибки в логике автора и не повторять их у себя.

Подводя итог, отмечу

плюсы
  1. Просто
  2. Достаточно универсально
  3. Достаточно функционально

минусы
  1. В данном примере используется GET-запрос, т.о. стоит учесть, что длина URL не должна превышать 2048 символов (никто не мешает Вам пользоваться POST-запросами, все зависит от задачи)
  2. Не умеет делать кросстабличные запросы
  3. Написано на коленке :)


P.S. Скачать все исходные тексты можно примерно здесь, на ООП здесь (вынес из класса только 3 ф-ции, которые можно скорее отнести к ф-циям общего пользования, поэтому лучше им находиться вне него)
P.P.S. Не ошибается только тот, кто ничего не делает.
Теги:
Хабы:
Всего голосов 28: ↑17 и ↓11+6
Комментарии21

Публикации

Истории

Работа

PHP программист
139 вакансий

Ближайшие события

One day offer от ВСК
Дата16 – 17 мая
Время09:00 – 18:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн
Антиконференция X5 Future Night
Дата30 мая
Время11:00 – 23:00
Место
Онлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург
Summer Merge
Дата28 – 30 июня
Время11:00
Место
Ульяновская область