bloggers bloggers

Marco Napolitano
Messaggi: 79
Stelle: 0
Data: 17/02/22
Jader Jed Francia
Messaggi: 63
Stelle: 0
Data: 18/02/21
Paolo Gambetti
Messaggi: 2
Stelle: 0
Data: 11/11/19
Katia Pazzi
Messaggi: 1
Stelle: 0
Data: 27/06/19
Ezio Lombardi
Messaggi: 11
Stelle: 0
Data: 10/04/18
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
Indietro

Creare una Configuration Action con Liferay DXP

In Liferay 7 la creazione di una action di configurazione è totalmente diversa rispetto alla versione 6.2.

Gli step per crearla sono 4:

  1. Creare un interfaccia di configurazione
  2. Implementare la portlet class e aggiungere un riferimento all'interfaccia di configurazione
  3. Implementare la action di configurazione e referenziarla nella portlet
  4. Implementare la UI per la configurazione

Creare un interfaccia di configurazione

Per prima cosa creiamo un'interfaccia che rappresenterà la nostra configurazione ed annotiamola con @Meta.OCD specificando un id univoco (possiamo utilizzare il full qualified name dell'interfaccia); per fare questo è necessario aggiungere la seguente dipendenza nel file build.gradle:

compileOnly group: "biz.aQute.bnd", name: "biz.aQute.bndlib", version: "3.1.0"

A questo punto esponiamo tutti i metodi che vogliomo e annotiamoli con @Meta.AD.

Per maggiori informazioni sulle annotazioni possiamo consultare la documentazione presente a questo link: http://bnd.bndtools.org/chapters/210-metatype.html

Ecco un esempio di configurazione:

import aQute.bnd.annotation.metatype.Meta; 

@Meta.OCD(id = "it.myapplication.configuration.MyConfiguration") 
public interface MyConfiguration {

@Meta.AD(required = false) 
public String myConfigurationItem();
}

Ora aggiugiamo al file bnd.bnd la seguente riga:

-metatype: *

Implementare la portlet class e aggiungere un riferimento all'interfaccia di configurazione

Nella nostra portlet dichiriamo la configuratione come varibile volatile e aggiungiamo alla annotazione @Component il configurationPid che dovrà essere uguale al @Meta.OCD della nostra interfaccia di configurazione.

Andiamo ora a creare un metodo che istanzierà la configurazione annotandolo con  @Activate.

Di seguito un esempio:

import java.io.IOException;
import java.util.Map;

import javax.portlet.Portlet;
import javax.portlet.PortletException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;

import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Modified;

import com.liferay.portal.kernel.portlet.bridges.mvc.MVCPortlet;

import aQute.bnd.annotation.metatype.Configurable;

@Component(immediate = true,configurationPid = "it.myapplication.configuration.MyConfiguration", property = {
    "com.liferay.portlet.add-default-resource=true",
    "com.liferay.portlet.display-category=category.sample",
    "com.liferay.portlet.layout-cacheable=true",
    "com.liferay.portlet.private-request-attributes=false",
    "com.liferay.portlet.private-session-attributes=false",
    "com.liferay.portlet.render-weight=50",
    "com.liferay.portlet.use-default-template=true",
    "javax.portlet.display-name=My Application Portlet",
    "javax.portlet.expiration-cache=0",
    "javax.portlet.init-param.template-path=/",
    "javax.portlet.init-param.view-template=/html/view.jsp",
    "javax.portlet.name=" + PortletKeys.MY_APPLICATION_PORTLET,
    "javax.portlet.resource-bundle=content.Language",
    "javax.portlet.security-role-ref=administrator,power-user,user",
    "com.liferay.portlet.footer-portlet-javascript=/js/main.js",
    "javax.portlet.supports.mime-type=text/html"
}, service = Portlet.class)
public class MyAppPortlet extends MVCPortlet {

    @Override
    public void doView(RenderRequest renderRequest, RenderResponse renderResponse)
            throws IOException, PortletException {

        renderRequest.setAttribute(MyConfiguration.class.getName(), _myConfiguration);

        super.doView(renderRequest, renderResponse);
    }

    @Activate
    @Modified
    protected void activate(Map<Object, Object> properties) {
        _myConfiguration= Configurable.createConfigurable(MyConfiguration.class, properties);
    }

    private volatile MyConfiguration _myConfiguration;
}

Implementare la action di configurazione e referenziarla nella portlet

Per creare la nostra action di configurazione andiamo a creare una classe che dovra estendere (come facevamo per Liferay 6.2) la DefaultConfigurationAction.

Come fatto per la portlet dichiriamo la configuratione come varibile volatile e aggiungiamo alla annotazione @Component il configurationPid che dovrà essere uguale al @Meta.OCD della nostra interfaccia di configurazione.

Andiamo ora a creare un metodo che istanzierà la configurazione annotandolo con  @Activate.

Ora andiamo a specificare a quale portlet la action di configurazione fa riferimento tramite la notazione @Component

property ={"javax.portlet.name=it.myapplication.configuration.MyConfiguration"},

Ecco un esempio completo:

import java.util.Map;

import javax.portlet.PortletConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.ConfigurationPolicy;
import org.osgi.service.component.annotations.Modified;

import com.liferay.portal.kernel.portlet.ConfigurationAction;
import com.liferay.portal.kernel.portlet.DefaultConfigurationAction;

import aQute.bnd.annotation.metatype.Configurable;

@Component(configurationPid = "it.myapplication.configuration.MyConfiguration", configurationPolicy = ConfigurationPolicy.OPTIONAL, immediate = true, property = {
        "javax.portlet.name=" + PortletKeys.MY_APPLICATION_PORTLET }, service = ConfigurationAction.class)
public class MyConfigurationAction extends DefaultConfigurationAction {

    @Override
    public String getJspPath(HttpServletRequest request) {
        return "/html/configuration.jsp";
    }

    @Override
    public void include(PortletConfig portletConfig, HttpServletRequest httpServletRequest,
            HttpServletResponse httpServletResponse) throws Exception {

        httpServletRequest.setAttribute(MyConfiguration.class.getName(), _myConfiguration);

        super.include(portletConfig, httpServletRequest, httpServletResponse);
    }

    @Activate
    @Modified
    protected void activate(Map<Object, Object> properties) {
        _myConfiguration= Configurable.createConfigurable(MyConfiguration.class, properties);
    }

    private volatile MyConfiguration _myConfiguration;
}

Implementare la UI per la configurazione

Per prima cosa definiamo una init.jsp  in cui andremo a recuperare la nostra configurazione.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>

<%@ taglib uri="http://liferay.com/tld/aui" prefix="aui" %>
<%@ taglib uri="http://liferay.com/tld/portlet" prefix="liferay-portlet" %>
<%@ taglib uri="http://liferay.com/tld/theme" prefix="liferay-theme" %>
<%@ taglib uri="http://liferay.com/tld/ui" prefix="liferay-ui" %>

<%@ page import="it.myapplication.configuration.MyConfiguration" %>
<%@ page import="com.liferay.portal.kernel.util.StringPool" %>
<%@ page import="com.liferay.portal.kernel.util.Validator" %>

<portlet:defineObjects />

<liferay-theme:defineObjects />

<%
    MyConfiguration myConfiguration=
        (MyConfiguration)
        renderRequest.getAttribute(MyConfiguration.class.getName());

    String myConfigurationItem= StringPool.BLANK;

    if (Validator.isNotNull(myConfiguration)) {
        myConfigurationItem=
            portletPreferences.getValue(
                "myConfigurationItem", myConfiguration.myConfigurationItem());
    }
%>

L'ultimo passo sarà creare la configuration.jsp ovvero la pagina in cui potremo settare le nostre preferenze.

<%@ include file="/init.jsp" %>

<liferay-portlet:actionURL portletConfiguration="<%= true %>"
    var="configurationActionURL" />

<liferay-portlet:renderURL portletConfiguration="<%= true %>"
    var="configurationRenderURL" />


<aui:form action="<%= configurationActionURL %>" method="post" name="fm">
<aui:input name="<%= Constants.CMD %>" type="hidden" value="<%= Constants.UPDATE %>" />
<aui:input name="redirect" type="hidden" value="<%= configurationRenderURL %>" />
    <div class="portlet-configuration-body-content">
        <div class="container-fluid-1280">
            <div class="col-md-4">
            <aui:fieldset>
                <aui:input  name="preferences--myConfigurationItem--" value="<%=myConfigurationItem%>" label="myConfigurationItem"/>                
            </aui:fieldset>
            </div>
        </div>
    </div>

    <aui:button-row>
        <aui:button cssClass="btn-lg" type="submit" />
    </aui:button-row>
</aui:form>
Commenti
Aggiungi Commento
Michele
E se non avessi la classe MyAppPortlet extends MVCPortlet ?
Inviato il 27/02/20 11.12.