Реализация качественного вывода данных. ч2. Постраничник

добавлен постраничник

Привет. В предыдущем выпуске мы рассмотрели самые основы списков, создали универсальный фильтр и получили общее представление. Сегодня мы дополним нашу конструкцию постраничником. Элемент очень важен, а также дает нам выход на дальнейшие усовершенствования. Также мы создадим одну волшебную функцию, которая нам очень поможет, запоминая все переменные нашего фильтра.

Постраничник

Общую концепцию постраничника я описывал когда-то ранее. Можно придумать любой из внешних видов, главное, чтобы он делил весь огромный запрос на части и показывал количество таких частей.

Заводим переменную 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.

Мы сделали почти все, что нужно. В заключительной мини-статье мы завершим наше творение многофункционального механизма отображения списков

Больше материалов выкладываю на своем Дзен канале

  • Автор: kosmom
  • Рейтинг: 0
  • Просмотров: 1039
  • Комментариев: 0
  • Создан: 27.12.2012 17:51

Комментарии (0)

Ваши предложения и пожелания пишите на pro@kosmom.ru

Теги

ajax axios backup bootstrap core framework eloquent excel home project html ios javascript keep-alive kpi laravel legacy mvp orm php rip scroll solid timestamp undefined vue vuetify watch безопасность биометрический паспорт ваша любаша для путешествий загран на 10 лет загран паспорт загранпаспорт нового образца зимние книги как заполнить анкеты кеширование книги на новый год логирование мцф недвижимость новогодние книги образец заполнения антеты паспорт для путешествий паспорт нового поколения печать продукт проектирование прокси разработка ремонт ремонт в апартаментах ремонт нежилого помещения самокат сдача сколько стоил ремонт апартаментов спорт стандарты таблица финансы хостинг цена ремонта что почитать зимой юзабилити

Случайный пост

11.10.2011 18:25
Конец второй недели