Les sélecteurs correspondent à des critères permettant de filtre des listes de résultats.

Développement d'un sélecteur

Un sélecteur doit positionner 2 paramètres publics de la page qui vont forcer le rafraichissement des listes de la page.

Ces 2 paramètres sont:

  • selectors qui contient la liste de tous les sélecteurs de la page dans un paramètre
  • lastSelectors qui contient l'ancienne valeur du sélecteur et permet de rafraichir la pagination

Ces paramètres doivent être déclarés comme publics :

<portlet>
    <supported-public-render-parameter>selectors</supported-public-render-parameter>
    <supported-public-render-parameter>lastSelectors</supported-public-render-parameter>           
</portlet>
<public-render-parameter>
    <identifier>selectors</identifier>
    <name>selectors</name>
</public-render-parameter>

<public-render-parameter>
    <identifier>lastSelectors</identifier>
    <name>lastSelectors</name>
</public-render-parameter>

Ces 2 paramètres doivent être valorisés dans la métode ProcessAction. La classe PageSelectorspermet d'aggréger les sélecteurs de la page dans un seul paramètre.

Exemple de valorisation

if( request.getParameter("selectors")!= null) {
    response.setRenderParameter("lastSelectors", request.getParameter("selectors"));
}                       
response.setRenderParameter("selectors", PageSelectors.encodeProperties(selectors));

Utilisation d'un sélecteur dans une liste

La liste se base sur la comparaison entre selectors et lastSelectors pour rafraichir la pagination. Ils doivent être déclarés en paramètres publics dans le fichier portlet.xml

<portlet>
    <supported-public-render-parameter>selectors</supported-public-render-parameter>
    <supported-public-render-parameter>lastSelectors</supported-public-render-parameter>           
</portlet>
<public-render-parameter>
    <identifier>selectors</identifier>
    <name>selectors</name>
</public-render-parameter>

<public-render-parameter>
    <identifier>lastSelectors</identifier>
    <name>lastSelectors</name>
</public-render-parameter>

Pour analyser si le sélecteur a été modifié :

// Selectors
String selectors = request.getParameter("selectors");
String lastSelectors = request.getParameter("lastSelectors");

if ("".equals(selectors)) {
    selectors = null;
}

// Current page is reset on selectors change
boolean selectorsChanged = (((selectors != null) && !selectors.equals(lastSelectors)) || ((selectors == null) && (lastSelectors != null)));

if (!((currentPageParameter == null) ||  selectorsChanged)) {
    currentPage = NumberUtils.toInt(currentPageParameter);
}

La liste doit également rafraichir le lastSelectors afin de ne pas réeffectuer le traitement lors du render suivant.

// On render url, it is not possible to clear a parameter value (old value keeps unchanged)
// So put __NONE__
if ("__NONE__".equals(lastSelectors)) {
    lastSelectors = null;
}

request.setAttribute("lastSelectors", StringUtils.isEmpty(selectors) ? "__NONE__" : selectors);

et réinitialiser le parameter public lastSelector

<portlet:renderURL var="url">
    <portlet:param name="lastSelectors" value="${lastSelectors}" />
</portlet:renderURL>