Feature #5013
closedЭкспорт документов в шаблон отчета
0%
Description
В шаблоне отчета очень сложно (а может и невозможно) получить DOM модель документов средствами freemarker. Предлагаю добавить передачу документов в шаблон через "параметры шаблона".
Патч прилагается.
Files
Updated by Denis Kildishev over 10 years ago
- Status changed from New to Resolved
- % Done changed from 0 to 100
Applied in changeset r3608.
Updated by Denis Kildishev over 10 years ago
- Status changed from Resolved to New
- % Done changed from 100 to 0
Спасибо за идею, нам это тоже потребовалось для новых видов отчетов!
Мы реализовали немного по другому, т.к. в проектах может быть много документов и не во всех отчетах требуется доступ к DOM, то мы решили предоставлять доступ к DOM конкретного документа по запросу, а не строить его заранее для всех.
Для получения DOM документа из шаблона отчета можно использовать вызов для объекта класса Location метода getDocumentNodeModel() или воспользоваться методом utils.getDocumentNodeModel(qid), где qid это путь к документу, который можно получить нажатием правой кнопки на документе и выбором пункта меню Copy Full Name.
Оба метода возвращают объект класса freemarker.ext.dom.NodeModel, как и было реализовано в предложенном патче.
С уважением, Денис Кильдишев
Updated by Denis Kildishev over 10 years ago
- Status changed from New to Resolved
Updated by Denis Filatov over 10 years ago
Этот способ далеко не самый эффективный.
Например в простейшем цикле я вынужден кэшировать DOM в шаблоне чтоб избежать ее множественного создания
<#local doms = {}/> <#list req.getLocations() as loc> <#local doc = loc.getDocument()/> <#if doc?has_content> <#local qid = doc.getQualifiedId()/> <#if (doms[qid])?has_content> <#local dom = doms[qid]/> <#else> <#local dom = utils.getDocumentNodeModel(qid) /> <#if dom?has_content> <#local doms = doms + {qid : dom } /> </#if> </#if>
Надо либо кэщировать DOM в utils, либо возвращать по запросу DOM сразу для всех документов.
Updated by Denis Kildishev over 10 years ago
Спасибо за предложенный варинат. Хочется уточнить, что кроме доступа через utils можно использовать метод для Location("getDocumentNodeModel()"). Кэш был реализован для объектов класса Document. При этом, при получении дерева как через utils, так и при помощи метода в Location будет возвращаться один и тот же экземпляр дерева. Актуальность кэша гарантируется особенностями механизма генерации отчетов.
Updated by Alexey Khoroshilov about 10 years ago
- Status changed from Resolved to Closed