Facelets com template multi-level

5 respostas
lucasdeoliveira

Olá pessoal!

Estou começando a usar o facelets e caí na seguinte dúvida no que se refere a templates: é possível usar a tag ui:composition dentro de outra tag ui:composition??

Minha idéia é criar uma página que usa um template dentro de outro. Seria algo do tipo:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    template="layout/principal.xhtml">

    <ui:define name="corpo">

O define acima vem do template principal.xhtml

        <ui:composition xmlns="http://www.w3.org/1999/xhtml"
            xmlns:ui="http://java.sun.com/jsf/facelets"
            xmlns:h="http://java.sun.com/jsf/html"
            template="layout/navegacao.xhtml">

            <ui:define name="menuEsquerdo">
Esse define vem do template navegacao.xhtml
            </ui:define>

            <ui:define name="conteudo">         
Esse define também vem do template navegacao.xhtml
            </ui:define>

        </ui:composition> <!-- de volta ao define do principal.xhtml -->
   
    </ui:define>
   
    <ui:define name="rodape">
Esse define vem do template principal.xhtml
    </ui:define>
   
</ui:composition>

Tentei fazer exatamente isso, mas só o template interior é renderizado, ou seja as linhas

<ui:define name="rodape">
Esse define vem do template principal.xhtml
    </ui:define>

não são exibidas.

Alguém já fez algo desse tipo? Qualquer help é help! :lol:

valeu!

5 Respostas

ScottBrank

seguinte…
consegui resolver isso pra mim usando a tag ui:include, da seguinte maneira:

<ui:include src="/templates/template.xhtml" />

meu xhtml está dessa forma…

<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:richfaces="http://richfaces.ajax4jsf.org/rich"
	xmlns:rich="http://richfaces.org/rich"
	xmlns:a4j="http://richfaces.org/a4j"
	xmlns:ajax="https://ajax4jsf.dev.java.net/ajax">
<body>
<form><ui:insert name="body">
	<h:outputText binding="#{index.textoBody}"></h:outputText>
</ui:insert></form>
</body>
</html>

ou seja, me traz meu output numa boa, sendo ele de outro template.
abraço

ScottBrank

puts, ressucitei o tópico…
maldito (bendito, amém) google!

nessa_uepa

Fiz mais ou menos como o cara da resposta do post sugeriu.

No lugar do meu ui:define da parte que deve ter subtemplate, eu coloco o include.

Exemplo:

  • templatePai.xhtml *
    (…)
<ui:insert name="cabecalho"></ui:insert>

        <ui:insert name="teste"></ui:insert>
        
        <ui:insert name="conteudo"></ui:insert>
  • templatePaiDef.xhtml *
    (…)
<ui:define name="cabecalho">
               <ui:include src= "./cabecalho.xhtml"/>  /*conteudo estatico */                       
            </ui:define>

            <ui:define name="conteudo">
                <ui:include src= "./templateConteudo.xhtml"/>
            </ui:define>

(…)

sendo esse templateConteudo.xhtml:

  • templateConteudo.xhtml *
<h:panelGrid columns="2">
            
            <h:panelGroup>
                
                <h:panelGrid>
                    <ui:insert name="menu_secundario" >Menu esquerdo</ui:insert>
                </h:panelGrid>
                
            </h:panelGroup>
            
            <h:panelGroup>
                <ui:insert name="conteudo_interno" >conteudo</ui:insert>    
            </h:panelGroup>  
            
        </h:panelGrid>

e nas páginas:

  • pagina1.xhtml *
    (…)
<ui:composition template="/templates/templatePaiDef.xhtml">
            
            <ui:define name="menu_secundario">

                <h:commandLink>AMEM</h:commandLink>                                
                
            </ui:define>

            <ui:define name="menu_secundario">

                <h:outputText>CONTEUDO</h:outputText>                                
                
            </ui:define>     

            <ui:define name="teste">

                <h:outputText>teste</h:outputText>                        
                
            </ui:define>         
            
        </ui:composition>

Se a página inicial, por exemplo, não tiver essa subdivisão do segundo template que divide a pagina em menu esquerdo e conteudo é só em vez de definir os elementos definidos no template secundário, sobrepor a definição de “conteudo” já definida no templatePaiDef.xhtml.

nessa_uepa

Bom, depois de postar esse post eu vi uma forma mais elegante talvez de se fazer.
Quem estiver interessado procure sobre ui:decorate do facelets.
=]

Allansud

Vou dar uma olhada…

Criado 26 de fevereiro de 2007
Ultima resposta 14 de jul. de 2010
Respostas 5
Participantes 4