Привет. В предыдущем выпуске мы рассмотрели самые основы списков, создали универсальный фильтр и получили общее представление. Сегодня мы дополним нашу конструкцию постраничником. Элемент очень важен, а также дает нам выход на дальнейшие усовершенствования. Также мы создадим одну волшебную функцию, которая нам очень поможет, запоминая все переменные нашего фильтра.
Постраничник
Общую концепцию постраничника я описывал когда-то ранее. Можно придумать любой из внешних видов, главное, чтобы он делил весь огромный запрос на части и показывал количество таких частей.
Заводим переменную GET[‘page’], в которой будем указан номер соответствующей страницы. Не забываем экранировать переменную от пользовательского ввода
$_GET['page']=intval($_GET['page']);
Теперь нам нужно сделать 2 запроса.
SELECT * FROM TABLE WHERE ".implode(' AND ',$where)LIMIT ".($_GET[‘page’]* $count_on_page).", ".$count_on_page
SELECT count(*) CNT FROM TABLE WHERE ".implode(' AND ',$where);
Где $count_on_page – константа, указывающая количество записей на страницу
А то, каким образом постраничник будет рендерится – зависит от кода постраничника.
И еще самое важное. У нас с вами теперь есть гроздь переменных фильтра. При переходе на другую страницу – нужно их сохранять, меняя только номер страницы. Давайте напишем эту вспомогательную волшебную функцию.
На вход подается массив значений, которые нужно установить принудительно, или убрать. На выходе – преобразованный GET запрос
function get_link($without=''){
if (empty($without))return $_SERVER['QUERY_STRING'];
$out=explode('&',urldecode($_SERVER['QUERY_STRING']));
$replace=array();
if (is_array($without)){
$replace=$without;
}elseif ($without!=''){
$replace[$without]='';
}
$out2=array();
foreach ($out as $value){
$exp=explode('=',$value);
// если находим заменитель - делаем преобразования
if (isset($replace[$exp[0]])){
if ($replace[$exp[0]]!==false)$out2[]=$exp[0]."=".urlencode($replace[$exp[0]]);
unset($replace[$exp[0]]);
}else{
$out2[]=$value;
}
}
// дополняеммассивоставшимисяэлементами
foreach ($replace as $key=>$value) {
$out2[]=urlencode($key)."=".urlencode($value);
}
return str_replace(' ','%20',implode("&",$out2));
}
Думаю – все понятно, что там происходит. Мы разбиваем GET строку по разделителям &. Проводим замены по имени переменной для совпавших элементов и склеиваем все обратно.
Теперь – при каждой ссылке через постраничник – мы можем использовать данную конструкцию для сохранения всех значений и замены страницы
get_link(array(‘page’=>$x));
Просто? Теперь – да :)
Вид отображения.
Здесь все также просто. Речь идет о возможности сменить стиль отображения – таблица, блоки, крупные значки, аналогично изменению представления в «моем компьютере». Мелкие значки, крупные значки, таблица… Иногда эта штуковина вовсе не нужна, но в ряде случаев бывает полезна. Нам нужно всего лишь поменять шаблон, который отображает все наши записи на другой. Расположить значки переключения мы можем рядом с фильтром.
Нам лишь нужно сохранить этот параметр на стороне клиента. А также возможно долго хранить его на протяжении длительного времени. Сессии долго не хранятся, по этому, не подходят. Можно хранить данные в таблице с настройками пользователя - это ресурсоемко. LocalStorage не поможет, т.к. шаблон выдает сервер, а прочесть переменную может только Javascript. Поэтому, выбираем куки.
Мы можем, к примеру, опереться на ту самую новую переменную GET[‘view_mode’]. И если она передается – устанавливать нужную нам куку.
if (isset($_GET['view_mode'])){
setcookie ('view_mode',$_GET['view_mode'],time()+3600*24*30*12);
$_COOKIE['view_mode']=$_GET['view_mode'];
}
А также при вложении файла с шаблоном – обратить внимание на наличие данной куки у клиента и жестко проверить на возможные значения.
Что-то вроде этого
<?if ($_COOKIE['view_mode']=='table'){
include('templates/views/table.php');
}else{
include('templates/views/block.php');
}?>
И не забываем на панели значков использовать вышеперечисленную нашу функцию с параметром
get_link(array(‘view_mode’=>’block’));
В каталоге views у нас хранятся все возможные виды отображения. Ведь список может быть на разных страницах реализован. А инклудить мы его будем из одного источника. Сразу обращаю внимание, что лучше инклудить один раз, а внутри уже обеспечивать цикл по переменной, например $data
Если нужно вывести несколько списков – перед вызовом – подставляем в $data нужный нам массив. Вы можете хранить шаблоны для отображения в соответствии со своей логикой. Просто желательно, чтобы файлы были в одном месте и место было доступно при помощи include.
Мы сделали почти все, что нужно. В заключительной мини-статье мы завершим наше творение многофункционального механизма отображения списков