In Liferay 7 la creazione di una action di configurazione è totalmente diversa rispetto alla versione 6.2.
Gli step per crearla sono 4:
- Creare un interfaccia di configurazione
- Implementare la portlet class e aggiungere un riferimento all'interfaccia di configurazione
- Implementare la action di configurazione e referenziarla nella portlet
- 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>