2009-04-15 36 views
9

Estoy queriendo saber si hay alguna manera de tener varias filas de pie de página en ah: dataTable (o t: datatable) Quiero hacer algo como esto (que no compila)Varias filas de pie de página en una tabla de datos JSF

<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> 

con el resultado de algo como esto

<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> 

Alguna idea mejor manera de lograr esto? Gracias.

EDIT: Sería genial si pudiera evitar ((que se almacenan en un facet map) Facetas deben tener nombres únicos.) Utilizando un procesador de control personalizado/encargo

Respuesta

5

La solución Terminé usando era un renderizador personalizado asociado con t: tabla de datos (la extensión tomahawk para tabla de datos)

public class HtmlMultiHeadTableRenderer extends HtmlTableRenderer 

solo tuviera para anular un método

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

con en la que Busqué facetas con nombres header, header2, header3 ... headerN (dejo de buscar tan pronto como falta) y lo mismo con el pie de página.Esto ha permitido que lo hago código como

<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> 

Esto tomó cerca de un día (con algunas otras extensiones como la de permitir colspans basados ​​en grupos) a código y documento,

+0

David me puede ayudar para esto http://stackoverflow.com/questions/12104906/should-i-use-datatable-or-panelgrid-jsf/12105069#comment16179940_12105069 – khan

1

dos formas de hacerlo esta primavera a la mente:

  1. Sólo hay que poner un panelGrid en el pie de página y el uso de hojas de estilo para conseguir el aspecto deseado.
  2. Crea un custom component que renders el marcado que deseas.
+0

Tenía la esperanza de evitar el uso de un componente personalizado, ya que datatable se acerca mucho a lo que necesito. Ya he avanzado y uso CSS para dar estilo a algo similar, pero es muy hacky. Esperaba que alguien pudiera señalar algo que me estaba perdiendo. Maldito. –

3

Como dijo McDowell, panelGrid hará lo que está pidiendo sin controles personalizados, a menos que me falta algo.

<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> 

Esto hace de la siguiente manera

<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> 

Puede utilizar etiquetas que no sean outputText en el panelGrid también para conseguir lo que sea efecto que está buscando (sólo asegúrese de que usted les envuelve en una panelGroup o algo similar).

+0

gracias por la respuesta. Quiero que el pie de página use la misma tabla que el cuerpo principal. Actualmente estoy trabajando en un procesador personalizado para hacer esto. Publicaré los detalles una vez que haya completado. –

1

columna La RichFaces tiene el atributo breakBefore que permitirá hacer algo como esto:

<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> 

¿Qué es lo que está buscando, pero por desgracia no usar la biblioteca que usted ha indicado.

Si está utilizando Facelets, siempre puede crear una tabla normal con ui: repetir.

+0

Gracias por la respuesta, desafortunadamente no estamos usando esa biblioteca. –

0

que no podía usar un intérprete personalizado, así que lo hice con hTML plano dentro de la 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> 

la faceta encabezado abre un <tr><th> cual clode de inmediato con el texto outpuut y abrir de nuevo al final para obtener hTML válido. Obtendrá un <tr><th></th></tr> vacío antes y después de su encabezado personalizado de esa manera, pero eso fue aceptable en mi caso.

Cuestiones relacionadas