Генератор отчетов, а также вьювер и дизайнер отчетов, умеют вызывать события на стороне клиента, передавать их на сторону PHP сервера для последующей обработки, и принимать подготовленный ответ. Все действия реализованы в обработчике событий, нет необходимости в использовании каких-либо дополнительных функций для связи клиента с сервером и передачи данных. Для работы с выбранным событием, достаточно добавить имя функции к обработчику, и указанная функция будет автоматически вызвана при возникновении выбранного события. Предусмотрен вызов событий как на стороне JavaScript клиента, так и на стороне PHP сервера. При необходимости, можно добавлять несколько функций любого типа к одному и тому же событию.

 

 

Вызов JavaScript события на стороне клиента

Для вызова JavaScript события, необходимо добавить к обработчику имя функции в виде строки. В аргументах события будут переданы все необходимые данные. Список доступных свойств, передаваемых в аргументах для всех событий, можно посмотреть в разделе События генератора отчетов. Пример вывода сообщения с количеством страниц полученного документа после построения отчета:

 

index.php

 

<?php

use Stimulsoft\Report\StiReport;

 

$report = new StiReport();

$report->onAfterRender = 'afterRender';

$report->loadFile('reports/SimpleList.mrt');

$report->render();

?>

 

...

 

<script>

function afterRender(args) {

let pagesCount = args.report.renderedPages.count;

alert("The report is rendered, pages: " + pagesCount);

}

</script>

 

 

 

Полный код примера доступен на GitHub.

 

В данном примере, из аргументов события можно получить JavaScript объект отчета, и прочитать количество построенных страниц документа.

 

Информация

 

Более подробно про доступные функции и параметры JavaScript генератора отчетов можно прочитать в документации Stimulsoft Reports.JS и Stimulsoft Dashboards.JS продуктов.

 

 

 

Вызов JavaScript события на стороне Node.js сервера

При использовании Node.js платформы для работы с отчетами нет возможности вызвать JavaScript функцию по имени, т.к. HTML шаблон не используется. В таком случае, для вызова JavaScript события необходимо добавить к обработчику саму функцию в виде строки или строк кода. Аргументы события будут находиться в предварительно заданной переменной args, которую можно использовать в коде события. Пример очистки словаря данных в шаблоне перед построением отчета:

 

index.php

 

<?php

use Stimulsoft\Report\Enums\StiEngineType;

use Stimulsoft\Report\StiReport;

 

$report = new StiReport();

$report->engine = StiEngineType::ServerNodeJS;

$report->onBeforeRender = 'args.report.dictionary.clear();';

$report->loadFile('reports/SimpleList.mrt', true);

$report->render();

?>

 

 

Информация

 

Точно такой же способ для JavaScript событий можно использовать при отображении вьювера либо дизайнера без HTML шаблона, когда нет возможности заранее определить необходимую JavaScript функцию.

 

 

 

Вызов PHP события на стороне сервера

Для вызова PHP события, необходимо добавить к обработчику имя функции в виде переменной либо саму функцию. В аргументах события будут переданы все необходимые данные. Список доступных свойств, передаваемых в аргументах события, можно посмотреть в разделе События генератора отчетов. Пример корректировки пароля в строке подключения перед запросом данных:

 

index.php

 

<?php

use Stimulsoft\Events\StiDataEventArgs;

use Stimulsoft\Report\StiReport;

 

$report = new StiReport();

$report->onBeginProcessData = function (StiDataEventArgs $args) {

args->connectionString = str_replace('Pwd=;', 'Pwd=******;', args->connectionString);

};

 

$report->loadFile('reports/SimpleList.mrt', true);

$report->render();

?>

 

 

 

Полный код примера доступен на GitHub.

 

В данном примере, из аргументов события можно получить и изменить все параметры подключения к базе данных.

 

В событии на стороне PHP сервера предусмотрена возможность вернуть текстовое сообщение об успешном выполнении либо возникшей ошибке обработки события, это сообщение отобразится во вьювере или дизайнере после завершения события. Для отображения окна с ошибкой необходимо вернуть результат функции StiResult::getError('Error message'). Для отображения окна с информационным сообщением достаточно вернуть результат функции StiResult::getSuccess('Info message') либо просто строку 'Info message'.

 

index.php

 

<?php

$report->onBeginProcessData = function (StiDataEventArgs $args) {

...

return StiResult::getError('Error message');

// return StiResult::getSuccess('Info message');

// return 'Info message';

};

?>

 

 

Информация

 

При возникновении ошибки в самом обработчике событий, например ошибка при подключении к базе данных, ошибка обработки файла и т.п. - будет выведено внутреннее сообщение в любом случае, даже если определено сообщение в самом событии компонента.

 

 

Информация

 

Диалоговое окно с сообщением будет показано только при использовании компонентов StiViewer либо StiDesigner. Сам генератор отчетов не содержит визуальных форм, поэтому сообщение обработки события будет выведено в консоли браузера.

 

 

 

Вызов нескольких одинаковый событий

Предусмотрена возможность добавления к обработчику событий неограниченного количества функций, они все будут сгруппированы по типу события, и вызваны последовательно в порядке добавления. Для этого вместо присваивания имени функции необходимо использовать специальный метод события append(), в качестве параметра передать имя функции либо саму функцию.

 

Пример изменения SQL запроса на стороне JavaScript клиента, и строки подключения на стороне PHP сервера:

 

index.php

 

<?php

use Stimulsoft\Events\StiDataEventArgs;

use Stimulsoft\Report\StiReport;

 

function beginProcessData(StiDataEventArgs $args) {

$args->connectionString = str_replace('Pwd=;', 'Pwd=******;', $args->connectionString);

};

 

$report = new StiReport();

$report->onBeginProcessData->append('beginProcessData');

$report->onBeginProcessData->append(beginProcessData);

$report->loadFile('reports/SimpleList.mrt');

$report->render();

?>

 

...

 

<script>

function beginProcessData(args) {

args.queryString = args.queryString.replace("TableName", "Products");

}

</script>

 

 

 

Информация

 

Некоторые события могут быть вызваны только на стороне JavaScript клиента и не имеют возможности вызова события на стороне PHP сервера, либо наоборот, могут быть вызваны только на стороне PHP сервера. При добавлении функции неподдерживаемого типа к такому событию не будет ошибки, просто добавленная функция не будет вызвана. Все поддерживаемые варианты указаны в разделе События генератора отчетов.

 

 

 

Шифрование данных, передаваемых на сторону PHP сервера

Для исключения кражи передаваемых данных злоумышленниками, мы рекомендуем использовать HTTPS протокол, в большинстве случаев этого достаточно. В дополнении к этому, по умолчанию все передаваемые данные проходят через специальный алгоритм кодирования, и передаются на сервер в зашифрованном виде. Это позволяет скрыть конфиденциальные данные, например логин и пароль в строке подключения, от любопытных пользователей, работающих с вашим приложением.

 

Однако, если этого не требуется, либо если нужно отобразить исходные данные запроса для отладки приложения, предусмотрена возможность отключения шифрования. Для этого достаточно установить свойство $encryptData в значение false у обработчика событий, после этого все данные будут передаваться в JSON формате.

 

index.php

 

<?php

use Stimulsoft\Report\StiReport;

 

$report = new StiReport();

$report->handler->encryptData = false;

$report->process();

?>

 

 

 

Передача значений GET параметров в PHP обработчик событий

Предусмотрена возможность автоматической передачи всех значений параметров GET запроса в обработчик событий, во всех событиях которого можно будет получить их значения. Для включения этой возможности, достаточно установить свойство passQueryParameters в значение true, после этого все параметры GET запроса будут переданы при каждом запросе к обработчику событий.

 

index.php

 

<?php

use Stimulsoft\Report\StiReport;

 

$report = new StiReport();

$report->handler->passQueryParameters = true;

$report->process();

?>