2015-03-03 2 views
0

им с помощью:Повторное использование компонентов JSF2.1 с Facelets

  • JSF 2.1
  • RichFaces 4.5.2.Final
  • Omnifaces 2,0

У меня есть таблица, что я хочу, чтобы повторно использовать как подданные или подтаблицы зависит от страницы, на которой я использую компонент, я хочу поставить, и если он не работает, вот мой код:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:a4j="http://richfaces.org/a4j" 
     xmlns:rich="http://richfaces.org/rich" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:o="http://omnifaces.org/ui" 
     xmlns:c="http://java.sun.com/jsp/jstl/core" 
     xmlns:composite="http://java.sun.com/jsf/composite" 
     xmlns:tablas="http://java.sun.com/jsf/composite/tablas" 
     > 

    <!-- INTERFACE --> 
    <composite:interface> 
     <composite:attribute name="listaPaqueteItems" required="true" /> 
     <composite:attribute name="subtable" required="false" default="false" /> 
    </composite:interface> 

    <!-- IMPLEMENTATION --> 
    <composite:implementation> 


     <c:if test="#{!cc.attrs.subtable}"> 
      <rich:dataTable id="tabla_items_del_paquete" 
       value="#{cc.attrs.listaPaqueteItems}" 
       var="p" 
       rowKeyVar="row_tabla_items_del_paquete" 
       rows="10" 
       rowClasses="odd-row, even-row" 
       styleClass="stable"> 
     </c:if> 
     <c:if test="#{cc.attrs.subtable}"> 
      <rich:collapsibleSubTable id="subtable"> 
     </c:if> 
       <rich:column> 
        <f:facet name="header"> 
         <h:outputText value="#" /> 
        </f:facet> 
        <h:outputText value="#{row_tabla_items_del_paquete + 1}" /> 
       </rich:column> 
       <rich:column> 
        <f:facet name="header"> 
         <h:outputText value="#{msgs['abm.paquete.item.tabla.codigo']}" /> 
        </f:facet> 
        <h:outputText value="#{p.producto.codigo}" /> 
       </rich:column>     
       <rich:column colspan="2"> 
        <f:facet name="header"> 
         <h:outputText value="#{msgs['abm.paquete.item.tabla.nombre']}" /> 
        </f:facet> 
        <b> 
         <h:outputText value="#{p.producto.nombre}" /> 
        </b> 
       </rich:column> 
       <rich:column> 
        <f:facet name="header"> 
         <h:outputText value="#{msgs['abm.paquete.item.tabla.descuento.final']}" /> 
        </f:facet> 
        <h:outputText value="#{p.descuentoFinal}" /> 
       </rich:column>     

     <c:if test="#{!cc.attrs.subtable}"> 
      </rich:dataTable> 
     </c:if> 
     <c:if test="#{cc.attrs.subtable}"> 
      </rich:collapsibleSubTable> 
     </c:if> 
    </composite:implementation>  

</html> 

В основном проблема заключается в том, что isnt valid XHTML, любая идея для выполнения этого сценария и попытка повторного использования этого кода в виде таблицы или подтаблицы, одна возможная идея - это внешние теги <rich:colum> в другом шаблоне и оболочке, которые в datable или subtable что-то вроде этого :

  <rich:collapsibleSubTable 
      expanded="#{false}" 
      id="tabla_periodos" 
      rowKeyVar="row_subtable" 
      expandMode="client" 
      value="#{p.periodoDescuentos}" 
      var="per" 
      rendered="#{not empty p.periodoDescuentos}" 
      > 
<!-- Include Columns--> 
       </rich:collapsibleSubTable> 

Я думаю, что это сработает, но, возможно, это другой способ сделать то же самое лучше.

ответ

2

Вы можете создать facelet тег следующим кодом:

TAG (myTable.xhtml):

 <c:if test="#{!subtable}"> 
     <rich:dataTable id="tabla_items_del_paquete" 
      value="#{listaPaqueteItems}" 
      var="p" 
      rowKeyVar="row_tabla_items_del_paquete" 
      rows="10" 
      rowClasses="odd-row, even-row" 
      styleClass="stable"> 
      <ui:insert> 
     </rich:dataTable> 
    </c:if> 
    <c:if test="#{subtable}"> 
     <rich:collapsibleSubTable id="subtable"> 
      <ui:insert> 
     </rich:collapsibleSubTable> 
    </c:if> 

ПРИМЕНЕНИЕ:

<my:mytable> 
     ... your dataTable content 
    </my:mytable>