Создание графиков с помощью jQuery и xCharts.
Графики — незаменимый инструмент для представления данных. Библиотека xCharts, которую мы будем использовать, упрощает работу с графиками.
Мы будем использовать эту библиотеку вместе с daterange picker для популярного UI фреймворка Twitter Bootstrap для создания AJAX-графиков, отображающих данные из MySql.
HTML
Html структура страницы довольно простая.
Нам надо только подключить необходимые библиотеки для инициализации графиков.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Pretty Charts with jQuery and AJAX </title>
<link href="assets/css/xcharts.min.css" rel="stylesheet">
<link href="assets/css/style.css" rel="stylesheet">
<!-- Include bootstrap css -->
<link href="assets/css/daterangepicker.css" rel="stylesheet">
<link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.2.2/css/bootstrap.min.css" rel="stylesheet" />
</head>
<body>
<div id="content">
<form>
<fieldset>
<div>
<span><i></i></span>
<input type="text" name="range" id="range" />
</div>
</fieldset>
</form>
<div id="placeholder">
<figure id="chart"></figure>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<!-- xcharts includes -->
<script src="//cdnjs.cloudflare.com/ajax/libs/d3/2.10.0/d3.v2.js"></script>
<script src="assets/js/xcharts.min.js"></script>
<!-- The daterange picker bootstrap plugin -->
<script src="assets/js/sugar.min.js"></script>
<script src="assets/js/daterangepicker.js"></script>
<!-- Our main script file -->
<script src="assets/js/script.js"></script>
</body>
</html>
Мы подключаем много внешних файлов к странице. Внутри тега <head> мы подключаем необходимые для xcharts, datepicker, bootstrap CSS файлы.
Перед закрытием тега <body> происходит подключение jQuery, d3.js (необходим для xcharts), xcharts, библиотеку sugar.js (для date range плагина), date range plugin и наш script.js. Далее мы разберемся в том, как всё это работает вместе.
Таблица MySql
Как уже говорилось выше, скрипт будет брать данные из таблицы в базе данных и отображать их в виде графика. Код для создания таблицы вы найдете в исходниках в файле schema.sql.
В таблице всего три поля. Поле date — уникальное, это означает, что в таблице нет записей с одинаковыми датами. Поле sales_order хранит количество продаж за день. Ваша база может быть совершенно другой, если ваш PHP код будет возвращать корректный JSON, то не будет никаких проблем.
PHP
Задача PHP кода — выбирать данные из базы, которые подходят под выбранный период и возвращать эти данные в виде JSON.
ajax.php:
header('Content-Type: application/json');
// настройки базы для ORM библиотеки
require_once('setup.php');
if (isset($_GET['start']) AND isset($_GET['end'])) {
$start = $_GET['start'];
$end = $_GET['end'];
$data = array();
// Выборка данных
$results = ORM::for_table('chart_sales')
->where_gte('date', $start)
->where_lte('date', $end)
->order_by_desc('date')
->find_array();
// Подготовка для конвертации в JSON
foreach ($results as $key => $value) {
$data[$key]['label'] = $value['date'];
$data[$key]['value'] = $value['sales_order'];
}
echo json_encode($data);
}
Данный код выбирает записи из базы, у которых поле date находится между start и end, которые мы передаем.
JSON результат будет выглядеть примерно так:
[{
"label": "2013-01-07",
"value": "4"
}, {
"label": "2013-01-06",
"value": "65"
}, {
"label": "2013-01-05",
"value": "96"
}]
Поле label содержит значение поля date из MySQL таблицы, а поле value — количество продаж за день. Мы будем использовать этот JSON код для представления в формате понятном плагину xCharts.
JavaScript
Весь JavaScript код находится в файле assets/js/script.js. Код довольно длинный, поэтому мы рассмотрим только некоторые его части.
$(function() {
// Устанавливаем даты, используя методы sugarjs
var startDate = Date.create().addDays(-6), // 6 дней назад
endDate = Date.create(); // сегодня
var range = $('#range');
// Показываем даты в поле ввода
range.val(startDate.format('{MM}/{dd}/{yyyy}') + ' -
' + endDate.format('{MM}/{dd}/{yyyy}'));
// Загрузка графика
ajaxLoadChart(startDate,endDate);
range.daterangepicker({
startDate: startDate,
endDate: endDate,
ranges: {
'Today': ['today', 'today'],
'Yesterday': ['yesterday', 'yesterday'],
'Last 7 Days': [Date.create().addDays(-6), 'today'],
'Last 30 Days': [Date.create().addDays(-29), 'today']
// Можно добавлять разные варианты
}
},function(start, end){
ajaxLoadChart(start, end);
});
Мы используем библиотеку sugar.js для управления датами. По-умолчанию на графике будут отображаться данные за последние 7 дней.
Теперь создадим сам график:
// Подсказки при наведении
var tt = $('<div>').appendTo('body'),
topOffset = -32;
var data = {
"xScale" : "time",
"yScale" : "linear",
"main" : [{
className : ".stats",
"data" : []
}]
};
var opts = {
paddingLeft : 50,
paddingTop : 20,
paddingRight : 10,
axisPaddingLeft : 25,
tickHintX: 9, // количество точек по горизонтали
dataFormatX : function(x) {
// Создание JavaScript объекта из даты, которую вернуд PHP
return Date.create(x);
},
tickFormatX : function(x) {
return x.format('{MM}/{dd}');
},
"mouseover": function (d, i) {
var pos = $(this).offset();
tt.text(d.x.format('{Month} {ord}') + ': ' + d.y).css({
top: topOffset + pos.top,
left: pos.left
}).show();
},
"mouseout": function (x) {
tt.hide();
}
};
// Создаем инстанс xChart и передаем данные для графика, тип и объект с настройками
var chart = new xChart('line-dotted', data, '#chart' , opts);
Прежде всего мы формируем объект, содержащий настройки и колбэки для xCharts. В свойстве dataFormatX из строки вида yyyy-mm-dd формируются JavaScript Date объекты, которые плагин будет корректно отображать и производить с ними необходимые вычисления.
Так же мы обрабатываем события mouseover/mouseout для отображения подсказок.

И наконец, JavaScript функция, которая загружает данные с помощью AJAX:
// Функция для загрузки данных через AJAX и передачи их в график
function ajaxLoadChart(startDate,endDate) {
// Если данные не пришли (очистить график)
if(!startDate || !endDate){
chart.setData({
"xScale" : "time",
"yScale" : "linear",
"main" : [{
className : ".stats",
data : []
}]
});
return;
}
// иначе выполним AJAX запрос
$.getJSON('ajax.php', {
start: startDate.format('{yyyy}-{MM}-{dd}'),
end: endDate.format('{yyyy}-{MM}-{dd}')
}, function(data) {
var set = [];
$.each(data, function() {
set.push({
x : this.label,
y : parseInt(this.value, 10)
});
});
chart.setData({
"xScale" : "time",
"yScale" : "linear",
"main" : [{
className : ".stats",
data : set
}]
});
});
}
});
xCharts содержит метод setData, с помощью которого можно легко обновить отображаемую информацию. Наш график готов!






демо не работает =( проверил и в опере и в хроме
Здравствуйте!
Демо работает, просто отключена рандомная генерация данных. Если выбрать период 01/01/2013 — 02/01/2013 (январь — февраль), то вы увидите график!
Здравствуйте!
Жаль, что нет возможности фильтровать данные. Если бы таблица имела ещё одно поле, например, `name` , неплохо было бы ещё выводить данные для конкретного пользователя — WHERE name=`Sasha`. Или это возможно?
А как можно все это дело установить на Joomla?