css, html, php, javascript, jQuery, ajax … – решения, примеры, рецепты
25 Янв
- Не робейте -, сказала Черная Королева, – это всего-навсего баранья нога, ни больше ни меньше.
Она вам понравится, уверяю вас.
Познакомьтесь. Алиса, это Баранья Нога.
Баранья Нога, это Алиса.
Предисловие
Весь цикл статей направлен в первую очередь на начинающих разработчиков, которые постигают все прелести jQuery. Которые имеют базовые знания и понимания работы с этой библиотекой. Для разработчиков, которые впервые слышат слово jQuery я бы посоветовал цикл видео уроков Евгений Попова (Уроки 1-4 и Уроки 5-6) или книгу Геннадия Самкова jQuery. Сборник рецептов.
Во всех статьях, я постараюсь максимально подробно охватить материал, чтобы исключить появление примитивных вопросов. Также хочется сразу предупредить, я не буду учить вас программированию на PHP, этот материал как и весь ресурс посвящен в первую очередь jQuery и технологиям AJAX. Поэтому пожалйста не задавайте вопросы «как мне защититься от хакеров?», «как мне сделать авторизацию?» и т.п., на эту тему вы всегда сможете найти массу материала на дружественных сайтах.
Введение
Любой набор данных можно представить в виде двумерного массива – таблицы. Я считаю таблицу одним из фундаментальных элементов представления информации. Благодаря такой структуре организации человек может увидеть, оценить и легко манипулировать данными в такой форме.
В данном цикле статей я постараюсь познакомить вас и вместе с вами сам постигнуть все прелести замечательнейшего плагина для jQuery – jqGrid. Чтобы дать вам почувствовать этого «монстра», да-да именно «монстра», я приведу ссылку на демо-галерею сайта разработчика. Рекомендую посмотреть все примеры работы с таблицей.
Лично я, когда увидел «это» был шокирован и решил разобрать этот плагин. Но сразу же был разочарован, он не заработал! А перепроверив все еще раз я понял, что проблема не в плагине, а во мне. Вот еще одна причина, по которой я сел за этот цикл. Далее меня настигло еще одно разочарование, скрипт вызывал ошибку в IE и отказывался работать. Это было связанно с багом в коде плагина, которую устранили к версии 3.6.1 (На момент написания статьи, последняя версия была 3.6.2). Таким образом я «вляпался» в этот плагин. Уверен вы устали от моей пустой болтовни и следует перейти к делу.
I. Подготовка к установке
Перед началом любых работ нам необходимо заготовить «инструменты» и «материалы».
Инструменты (которые использую я)
Вобщем все стандартные пакеты в репозитории Debian. Если вы предпочитаете Windows, то я могу посоветовать вам Denwer
Материалы
II. Документ, в котором будет использоваться jqGrid
Аннотация:
1) Html – разметка
Итак создадим документ с разметкой следующего вида:
<!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> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Осваиваем jqGrid с Linkexchanger</title></head> <body> <table id="le_table"></table> <div id="le_tablePager"></div> </body> </html>
Как видите самый незаурядный код чистой страницы, где <table id=»le_table»></table> это и есть таблица которую вы видели на демо, а <div id=»le_tablePager»></div> – это элемент таблицы, «статус бар» (status bar), о нем поговорим позже. Здесь следует сказать, что в качестве селектора таблицы лучше использовать именно атрибут ID, почему? Ответ на этот вопрос будет дан по мере изучения плагина.
2) Html + CSS + JS
Далее переходим к подключаем необходимые стили и скрипты. Для начала создадим на сервере, в рабочем каталоге следующую структуру.
Теперь по каждому каталогу подробнее:
Теперь следует перепроверить всю структуру каталога еще раз. Именно на этом этапе я допустил первую ошибку, упоминавшуюся во введении.
Далее необходимо подключить всю эту кухню
<!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>
<meta http-equiv="Content-Type" content="text/html;
charset=utf-8" />
<title>Осваиваем jqGrid с Linkexchanger</title>
<link rel="stylesheet" type="text/css" media="screen" href="css/flick/jquery-ui-1.7.2.custom.css" />
<link rel="stylesheet" type="text/css" media="screen" href="css/ui.jqgrid.css" mce_href="css/ui.jqgrid.css" />
<style>html, body {
margin: 0;
padding: 0;
font-size: 80%;
}
</style>
<script type="text/javascript" src="js/jquery-1.4.min.js"></script>
<script type="text/javascript" src="js/i18n/grid.locale-ru.js"></script>
<script type="text/javascript" src="js/jquery.jqgrid.min.js"></script>
</head>
<body>
<table id="le_table"></table>
<div id="le_tablePager"></div>
</body>
</html>
Как видите в разметке есть еще дополнительный стиль. Этот стиль задает базовые параметры для отступов и самое главное размер шрифта! Если этого не сделать, то при использовании jQueryUI CSS Framework размер шрифта будет «не маленьким» и при этом различным в различных браузерах.
3) MySQL
Как бы мы не хотели, но в данной статье мы никак не сможем обойтись без базы данных. Поэтому я подготовил для вас дамп. Вы можете скачать его по этой ссылке или с моего домашнего сервера и экспортировать в любую БД (MySQL) например используя phpMyAdmin, у данного дампа есть один ньюанс. Аименно у некоторых названий городов «искаверкана» кодировка, т.е. проблема в дампе, но никак не в плагине!
В дампе сохранены 10тыс городов с кодами страны, региона, названием на англ., долготой, широтой, и nbit. Фактически это кусок одной таблицы БД распределения IP адресов в интернете. В принципе нам абсолютно не важно, что это будет за БД и для опытов подойдет и такая.
4) PHP
На данном этапе следует создать PHP скрипт, который будет возвращать таблице, запрашиваемую ею информацию. Вот пример такого скрипта для наших нужд
<?php
// Подключение и выбор БД
$db = mysql_connect('database_host', 'database_user',
'database_password');
mysql_select_db('database_name');
# ВНИМАНИЕ!!!
# Данный код не имеет проверок запрашиваемых данных
# что может стать причиной взлома!
# Обязательно проверяйте все данные
# поступающие от клиента
// Номер запришиваемой страницы
$page = $_GET['page'];
// Количество запрашиваемых записей
$limit = $_GET['rows'];
// Номер элемента массива по которому
// следует производить сортировку
// Проще говоря поле, по которому
// следует производить сортировку
$sidx = $_GET['sidx'];
// Направление сортировки
$sord = $_GET['sord'];
// Если не указано поле сортировки,
// то производить сортировку по первому полю
if(!$sidx) $sidx =1;
// Выполним запрос, который
// вернет суммарное кол-во записей в таблице
$result = mysql_query("SELECT COUNT(*) AS count FROM cities");
$row = mysql_fetch_array($result,MYSQL_ASSOC);
// Теперь эта переменная хранит кол-во записей в таблице
$count = $row['count'];
// Рассчитаем сколько всего страниц займут данные в БД
if( $count > 0 && $limit > 0) {
$total_pages = ceil($count/$limit);
} else {
$total_pages = 0;
}
// Если по каким-то причинам клиент запросил
if ($page > $total_pages) $page=$total_pages;
// Рассчитываем стартовое значение для LIMIT запроса
$start = $limit*$page - $limit;
// Зашита от отрицательного значения
if($start < 0) $start = 0;
// Запрос выборки данных
$query = "SELECT id, country_code, region_code, city, latitude,
longitude, nbip FROM cities
ORDER BY ".$sidx." ".$sord." LIMIT ".$start.", ".$limit;
$result = mysql_query($query);
// Начало xml разметки
$s = "<?xml version='1.0' encoding='utf-8'?>";
$s .= "<rows>";
$s .= "<page>".$page."</page>";
$s .= "<total>".$total_pages."</total>";
$s .= "<records>".$count."</records>";
// Строки данных для таблицы
// Не забудьте обернуть
//текстовые данные в <![CDATA[]]>
while($row = mysql_fetch_assoc($result)) {
$s .= "<row id='". $row[id]."'>";
$s .= "<cell><![CDATA[". $row[country_code]."]]></cell>";
$s .= "<cell>". $row[region_code]."</cell>";
$s .= "<cell><![CDATA[". $row[city]."]]></cell>";
$s .= "<cell>". $row[latitude]."</cell>";
$s .= "<cell>". $row[longitude]."</cell>";
$s .= "<cell>". $row[nbip]."</cell>";
$s .= "</row>";
}
$s .= "</rows>";
// Перед выводом не забывайте выставить header
// с типом контента и кодировкой
header("Content-type: text/xml;charset=utf-8");
echo $s;
?>
5) Инициализация плагина
Последний этап подготовительных работ. Здесь мы должны инициализировать плагин JqGrid. Делается это вызовом метода jqGrid(), который в качестве параметра, принимает объект со свойствами таблицы.
Теперь давайте посмотрим на примере разметки, приведенной выше.
<!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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Осваиваем jqGrid с Linkexchanger</title>
<link rel="stylesheet" type="text/css" media="screen" href="css/flick/jquery-ui-1.7.2.custom.css" />
<link rel="stylesheet" type="text/css" media="screen" href="css/ui.jqgrid.css" mce_href="css/ui.jqgrid.css" />
<style>html, body {
margin: 0;
padding: 0;
font-size: 80%;
}
</style>
<script type="text/javascript" src="js/jquery-1.4.min.js"></script>
<script type="text/javascript" src="js/i18n/grid.locale-ru.js"></script>
<script type="text/javascript" src="js/jquery.jqgrid.min.js"></script>
<script type="text/javascript">
$(function(){
$('#le_table').jqGrid({
url:'p1e1.php',
datatype: 'xml',
mtype: 'GET',
colNames:['Код страны','Код региона', 'Город','Долгота','Широта','nbip'],
colModel :[
{name:'country_code', index:'country_code', width:80},
{name:'region_code', index:'region_code', width:80},
{name:'city', index:'city', width:90},
{name:'latitude', index:'latitude', width:60},
{name:'longitude', index:'longitude', width:60},
{name:'nbip', index:'nbip', width:30}],
pager: $('#le_tablePager'),
rowNum:10,
rowList:[10,20,30,100],
sortname: 'city',
sortorder: 'asc'
});
});
</script>
</head>
<body>
<table id="le_table></table>
<div id="le_tablePager"></div>
</body>
</html>
Cейчас можно взглянуть результаты наших трудов. Вот ссылка на просмотр ДЕМО1 и на архив с ДЕМО1 (тот же архив на зеркале)
III. Разбор параметров
Остался последний пункт сегодняшней статьи в котором я дам пояснения по каждому из используемых в данном примере свойств плагина.
Говоря о параметрах (options) следует сказать, что это лишь крохотная их часть. Эти параметры обеспечивают только базовую функциональность таблице. Множество других параметров мы с вами рассмотрим в последующих статьях, а пока поэкспериментируйте с теми что использованы в этом примере.
IV. Содержание следующей статьи
Выводы
В данной статье мы познакомились с плагином jqGrid, запустили его в базовой функциональности и создали полигон для будущих примеров.
В ходе работы мы поняли принцип работы плагина. Фактически сам плагин это интерфейс пользователя, который отправляет AJAX запросы серверу и получает от него ответ. Таблица отправляет все необходимые параметры, для выборки данных на стороне сервера, в виде GET запроса, а сервер возвращает в виде набора строк в XML-разметке.
Пожалуйста оставляйте только конструктивные комментария и пожелания, а все вопросы задавайте на форуме!
Отзывов (23) на «jqGrid Часть I: Знакомство»
Смысл в этой штуке будет только если будет инлайн-редактирование
Не стоит спешить с выводами, я ведь не рассказал еще и 10% того, что умеет это плагин. Будет редактирование однозначно, но где-то в 3-4 части
Частенько захожу в твой блог, очень полезный, но есть один вопрос: почему ты до сих пор не прикрутиш какой нибудь скрипт для нормального отображения исходных текстов?
Я, например, юзаю вот этот: SyntaxHighlighter.
А вообще, спасибо за инфу. Я как то уже разбирался с этим плагином, хотел в админку встроить, только пока отложил, возникли другие задачи
После сортировки по городам, в поле города умирает кодировка.
А какая кодировка у твоего сайта? У меня такая проблема была из-за того, что плагин написан в кодировке UTF-8, а сайт был на Windows-1251.
поддерживаю R@Me0, действительно прикрутите цветовое оформление исходников, будет очень хорошо. Хороший блог спасибо, также хотелось узнать у вас по поводу вашей книги, купил я книгу jQuery Подробное руководство по продвинутому Javascript, в принципе библия, хотелось бы узнать, ваша книга сможет как-то дополнить её? видел ещё одну книгу по jquery нашу.
Про подсветку кода – давайте считать, что «сапожник – без сапог»
ну, не попадаются нормальные плагины для WP…
Про книгу – правильно сделали, что «jQuery Подробное руководство по продвинутому Javascript» купили (там есть некоторые неточности перевода, но это не главное) – книга очень хороша! Насчет дополнить? Не знаю… Моя построена по такому принципу – практически каждый метод и вспомогательная функция jQuery показана на конкретном примере, который помогает понять суть. Это в первой части. Вторая часть – Плагины и UI посвящена конкретным плагинам (как официальному UI, так и плагинам сторонних разработчиков) и там подробно разбираются все их настройки, приводятся примеры использования (на диске). Можно считать это дополнением упомянутой книги? Пожалуй можно.
Да, и про эту статью – см. автора статьи – это первая статья, которая написана в моем блоге, но не мной.
Про подсветку кода – давайте считать, что “сапожник – без сапог” ну, не попадаются нормальные плагины для WP…
Не соглашусь. Тот плагин, что я упоминал (SyntaxHighlighter) хорошо работал на движке Блоггера. Я перенес свой блог на WP, там он тоже работает без проблем. Можешь Посмотреть в моем блоге. (на цвет не смотри. там 3 стандартных на выбор есть, я просто не поменял еще для нового диза).
По поводу книги “jQuery Подробное руководство по продвинутому Javascript”, полностью согласен. Она мне очень помогла, в свое время. Да и сейчас я частенько в нее заглядываю, т.к. в голове все удержать пока не получается.
Господа с кодировкогй все в порядке, точнее в порядке у плагина, то что вы видите это проблемы с кодировкой в дампе БД. Я ее скачал в сети и выдернул только первые 10тыс записей. Для того, чтобы без проблем можно было импортировать копи/пастом в phpMyAdmin, а не производить импорт 20Мб дампа через консоль.
>посоветовал цикл видео уроков Евгений Попова
Это уж чересчур.
>Это уж чересчур.
Отчего же? Я даже отвечу на этот вопрос … потому что НИКТО повторюсь НИКТО из «маститых» программистов ни сделал ни единого видео-урока для людей которые только что услышали слово jQuery и при этом не знают за что же схватится в начале пути изучения.
to mihdan – вы можете говорить так, после того как сделаете доступнее и подробнее чем Попов.
> для людей которые только что услышали слово jQuery и при этом не знают за что же схватится в начале пути изучения.
Так может, таким людям вообще не стоит начинать программировать? Если у человека есть необходимые мозги, он разберется сам. Если нет — не стоит и начинать. Цель настоящего обучения — научить человека учиться самому. Искать информацию, пробовать. Если он этого не умеет — ему не поможет никакой мега-разжеванный, доступный видеоурок ( бред вообще, неужели народ читать уже разучился? )
>НИКТО из “маститых” программистов ни сделал ни единого видео-урока для людей которые только что услышали слово jQuery<
Gennady а правда почему бы и нет… jQuery набирает популярность, а рынок пока не занят…
e1f, уважайте труд чужих людей. Если вы так категоричны, запишите сами видео-урок и покажите всем, как по вашему надо.
Не можете?
Ну так и не стоит в чём то упрекать людей, которые это СМОГЛИ.
Regent, бесполезный, более того, вредный труд нельзя уважать.
e1f, не вам решать, бесполезный труд или нет. Если существует хотя бы один благодарный человек – труд полезный.
А вы продолжайте дальше не уважать.
а вот и продолжение от меня подоспело
http://mabp.kiev.ua/2010/01/31/jqgrid-plugin/
Расписали неплохо, я сам, если честно, мало что ещё в этом понимаю, но хочу научиться… Но думаю мне будет легче когда будут перед глазами все части, я конечно и так очень вам признателен, что рассказали очень полезную информацию, но всё таки хочу спросить когда ожидать следущие части?
2 часть уже в процессе, много времени уходит на подготовку и проверку демо-примеров. Дай бог мне здоровья … вторую часть опубликую к выходным
будет очень хорошо, хотя и у самого если честно то времени очень мало, но стараюсь всё равно следить за вашим блогом
Дорогие читатели, в связи с работами по обновлению блога публикация статьи «jqGrid II» как впрочем и работы других авторов, временно приостановлены. В ближайшее время мы постараемся решить все технические вопросы и продолжим трудиться над новыми материалами.
пол года рассматривал этот плагин jqGrid, уже хотел его применить в своём проекте, как тут же обнаружил некоторые не достоинства, к примеру таблица не может растягиваться, хотя есть костыли, но это не спасает. Нельзя эту таблицу поместить к примеру в ячейку всё что идёт после ней пропадает подней, тоесть сбоку напротив таблици ничего нельзя поместить, а я хотел чтобы сама таблица была в левой части а другая инфа с правой, сделать этого не удалось. Последняя версия полностью привязана к UI чего я не люблю, эти громадные классы css, js хотя можно выбрать отделить нужное, но всё равно получается не удобно. Да и таблицу сильно не изменишь под себя.
Вообщем моё мнение слишком громадная таблица получается. Для себя я выбрал по проще
http://yii.cubedwater.com/user/list
Обсуждение можно продолжить на форуме jQuery.