Criando um ADT que acesse a estrutura de um Web Content

Antes de começar, quero avisá-los que colocarei o nome em inglês do portlets para facilitar o entendimento do artigo.

Como na maioria dos portais de notícias você precisa de uma estrutura diferente da estrutura padrão do Liferay para publicar de forma mais simples e com mais informações as notícias.

Apenas como exemplo, vamos criar uma estrutura com Titulo, SubTitulo e Conteúdo e vamos criar um Application Display Template que exibe as notícias de forma personalizada. A forma personalizada será a lista de notícias com título, sub titulo e link para ler a notícia completa.

 

Solução

O Application Display Template (ADT) para o Asset Publisher é a solução.

Vamos ao código que acessa a estrutura de um Web Content para montar o que foi pedido acima.

#if (!$entries.isEmpty())

    #foreach ($entry in $entries)
        #set($renderer = $entry.getAssetRenderer() )
        #set($className = $renderer.getClassName() )

        #if( $className == "com.liferay.portlet.journal.model.JournalArticle" )
            #set( $journalArticle = $renderer.getArticle() )
            #set( $document = $saxReaderUtil.read($journalArticle.getContent()) )
            #set( $rootElement = $document.getRootElement() )


            ## primeira forma de fazer            
            #foreach( $dynamicElement in $rootElement.elements() )
                #if( "subTitulo" == $dynamicElement.attributeValue("name") )
                    #set( $subTitulo1 = $dynamicElement.element("dynamic-content").getText() )
                    primeira forma -> $subTitulo1 <br />
                #end
            #end


            ## segunda forma de fazer
            #set( $xPathSelector = $saxReaderUtil.createXPath("dynamic-element[@name='subTitulo']") )
            #set( $subTitulo2 = $xPathSelector.selectSingleNode($rootElement).getStringValue() ) 
            segunda forma -> $subTitulo2 <br />
        #end
    #end
#end

No código acima mostramos duas formas de acessar o conteudo da estrutura.

Fica a seu criterio qual utilizar. Uma melhoria que você poderia fazer para o código acima, seria verificar se o WebContent (JournalArticle) é do tipo de estrutura que você criou. Para o meu caso eu sei que só tenho um tipo, por isso não fiz essa checagem.

Vamos ao código final que mostra o Título, Sub Titulo e Link para a notícia.

#if (!$entries.isEmpty())
    <div class="noticias">
    #foreach ($entry in $entries)
        #set($renderer = $entry.getAssetRenderer() )
        #set($className = $renderer.getClassName() )
        #if( $className == "com.liferay.portlet.journal.model.JournalArticle" )
            #set( $journalArticle = $renderer.getArticle() )
            #set( $document = $saxReaderUtil.read($journalArticle.getContent()) )
            #set( $rootElement = $document.getRootElement() )
            #set( $xPathSelector = $saxReaderUtil.createXPath("dynamic-element[@name='subTitulo']") )
            #set( $subTitulo = $xPathSelector.selectSingleNode($rootElement).getStringValue() )
            #set( $link = $renderer.getURLViewInContext($renderRequest, $renderResponse, '') )
            
            <div class="noticia">
                <h1 class="titulo">$entry.getTitle($locale)</h1>
                <h3 class="sub-titulo">$subTitulo</h3>
                <p class="leia-mais">
                    <a href="$link">Leia Mais</a>
                </p>
            </div>
        #end
    #end
    </div>
#end

 

Com isso você consegue exibir os dados da estrutura do Web Content.

Espero que isso seja útil para vocês.

 

Mais informações sobre Application Display Template

ADT é uma nova forma de criar modos de exibição personalizados para alguns recursos do Liferay. 

Para saber mais informações sobre o ADT, sugiro dar uma lida nesses artigos aqui:

https://www.liferay.com/pt/web/eduardo.garcia/blog/-/blogs/new-ways-of-customization-with-application-display-templates-part-i-

https://www.liferay.com/pt/web/eduardo.garcia/blog/-/blogs/new-ways-of-customization-with-application-display-templates-part-ii-

 
Abraços e até o próximo.