Выгрузка данных раздела

Версии: 3.x, 2.x.

В данной статье описана схема, с помощью которой можно формировать простые табличные отчеты.

Например, нам необходимо выгрузить все данные из основной таблицы раздела, разместив в ней для этого дополнительную кнопку. Данные необходимо выгрузить в Excel. Функция выгрузки должна быть доступна только администратору.

Выгрузка данных из IRIS CRM

Выгруженные данные из IRIS CRM в Excel

Скриптами PHP легко формировать HTML файлы отчета. С формированием Excel файлов дело обстоит немного сложнее. Однако есть одна особенность, которую мы и будем использовать. Дело в том, что если HTML файл открыть в Excel’e, то Excel автоматически преобразует теги таким образом, чтобы получалась правильная таблица. Поэтому для формирования Excel файла мы будет формировать файл HTML и выдавать его за файл с расширением *.xls.

Итак, для решения нашей задачи необходимо реализовать следующие действия.

  1. В таблице записей разместить дополнительную кнопку, при нажатии на которую запускается функция g_Auto_GridPrint().
  2. Реализовать в клиентском скрипте функцию g_Auto_GridPrint(), которая открывает новое окно браузера со страницей r_auto.php, которая формирует необходимый отчет.
  3. Реализовать страницу 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, формирующего отчет

Данный скрипт функционирует следующим образом.

  1. Вначале скрипт проверяет, принадлежит ли пользователь к группе «Администратры». Если нет, то пользователю выводится соответствующее сообщение.
  2. Далее скрипт формирует SQL запрос к базе данных.
  3. Потом преобразует результат запроса в HTML таблицу и сохраняет ее в переменной $result. После получения HTML строки отчета скрипт посылает заголовки, которые указывают, что браузеру выдается файл report.xls.
  4. После того, как заголовки отправлены происходит вывод содержимого отчета командой 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;