4.2.6. Шаблон, определяемый классом

Шаблоны, определяемые классом, используются в тех случаях, когда выбирать данные с помощью SQL, JPQL или Groovy слишком сложно или невозможно. Например, в случаях, когда отчёт представляет собой результат объединения нескольких других отчётов.

Расположите класс, определяющий шаблон, в модуле core и реализуйте интерфейс com.haulmont.yarg.formatters.CustomReport. В классе определите метод createReport(), возвращающий массив байтов и принимающий на вход параметры:

  • report – описатель отчёта типа com.haulmont.yarg.structure.Report.

  • rootBand – данные корневой полосы типа com.haulmont.yarg.structure.BandData.

  • params – мэп внешних параметров отчёта.

Ниже приведен пример шаблона, определяемого классом. Он формирует HTML-документ с названием выбранной в параметре отчёта книги:

package com.sample.library.report;

import com.haulmont.yarg.formatters.CustomReport;
import com.haulmont.yarg.structure.BandData;
import com.haulmont.yarg.structure.Report;
import com.sample.library.entity.Book;
import java.util.Map;

public class BookReport implements CustomReport {
    @Override
    public byte[] createReport(Report report, BandData rootBand, Map<String, Object> params) {
        Book book = (Book) params.get("book");
        String html = "<html><body>";
        html += "<p>Name: " + book.getName() + "</p>";
        html += "</body></html>";
        return html.getBytes();
    }
}

В редакторе шаблона установите флажок Is custom, затем выберите Class в поле Defined by и укажите имя Java-класса с полным именем пакета в поле Custom definition:

class defined template
Рисунок 41. Редактор шаблона, определяемого классом