Пример плагина отчета
Ниже приводится пример плагина отчета с графиком, таблицей и формой выбора данных. В отличие от примера, приведенного в конце статьи Описание отчетов, где данные для отчета генерировались самой панелью по запросу в элементе <query>
, здесь мы будем передавать данные из кода обработчика плагина.
XML-описание плагина
Создадим файл /usr/local/mgr5/etc/xml/ispmgr_mod_report_example.xml
со следующим содержимым:
<?xml version="1.0" encoding="UTF-8"?>
<mgrdata>
<mainmenu level="admin+">
<modernmenu>
<node name="my_group" icon="m-plugin">
<node name="report.example" icon="m-plugin"/>
</node>
</modernmenu>
</mainmenu>
<handler name="report_example.sh" type="xml">
<func name="report.example" />
</handler>
<lang name="ru">
<messages name="desktop">
<msg name="modernmenu_my_group">Плагины</msg>
<msg name="modernmenu_report.example">Пример отчета</msg>
</messages>
</lang>
</mgrdata>
Так добавляется новый раздел панели Плагины — Пример отчета, который указывает на функцию report.example
и регистрирует обработчик report_example.sh
для этой функции.
Обработчик плагина
Создадим файл обработчика /usr/local/mgr5/addon/report_example.sh
и дадим ему права 750 (пользователь и группа root). Содержимое файла:
#!/bin/bash
# смотрим на значение, пришедшее из формы от <select name="period" /> и если там была
# выбрана опция "Предыдущий месяц", записываем в переменную reportdata один набор строк,
# в остальных случаях (в т.ч. по умолчанию до выбора в форме) - другой
period=$PARAM_period
if [[ "$period" == "previousmonth" ]]
then
read -r -d '' reportdata <<-EOM
<elem><value1>7.0</value1><value2>13.0</value2><date>2024-10-29</date></elem>
<elem><value1>10.0</value1><value2>26.0</value2><date>2024-10-30</date></elem>
<elem><value1>12.0</value1><value2>11.0</value2><date>2024-10-31</date></elem>
EOM
else
read -r -d '' reportdata <<-EOM
<elem><value1>10.0</value1><value2>24.0</value2><date>2024-11-01</date></elem>
<elem><value1>12.0</value1><value2>18.0</value2><date>2024-11-02</date></elem>
<elem><value1>8.0</value1><value2>20.0</value2><date>2024-11-03</date></elem>
EOM
fi
# выводим XML для страницы, в который вставляем полученный выше набор строк
cat << EOM
<?xml version="1.0" encoding="UTF-8"?>
<doc lang="ru" func="report.example">
<metadata type="report">
<!-- метаданные формы для выбора периода вверху отчета -->
<form>
<field name="period">
<select name="period" />
</field>
<buttons>
<button type="ok" action="report.example" name="ok"/>
</buttons>
</form>
<!-- Заголовок страницы -->
<text name="title" />
<!-- описание отчета: одна таблица с тремя столбцами и один график по этой таблице -->
<band name="values" psort="date">
<col name="date" type="data" sort="alpha" />
<col name="value1" type="data" sort="digit" />
<col name="value2" type="data" sort="digit" />
<diagram name="values" label="date" type="line" >
<line data="value1" />
<line data="value2" />
</diagram>
</band>
</metadata>
<!-- данные отчета, сюда вставляем сформированный выше набор строк <elem> -->
<reportdata>
<values>
${reportdata}
</values>
</reportdata>
<!-- Сообщения локализации -->
<messages>
<msg name="title">Пример отчета</msg>
<msg name="values">Серия значений</msg>
<msg name="value1">Параметр 1</msg>
<msg name="value2">Параметр 2</msg>
<msg name="date">Дата</msg>
<msg name="period">Период</msg>
<msg name="msg_ok">Показать отчет</msg>
<msg name="msg_hidedata">Скрыть данные</msg>
<msg name="msg_nodata">Нет данных</msg>
<msg name="msg_showdata">Показать данные</msg>
</messages>
<!-- значения для селекта выбора периода -->
<slist name="period">
<val msg="yes" key="currentmonth">Текущий месяц</val>
<val msg="yes" key="previousmonth">Предыдущий месяц</val>
</slist>
<!-- значение выбранного периода для отображения в селекте после отправки данных формы -->
<period>${period}</period>
</doc>
EOM
Теперь, чтобы ispmanager применил добавленное XML-описание плагина, нужно выполнить в командной строке сервера команду:
pkill core
Результат
Перезагрузив страницу в браузере, в панели должна появится новая группа Плагины в разделе Все разделы (в самом конце списка), а в ней пункт Пример отчета, при клике по которому откроется страница отчета:

Подробности
В созданном файле /usr/local/mgr5/addon/report_example.sh
добавлены комментарии, объясняющие, как работает код. Дополнительно отметим:
- Приведен код для простого отчета с одной таблицей и графиком по данным из нее. Ispmanager позволяет формировать более сложные отчеты с дочерними таблицами и графиками, см. пример передачи данных для таких отчетов в статье Описание отчетов.
- Передача и получение данных формы с параметрами отчета происходит так же, как продемонстрировано в статье Пример использования значений формы. Для создания форм вверху отчетов доступны те же возможности, что в обычных формах.