Версии: 3.x, 2.x.
В данной статье описана схема, с помощью которой можно формировать простые табличные отчеты.
Например, нам необходимо выгрузить все данные из основной таблицы раздела, разместив в ней для этого дополнительную кнопку. Данные необходимо выгрузить в Excel. Функция выгрузки должна быть доступна только администратору.
Скриптами PHP легко формировать HTML файлы отчета. С формированием Excel файлов дело обстоит немного сложнее. Однако есть одна особенность, которую мы и будем использовать. Дело в том, что если HTML файл открыть в Excel’e, то Excel автоматически преобразует теги таким образом, чтобы получалась правильная таблица. Поэтому для формирования Excel файла мы будет формировать файл HTML и выдавать его за файл с расширением *.xls.
Итак, для решения нашей задачи необходимо реализовать следующие действия.
- В таблице записей разместить дополнительную кнопку, при нажатии на которую запускается функция
g_Auto_GridPrint()
. - Реализовать в клиентском скрипте функцию
g_Auto_GridPrint()
, которая открывает новое окно браузера со страницей r_auto.php, которая формирует необходимый отчет. - Реализовать страницу r_auto.php, которая формирует HTML отчета и возвращает его не как простой HTML, а как файл-вложение.
Теперь реализуем данные действия на примере раздела «Автомобили».
1. Добавление дополнительной кнопки в таблицу записей
Для этого необходимо подключить скрипт пользовательской логики g_auto.js к таблице записей раздела в файле structure.xml раздела «Автомобили». Делается это так.
<?xml version="1.0"?>
<MENU_TAB>
<TAB section_type="common" caption="Автомобили" table="iris_auto">
<GRID lines_count="1" js_source_file="g_auto.js" js_function="auto_grid_init">
<COLUMNS>
...................
После того, как таблица отобразилась, будет вызвана функция auto_grid_init()
(она распологается в скрипте g_auto.js).
Данная функция добавит дополнительную кнопку в таблице после кнопок «Добавить», «Изменить» и «Удалить».
function auto_grid_init(p_grid_id) {
// $(p_grid_id) - таблица записей
// $(p_grid_id).parentNode - контейнер, в котором находитсся панель поиска, таблица и панель кнопок
// $(p_grid_id).parentNode.lastChild - панель с кнопками таблицы записей
var elem = $(p_grid_id).parentNode.lastChild;
//Создание кнопки "Выгрузка"
elem.rows[0].cells[0].innerHTML += '<input type="button" class="button" style="margin-left: 10px" value="Выгрузка" onclick="g_Auto_GridPrint();"/>';
elem.rows[0].cells[0].innerHTML = elem.rows[0].cells[0].innerHTML; //Специально для ie
}
2. Функция, которая открывает новое окно браузера с отчетом
Данная функция открывает окно с адресом страницы r_auto.php. Вот ее код.
function g_Auto_GridPrint() {
NewWin = open(g_path+"/config/sections/Auto/r_auto.php", "report_window", "width=800,status=no,toolbar=no,menubar=yes,scrollbars=yes");
}
Таким образом, скрипт клиентской логики g_auto.js выглядит так.
<?php
function auto_grid_init(p_grid_id) {
// $(p_grid_id) - таблица записей
// $(p_grid_id).parentNode - контейнер, в котором находитсся панель поиска, таблица и панель кнопок
// $(p_grid_id).parentNode.lastChild - панель с кнопками таблицы записей
var elem = $(p_grid_id).parentNode.lastChild;
//Создание кнопки "Выгрузка"
elem.rows[0].cells[0].innerHTML += '<input type="button" class="button" style="margin-left: 10px" value="Выгрузка" onclick="g_Auto_GridPrint();"/>';
elem.rows[0].cells[0].innerHTML = elem.rows[0].cells[0].innerHTML; //Специально для ie
}
//Печать отчета
function g_Auto_GridPrint() {
NewWin = open(g_path+"/config/sections/Auto/r_auto.php", "report_window", "width=800,status=no,toolbar=no,menubar=yes,scrollbars=yes");
}
3. Реализация серверного скрипта r_auto.php, формирующего отчет
Данный скрипт функционирует следующим образом.
- Вначале скрипт проверяет, принадлежит ли пользователь к группе «Администратры». Если нет, то пользователю выводится соответствующее сообщение.
- Далее скрипт формирует SQL запрос к базе данных.
- Потом преобразует результат запроса в HTML таблицу и сохраняет ее в переменной $result. После получения HTML строки отчета скрипт посылает заголовки, которые указывают, что браузеру выдается файл report.xls.
- После того, как заголовки отправлены происходит вывод содержимого отчета командой
echo
.
Содержимое скрипта серверной логики g_auto.js.
<?php
// начальные действия
//////////////////////////////////////////////////////
if (!session_id()) {
@session_start();
if (!session_id()) {
echo 'Невозможно создать сессию';
}
}
$path = $_SESSION['INDEX_PATH'];
include $path.'/core/engine/applib.php';
include $path.'/config/common/Lib/lib.php';
if (!isAuthorised()) {
echo '<b>Не авторизован<b><br>';
die;
}
//////////////////////////////////////////////////////
//////////// формирование отчета ////////////
// получение соеденения с БД
$con = GetConnection();
// проверка прав доступа
$r_sql = "select T1.Code from iris_Contact T0 left join iris_AccessRole T1 on T0.AccessRoleID = T1.ID where T0.login='".$_SESSION['auth']['username']."'";
$res = $con->query($r_sql)->fetchAll();
if ($res[0][0] != 'admin') {
echo 'Отчет может формировать только администратор';
return;
}
// запрос на выборку данных для формирования отчета
$sql = "select T0.ID, T0.gosnum, T1.Name, AT.Name, T0.vin ";
$sql .= "from iris_auto T0 ";
$sql .= "left join iris_AutoBrand T1 on T0.AutobrandID = T1.ID ";
$sql .= "left join iris_AutoType AT on T0.AutotypeID = AT.ID ";
$sql .= "order by T0.gosnum";
$query_res = $con->query($sql)->fetchAll();
$result = '<html>';
$result .= '<meta content="text/html; charset=windows-1251" http-equiv="Content-Type"/>';
$result .= '<body><table>';
// заголовок таблицы
$result .= '<tr>';
$result .= '<th style="width: 120px">Гос. номер</th>';
$result .= '<th style="width: 200px">Марка</th>';
$result .= '<th style="width: 120px">Тип</th>';
$result .= '<th style="width: 200px">VIN</th>';
$result .= '</tr>';
$rownum = 0; // номер строки таблицы
// выводим строки отчета
foreach ($query_res as $row) {
// раскраска строк таблицы
if ($rownum++ % 2 == 0)
$rs = 'style="background-color: #d0d0d0"';
else
$rs = "";
$result .= '<tr>';
$result .= '<td '.$rs.'>'.$row[1].'</td>';
$result .= '<td '.$rs.'>'.$row[2].'</td>';
$result .= '<td '.$rs.'>'.$row[3].'</td>';
$result .= '<td '.$rs.'>'.$row[4].'</td>';
$result .= '</tr>';
}
$result .= '</table></body></html>';
// при выводе формируем заголовок. указываем что это файл формата xls
header("Content-Type: application/download");
header("Content-Type: application/xls");
header("content-disposition: attachment; filename=report.xls");
header("Content-Length: ".strlen($result));
// выводим отчет
echo $result;