Привет. Сегодня несколько общих деталей черт на пути к реализации идеальной таблицы отображения всего на любых сайтах. Сегодня мы соберем все вместе и соберем в общих чертах для себя универсальный правильный механизм для отображения информации. Если Вы еще не поняли о чем речь – сегодня мы поговорим о том, как сделать настраиваемый список чего-либо.
Подразумевается, что читатель хорошо знаком с HTML, разбирается в основном синтаксисе SQL запросов и Владеет PHP на достаточно хорошем уровне. Многие тривиальные вещи, а также детали, которые могут быть любым образом созданы - в статье не раскрываются, подразумевается, что читатель сам достроит их при необходимости.
Списком - могут быть товары в интернет магазинах, или частные объявления. Может быть, список строк в админке. Может быть, любое другое отображение чего-либо. Все форумы состоят из записей в тем или иным отображением
Список, который клиент может настроить под себя. Вот части, которые мы разберем ниже:
Вывод данных. Фильтр. Постраничник. Вид отображения. Сортировка. Количество записей на странице.
Вот все основные части, которые нам могут понадобиться. Насчет группировки – пока еще не уверен, но это в принципе возможно. Мы хотим дать клиенту возможность самостоятельно настроить вывод записей в нужном ему порядке, в нужном количестве и в нужной рубрике. А еще наша задача – сделать это максимально просто. Чтобы легко было разобраться и перенастроить.
Вы ведь понимаете, что веб формат не слишком приспособлен для такого рода отображения. Хоть и база данных позволяет проделать все эти операции у себя на стороне, но передавать их в рамках приложения – может быть весьма затруднительно. Часть надо сохранить в памяти, часть – позволить настроить клиенту при загрузке. Нам могут быть переданы массивы. А Вы ведь понимаете, что передавать массив через GET параметр весьма затруднительно. Сегодня мы все это разберем
Вывод данных
Основная часть, без которой все остальное не имеет смысла. Нужно лишь взять данные из таблицы и отобразить их. Можно в виде таблицы. SELECT * FROM TABLE
. И выводим данные в нужной нам структуре вместе с тегами html.
Сразу стоит обратить внимание на то, что показываться могут не все данные, а также показываться могут лишь некоторые выдержки… Начало большого описания, метро, город, раздел каталога. При этом с точки зрения нагрузки – можно выдергивать только нужные столбцы, а также можно придумать отдельный столбец для вспомогательных данных для ускорения работы всей системы. Расшифровки городов, метро можно записывать в виде строк, чтобы при большой выборке использовать как можно меньше JOIN объединений.
Фильтр
Наверное – самая тяжелая с точки зрения реализации возможность. Пользователь путем ввода максимальных и минимальных значений может ограничить просмотр всех записей, отбросив лишние.
Все параметры будем передавать через GET, чтобы в любой момент можно было попасть на нужную страницу через ссылку, да и вообще…
Достраиваем визуально таблицу со строками минимальное значение – максимальное значение. Списки просто обобщаем на 2 строки с параметром size=4 multiple. Имена полей ставим ~field~_minи ~field~_max. Для списков – ставим ~field~[]. Чтобы легче было ориентироваться – пусть fieldсовпадает с названием в базе. Да и вообще – давайте определимся, чтобы названия полей совпадали с установками в базе.
На уровне запроса – создаем переменную $WHERE=array(); Если мы работаем через BIND– создаем также переменную BIND
И дописываем в нее данные
if (!empty($_GET['min_id'])){
$where[]="TABLE.ID>=:min_id";
$bind['min_id']=intval($_GET['min_id']);
}
if (!empty($_GET['max_id'])){
$where[]="TABLE.ID<=:max_id";
$bind['max_id']=intval($_GET['max_id']);
}
Числа экранируем через INTVAL, строки – через mysql_real_escape_string. Списки обрабатываем через условие IN в SQL запросе
if (isset($_GET['filter_field'])){
$wherearr=array();
foreach($_GET['filter_field'] as $key=> $item){
$bind['filter_field_'.$key]=$item;
$wherearr[]=':filter_field_'.$key;
}
$where[]="TABLE.FIELD IN (".implode(',',$wherearr).")";
}
Лучше всего в фильтре указывать синоним таблицы, чтобы в случае совпадения полей при объединении таблиц – не было конфликтов. А в финале – к общему запросу прибавляется
$sql="SELECT * FROM TABLE WHERE ".implode(' AND ',$where);
При этом одно лишь ограничение: Если при отсутствии фильтрации – у вас не предусмотрено никаких условий – подпишите
$WHERE[]=’true’; или $WHERE[]=’1=1’;
По поводу больших описаний и названий – в фильтре могут быть текстовые поля, реализованные при помощи конструкции LIKE, либо MATCH в SQL, похожим образом.
Вроде бы пока все просто. В следующих выпусках мы подробнее доведем наше дело до конечного варианта. Создадим самую главную вспомогательную волшебную функцию, которая является корнем и поможет нам в дальнейшем. Но мы уже знаем, как просто создать фильтр. Фильтры – довольно частая задача, которую в общем смысле решить не всегда удается легко и просто.
Гость
хорошая статья