Реализация качественного вывода данных. ч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
  • Просмотров: 925
  • Комментариев: 0
  • Создан: 27.12.2012 17:51

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