bloggers bloggers

Marco Napolitano
Messaggi: 68
Stelle: 0
Data: 15/11/17
Jader Jed Francia
Messaggi: 50
Stelle: 0
Data: 22/09/17
Ezio Lombardi
Messaggi: 9
Stelle: 0
Data: 23/06/17
Chiara Mambretti
Messaggi: 25
Stelle: 0
Data: 27/02/17
Serena Traversi
Messaggi: 3
Stelle: 0
Data: 21/07/16
Francesco Falanga
Messaggi: 8
Stelle: 0
Data: 14/06/16
Antonio Musarra
Messaggi: 2
Stelle: 0
Data: 18/11/13
Simone Celli Marchi
Messaggi: 6
Stelle: 0
Data: 09/07/13
marcello marangio
Messaggi: 4
Stelle: 0
Data: 05/07/13
Marco Mancini
Messaggi: 1
Stelle: 0
Data: 05/06/13
Indietro

Integrazione con l'ADT Framework

Una delle tante novità introdotte da Liferay 6.2 è l'Applications Display Template Framework (ADT) che consente di definire modelli di render alternativi, per qualsiasi portlet comprese quelle custom.

Molte portlet di portale (Asset Publisher, Blog, Wiki, ...) supportano già gli ADT; saltando tutta la parte teorica degli ADT, vediamo come fare per integrare una portlet custom.

Innanzitutto dobbiamo aggiungere il seguente tag nel file liferay-portlet.xml, relativamente alla portlet di frontend che vogliamo integrare con gli ADT (l'implementazione della classe la vedremo dopo):

<portlet>
    ...
    <template-handler>...portlet.MyPortletDisplayHandler</template-handler>
    ...
</portlet>
Dopodichè è necessario modificare la parte di configurazione e visualizzazione della portlet: nel primo caso dobbiamo consentire all'utente di selezionare un ADT da usare, mentre nel secondo caso dobbiamo dire alla portlet di renderizzare l'ADT anzichè la JSP custom (nel caso in cui sia stato selezionato).
Partiamo dal file configuration.jsp:
<%
String displayStyle =
    PrefsParamUtil.getString(preferences, renderRequest, "displayStyle", StringPool.BLANK);
long displayStyleGroupId =
    PrefsParamUtil.getLong(preferences, renderRequest, "displayStyleGroupId", scopeGroupId);
long portletDisplayDDMTemplateId =
    PortletDisplayTemplateUtil.getPortletDisplayTemplateDDMTemplateId(displayStyleGroupId, displayStyle);
TemplateHandler templateHandler =
    TemplateHandlerRegistryUtil.getTemplateHandler(MyEntity.class.getName());
%> <div class="display-template"> <liferay-ui:ddm-template-selector classNameId="<%= PortalUtil.getClassNameId(templateHandler.getClassName()) %>" displayStyle="<%= displayStyle %>" displayStyleGroupId="<%= displayStyleGroupId %>" displayStyles="<%= new ArrayList<String>() %>" refreshURL="<%= saveURL.toString() %>" showEmptyOption="true" /> </div>
Tutto il lavoro sporco viene svolto dalla taglib, che si occupa di visualizzare l'elenco degli ADT disponibili per la specifica entità e di consentirne la selezione; la variabile saveURL rappresenta la normale URL di salvataggio delle impostazioni.
Dopodichè è il turno della JSP di visualizzazione (la classica view.jsp) che non dovrà fare altro che verificare l'esistenza di un ADT impostato e renderizzarlo opportunamente:
<c:choose>
    <c:when test="<%=portletDisplayDDMTemplateId == 0%>">
        <!-- Parte di JSP standard -->         
    </c:when>
    <c:otherwise>
        <%
        Map<String, Object> contextObjects = new HashMap<String, Object>();
        contextObjects.put("pageContext", pageContext);
        contextObjects.put(...);
        %>
        <%=PortletDisplayTemplateUtil.renderDDMTemplate(
                pageContext, portletDisplayDDMTemplateId,
                listOfMyEntities, contextObjects) %>
    </c:otherwise>
</c:choose>
Anche in questo caso non c'è molto da dire; è sufficiente invocare il metodo renderDDMTemplate passando tutti gli opportuni argomenti ed eventualmente una hashmap con oggetti aggiuntivi.
Infine è il turno della classe principale che si occupa di implementare l'integrazione con gli ADT:MyPortletDisplayHandler.
public class MyPortletDisplayHandler extends BasePortletDisplayTemplateHandler {
    @Override
    public String getClassName() {
        return MyEntity.class.getName();
    }

    @Override
    public String getName(Locale locale) {
        String portletTitle = PortalUtil.getPortletTitle(
            MyPortletKeys.MY_FRONTEND_PORTLET, locale);

        return portletTitle.concat(StringPool.SPACE).concat(
            LanguageUtil.get(locale, "template"));
    }

    @Override
    public String getResourceName() {
        MyPortletKeys.MY_FRONTEND_PORTLET;
    }

    @Override
    public Map<String, TemplateVariableGroup> getTemplateVariableGroups(
        long classPK, String language, Locale locale) throws Exception {
        Map<String, TemplateVariableGroup> templateVariableGroups =
            super.getTemplateVariableGroups(classPK, language, locale);

        String[] restrictedVariables = getRestrictedVariables(language);

        TemplateVariableGroup templateVariableGroup = templateVariableGroups.get("fields");
        templateVariableGroup.empty();

        templateVariableGroup.addCollectionVariable("my-entities-list", List.class,
            PortletDisplayTemplateConstants.ENTRIES, "myEntity", MyEntity.class, "curMyEntity", "title");
        templateVariableGroup.addVariable("my-entity", MyEntity.class,
            PortletDisplayTemplateConstants.ENTRY, "title");

        TemplateVariableGroup servicesTemplateVariableGroup = new TemplateVariableGroup(
            "my-entities-services", restrictedVariables);
        servicesTemplateVariableGroup.setAutocompleteEnabled(false);
        servicesTemplateVariableGroup.addServiceLocatorVariables(
            MyEntityLocalService.class, MyEntityService.class);

        templateVariableGroups.put(servicesTemplateVariableGroup.getLabel(), servicesTemplateVariableGroup);

        return templateVariableGroups;
    }
}

Tralasciando i metodi dall'ovvio significato, quello più importante ègetTemplateVariableGroups: questo metodo serve infatti ad iniettare all'interno dell'ADT le variabili che verranno visualizzate nell'editor (Velocity o Freemarker) con cui andremo a definire il template.

Abbiamo finito!

Ora non ci resta che accedere alla sezione Configurazione del sito e cliccare sulla voce Applications Display Template (o Modelli Visualizzazioni Applicazioni); nella voce di menu Aggiungisarà comparsa una nuova voce relativa al nostro ADT custom eda qui potremo creare tutti gli ADT necessari.

Precedente
Commenti
Nessun commento. Vuoi essere il primo.