Не визуализированный p: dataTable заканчивается в pe: exporter PDF - PullRequest
3 голосов
/ 05 февраля 2020

У меня есть 2 dataTables:

<p:dataTable id="tbl1" var="prop1" value="#{bean.prop1}" rendered="#{bean.listP1.size() != 0}">
// ...
</p:dataTable>

и

<p:dataTable id="tbl2" var="prop2" value="#{bean.prop2}" rendered="#{bean.listP2.size() != 0}">
// ...
</p:dataTable>

На странице X HTML после некоторого действия я получил правильный результат в зависимости от размера обоих listP1 и listP2.

Моя проблема после нажатия на кнопку экспорта

<h:commandLink>
    <p:graphicImage value="/resources/icons/download.png" style="width : 35px; height:35px"/>
    <pe:exporter type="pdf" target="tbl1, tbl2" fileName="SurveyResults"/>
</h:commandLink>

Я получил неправильный результат: я получил две таблицы вместо одной, потому что один из них с size = 0

Есть ли у вас какие-либо идеи по поводу этого решения?

1 Ответ

5 голосов
/ 05 февраля 2020

До версии 8 pe:exporter не заботится о том, отображаются ли предоставленные вами таблицы данных или нет, см. https://github.com/primefaces-extensions/primefaces-extensions.github.com/issues/757

Если вы еще не в версии 8 Вы можете использовать EL для создания динамического c значения для атрибута target. Например:

<pe:exporter type="pdf"
             target="#{empty bean.listP1 ? '' : 'tbl1'}#{empty bean.listP1 or empty bean.listP2 ? '' : ','}#{empty bean.listP2 ? '' : 'tbl2'}"
             fileName="SurveyResults"/>

Поскольку эти выражения немного сложны, вы можете захотеть создать метод в вашем bean-компоненте, который создает целевую строку и сделать:

<pe:exporter type="pdf"
             target="#{bean.exporterTargets}"
             fileName="SurveyResults"/>

И в вашем боб например:

public String getExporterTargets() {
   return Stream.of(listP1.isEmpty() ? null : "tbl1",
                    listP2.isEmpty() ? null : "tbl2")
                .filter(Objects::nonNull)
                .collect(Collectors.joining(","));
}
...