Сегодня речь пойдет о плагине для jQuery, предназначенном для отображения табличных данных. Я наткнулся на него практически случайно. Просто раньше я и не задумывался о том, что может существовать настолько мощное решение для таблиц. Ведь в большинстве случаев данные можно показать с помощью обычной html таблицы.
jQuery Grid Plugin имеет смысл использовать если нужно работать с большими таблицами. Дело в том, что плагин существенно упрощает разбивку данных на страницы. Т.е. автоматически создается панель с кнопками перелистывания страниц, а новые данные подгружаются с помощью AJAX. Кроме того, плагин имеет кучу дополнительных функций и несколько тем оформления.
От вас требуется настроить плагин и передавать ему данные. Звучит не сложно, но как всегда есть нюансы.
Чтобы не ходить вокруг да около, давайте рассмотрим небольшой пример.
Хочу сразу предупредить. Этот пример максимально упрощен и не заменяет документацию. Он поможет понять только общий принцип работы плагина. В реальном приложении вам придется сделать кучу дополнительных настроек.
Кстати, есть демонстрационная страница со множеством интересных примеров.
Сформулируем задачу.
Допустим, у нас есть небольшая таблица (в базе данных) с данными пользователей (фамилия, имя, отчество). Нужно создать html страничку с этими данными, причем передаваться они будут в формате JSON (это не единственный формат, который поддерживает плагин, но, на мой взгляд, наиболее удобный).
Прежде всего, скачиваем плагин и распаковываем в папку с проектом.
Создаём файлы index.html (наша страничка) и getdata.php (серверный скрипт, который будет получать данные из БД и отправлять их браузеру).
Скачиваем библиотеку jQuery.
В результате должна получиться следующая структура папок.
index.html getdata.php jquery-1.3.1.min.js jquery.jqGrid.js /js ... /themes ...
Рассмотрим структуру нашей страницы.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <title>Использование jqGrid</title>
    <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    <meta http-equiv="Content-Style-Type" content="text/css" />
    
    <link rel="stylesheet" type="text/css" media="screen" href="themes/basic/grid.css" />
    <link rel="stylesheet" type="text/css" media="screen" href="themes/jqModal.css" />
</head>
<body>
    <table id="list" class="scroll"></table> 
    <div id="pager" class="scroll" style="text-align:center;"></div>
    
    <script type="text/javascript" src="jquery-1.3.1.min.js"></script>
    <script type="text/javascript" src="jquery.jqGrid.js"></script>
    <script type="text/javascript">
    jQuery(document).ready(function(){ 
        jQuery("#list").jqGrid({
            url:'getdata.php',
            datatype: 'json',
            mtype: 'POST',
            colNames:['#', 'Фамилия', 'Имя', 'Отчество'],
            colModel :[
                {name:'id', index:'id', width:30}
                ,{name:'surname', index:'surname', width:80, align:'right'}
                ,{name:'fname', index:'fname', width:90}
                ,{name:'lname', index:'lname', width:80, align:'right'}
                ],
            pager: jQuery('#pager'),
            rowNum:5,
            rowList:[5,10,30],
            sortname: 'id',
            sortorder: "asc",
            viewrecords: true,
            imgpath: 'themes/basic/images',
            caption: 'Данные пользователей'
        }); 
    }); 
    </script>
</body>
</html>
Прежде всего, обратите внимание на строки 10 и 11, в которых мы подключили файлы со стилями. В этом примере используется тема basic, но, естественно, её можно изменить.
В теле страницы мы создаем таблицу (строка 14) и панель навигации (тег div, строка 15). На данный момент они пустые, их содержимое будет создано плагином.
После этого, мы подключаем библиотеку jQuery, jQuery Grid Plugin и создаём скрипт с настройками (строки 20-41). На них мы остановимся отдельно.
url – адрес скрипта, формирующего массив с данными;
datatype – формат данных;
mtype – метод отправки запроса;
colNames – названия столбцов (используются в качестве заголовков таблицы);
colModel – параметры полей (значения и количество этих элементов должны соответствовать формату передаваемых данных);
pager – id блока в котором будет размещена навигационная панель;
rowNum – количество строк в таблице;
rowList – этот массив используется для настройки выпадающего списка, который пользователь может использовать для изменения количества строк в таблице;
sortname – поле, которое по-умолчанию используется для сортировки;
sortorder – порядок сортировки (в данном случае возрастающий);
viewrecords – указывает, нужно ли показывать в панели управления общее количество записей;
imgpath – размещение папки с изображениями;
caption – заголовок таблицы.
Настройки достаточно простые, но очень важно их внимательно заполнить.
Теперь создаем базу данных и таблицу в ней (вы можете импортировать файл users.sql из архива с этим примером, ссылка внизу страницы).
После этого займемся PHP скриптом.
<?php
try {
    //читаем параметры
    $curPage = $_POST['page'];
    $rowsPerPage = $_POST['rows'];
    $sortingField = $_POST['sidx'];
    $sortingOrder = $_POST['sord'];
    
    //подключаемся к базе
    $dbh = new PDO('mysql:host=localhost;dbname=name', 'user', 'pass');
    //указываем, мы хотим использовать utf8
    $dbh->exec('SET CHARACTER SET utf8');
    //определяем количество записей в таблице
    $rows = $dbh->query('SELECT COUNT(id) AS count FROM users');
    $totalRows = $rows->fetch(PDO::FETCH_ASSOC);
    $firstRowIndex = $curPage * $rowsPerPage - $rowsPerPage;
    //получаем список пользователей из базы
    $res = $dbh->query('SELECT * FROM users ORDER BY '.$sortingField.' '.$sortingOrder.' LIMIT '.$firstRowIndex.', '.$rowsPerPage);
    
    //сохраняем номер текущей страницы, общее количество страниц и общее количество записей
    $response->page = $curPage;
    $response->total = ceil($totalRows['count'] / $rowsPerPage);
    $response->records = $totalRows['count'];
    $i=0;
    while($row = $res->fetch(PDO::FETCH_ASSOC)) {
        $response->rows[$i]['id']=$row['id'];
        $response->rows[$i]['cell']=array($row['id'], $row['surname'], $row['fname'], $row['lname']);
        $i++;
    }
    echo json_encode($response);
}
catch (PDOException $e) {
    echo 'Database error: '.$e->getMessage();
}
// end of getdata.php
Прежде всего, обратите внимание на параметры, которые передаются в запросе (строки 4-7). С их помощью плагин указывает, какую страницу данных он хочет получить, а также по какому полю и в каком порядке она должна быть отсортирована.
После этого, мы получаем данные. В этом примере для работы с базой мы использовали библиотеку PDO (параметры подключения к базе вам, конечно, нужно будет указать свои, строка 10).
Обратите внимание. Скрипт максимально упрощен, т.е. убрана проверку параметров, которые передает плагин. В реальном приложении так делать НЕЛЬЗЯ.
Затем мы формируем объект с данными ($response).
В параметрах этого объекта нужно передать:
— номер текущей страницы ($response->page);
— количество страниц ($response->total);
— общее количество записей ($response->records);
— сами данные ($response->rows).
Формат, в котором нужно сохранять данные, можно изменить. Для этого придется изменить настройки плагина (в документации раздел Retrieving Data -> JSON Data).
В конце скрипта мы преобразуем данные в JSON формат и отправляем браузеру (строка 33).
Все, задача решена. Если хотите поэкспериментировать, качайте архив с примером
SourceЗаключение
Этот пример не раскрывает и 10% возможностей плагина. Например, вы можете встраивать inline редакторы для строк, изменять оформление, использовать другие форматы данных (тот же xml), создавать вложенные таблицы и т.п.
В общем, очень удобный инструмент.
Если у вас возникли вопросы, есть советы или замечания, не стесняйтесь, пишите их в комментариях. Буду рад ответить или обсудить 😉
Интересно почитать
Хрупкая красота программного кода:
 10 приемов, способных ее разрушить 


