Project

General

Profile

Actions

Feature #5013

closed

Экспорт документов в шаблон отчета

Added by Denis Filatov almost 10 years ago. Updated over 9 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Category:
-
Target version:
Start date:
06/30/2014
Due date:
% Done:

0%

Estimated time:
Published in build:
0.16.201

Description

В шаблоне отчета очень сложно (а может и невозможно) получить DOM модель документов средствами freemarker. Предлагаю добавить передачу документов в шаблон через "параметры шаблона".
Патч прилагается.


Files

ReportGenerator.patch (1.95 KB) ReportGenerator.patch Denis Filatov, 06/30/2014 12:15 PM
Actions #1

Updated by Denis Kildishev almost 10 years ago

  • Status changed from New to Resolved
  • % Done changed from 0 to 100

Applied in changeset r3608.

Actions #2

Updated by Denis Kildishev almost 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, как и было реализовано в предложенном патче.

С уважением, Денис Кильдишев

Actions #3

Updated by Denis Kildishev almost 10 years ago

  • Status changed from New to Resolved
Actions #4

Updated by Denis Filatov almost 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 сразу для всех документов.

Actions #5

Updated by Denis Kildishev almost 10 years ago

Спасибо за предложенный варинат. Хочется уточнить, что кроме доступа через utils можно использовать метод для Location("getDocumentNodeModel()"). Кэш был реализован для объектов класса Document. При этом, при получении дерева как через utils, так и при помощи метода в Location будет возвращаться один и тот же экземпляр дерева. Актуальность кэша гарантируется особенностями механизма генерации отчетов.

Actions #6

Updated by Denis Kildishev almost 10 years ago

  • Published in build set to 0.16.201
Actions #7

Updated by Alexey Khoroshilov almost 10 years ago

  • Target version set to 0.16
Actions #8

Updated by Alexey Khoroshilov over 9 years ago

  • Status changed from Resolved to Closed
Actions

Also available in: Atom PDF