Несколько строк нижнего колонтитула в таблице данных JSF - PullRequest
9 голосов
/ 15 апреля 2009

Я хочу знать, есть ли какой-нибудь способ иметь несколько строк нижнего колонтитула в h: dataTable (или t: datatable). Я хочу сделать что-то подобное (что не компилируется)

<h:dataTable ... var="row">
  <h:column>
    <f:facet name="header">
     Header
    </f:facet>
    <h:outputText value="#{row.value}"/>
    <f:facet name="footer">
     FirstFooter
    </f:facet>
    <f:facet name="footer">
     Second Footer in a new tr
    </f:facet>
  </h:column>
</h:dataTable>

В результате получается что-то вроде этого

<table border=1 style="border:1px solid">
<thead><tr><th>Header</th></tr></thead>
<tbody><tr><td>Data Value 1</td></tr>
<tr><td>Data Value 2</td></tr>
<tr><td>Data Value ...</td></tr>
<tr><td>Data Value n</td></tr>
</tbody>
<tfoot>
<tr><td>FirstFooter</td></tr>
<tr><td>Second Footer in a new tr</td></tr>
</tfoot>
</table>

Есть идеи, как лучше всего это сделать? Спасибо.

EDIT: Было бы здорово, если бы я мог избежать использования пользовательского элемента управления / пользовательского рендерера

Ответы [ 5 ]

5 голосов
/ 17 апреля 2009

Решением, которое я использовал в итоге, был пользовательский рендер, связанный с t: datatable (расширение tomahawk для datatable)

public class HtmlMultiHeadTableRenderer extends HtmlTableRenderer

Мне нужно было переопределить только один метод

protected void renderFacet(FacesContext facesContext,   
  ResponseWriter writer, UIComponent component, boolean header)

, в котором я искал фасеты с именами header, header2, header3 ... headerN (я перестаю искать, как только отсутствует один) и то же самое с нижним колонтитулом. Это позволило мне сделать код вроде

<h:dataTable ... var="row">
  <h:column>
    <f:facet name="header">
     Header
    </f:facet>
    <f:facet name="header2">
     A second Tr with th's
    </f:facet>
    <h:outputText value="#{row.value}"/>
    <f:facet name="footer">
     FirstFooter
    </f:facet>
    <f:facet name="footer2">
     Second Footer in a new tr
    </f:facet>
  </h:column>
</h:dataTable>

Это заняло около одного дня (с некоторыми другими расширениями, такими как разрешение colspans на основе групп) для кодирования и документирования,

3 голосов
/ 15 апреля 2009

Как сказал Макдауэлл, panelGrid будет выполнять то, что вы просите, без пользовательских элементов управления, если я что-то не упустил.

<f:facet name="footer">
    <h:panelGrid columns="1"> 
        <h:outputText value="FirstFooter" />
        <h:outputText value="Second Footer in a new tr" />
    </h:panelGrid>
</f:facet>

Это выглядит следующим образом

<tfoot>
    <tr>
        <td colspan="3">
            <table>
                <tbody>
                    <tr>
                        <td>FirstFooter</td>
                    </tr>
                    <tr>
                        <td>Second Footer in a new tr</td>
                    </tr>
                </tbody>
            </table>
        </td>
    </tr>
</tfoot>

Вы также можете использовать другие теги, кроме outputText, в PanelGrid, чтобы получить любой эффект, который вы ищете (просто убедитесь, что вы обернули их в PanelGroup или что-то подобное).

2 голосов
/ 17 апреля 2009

Столбец Richfaces имеет атрибут breakBefore, который позволит вам сделать что-то вроде этого:

<f:facet name="footer">
    <rich:column>
        <h:outputText value="First Footer"/>
    </rich:column>
    <rich:column breakBefore="true">
        <h:outputText value="Second Footer"/>
    </rich:column>
</f:facet>

Что вы ищете, но, к сожалению, не используете указанную вами библиотеку.

Если вы используете Facelets, вы всегда можете просто создать обычную таблицу с ui: repeat .

1 голос
/ 15 апреля 2009

(Фасеты должны иметь уникальные имена (они хранятся в карте фасетов ).)

Два способа сделать это весной на ум:

  1. Просто поместите panelGrid в нижний колонтитул и используйте таблицы стилей, чтобы получить желаемый вид.
  2. Создайте пользовательский компонент , который отображает нужную разметку.
0 голосов
/ 28 мая 2014

Я не мог использовать пользовательский рендерер, поэтому я сделал это с простым HTML внутри JSF:

        <t:dataTable value="#{...}" var="...">

             <f:facet name="header">
                 <h:outputText escape="false" value="&lt;/th&gt;&lt;/tr&gt;"/>
                <tr>
                    <th rowspan="2" class="tableHeaderLightGrey">
                        Zeit
                    </th>

                    <th colspan="#{filterController.trafficClass.size()}" class="tableHeaderLightGrey">
                        Verbrauch
                    </th>
                    <th colspan="#{filterController.trafficClass.size()}" class="tableHeaderLightGrey">
                        Bandbreite
                    </th>
                    <th colspan="#{filterController.trafficClass.size()}" class="tableHeaderLightGrey">
                        Auslastung
                    </th>

                    <th rowspan="2" class="tableHeaderLightGrey">
                        Gesamtauslastung
                    </th>
                </tr>
                <tr>
                   <c:forEach items="#{filterController.trafficClass}" var="trafficClass">
                        <th class="tableHeaderLightGrey">
                            #{trafficClass.name}
                        </th>
                    </c:forEach>

                    <c:forEach items="#{filterController.trafficClass}" var="trafficClass">
                        <th class="tableHeaderLightGrey">
                            #{trafficClass.name}
                        </th>
                    </c:forEach>

                    <c:forEach items="#{filterController.trafficClass}" var="trafficClass">
                        <th class="tableHeaderLightGrey">
                            #{trafficClass.name}
                        </th>
                    </c:forEach>
                </tr>
                 <h:outputText escape="false" value="&lt;tr&gt;&lt;th&gt;"/>

             </f:facet>

            ... columns ...

        </t:dataTable>

Фасет заголовка открывает <tr><th>, который я сразу же закрываю текстом вывода и снова открываю в конце, чтобы получить действительный HTML. Таким образом, вы получите пустой <tr><th></th></tr> до и после своего пользовательского заголовка, но в моем случае это было приемлемо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...