🏷️ catégories  /  🚀 projets  /  📰 rss  /  👤 à propos

Une entrée dans le menu utilisateur qui exécute du Javascript

Pour cela, on va créer un module de base :

blade create --template api my-portlet-entry

On retouche le bnd.bnd pour ne rien exporter :

Bundle-Name: My Portlet Entry
Bundle-SymbolicName: fr.mbarberot.myportlet.menu.entry
Bundle-Version: 1.0.0
-metatype: *
-plugin.metatype: com.liferay.ant.bnd.metatype.MetatypePlugin

On supprime le code généré et on ajoute notre composant :

@Component(
immediate = true,
property = {
// 1️⃣
"product.navigation.personal.menu.entry.order:Integer=100",
"product.navigation.personal.menu.group:Integer=100"
},
service = PersonalMenuEntry.class
)
public class ClickMePersonalMenuEntry implements PersonalMenuEntry { // 2️⃣

private ResourceBundle resourceBundle =
ResourceBundleUtil.getBundle(
"content.Language",
this.getClass().getClassLoader()
);

@Override
public String getLabel(Locale locale) {
return LanguageUtil.get(resourceBundle, "click-me");
}

@Override
public String getPortletURL(HttpServletRequest httpServletRequest) {
// 3️⃣
return "javascript:" +
"function showDialog() {" +
"jQuery('.click-me-dialog').click();" +
"};" +
"showDialog();";
}
}

Voici les points clés de ce code :

Premièrement (1️⃣), les properties indiquent à quel endroit notre entrée de menu se placera au sein de ce menu. Ici, ce sera le premier item

Ensuite (2️⃣), on utilise directement l’interface PersonalMenuEntry pour avoir la main sur la méthode getPortletURL et on doit également implémenter la méthode getLabel.

Enfin (3️⃣), la chaîne de caractères qui sera retournée de getPortletURL sera directement placée dans le href de l’item du menu. On peut donc lui indiquer du javascript comme dans l’exemple.

A noter cependant : si la méthode retourne des données, le lien effectuera un changement de page ! Il faut donc bien faire attention à ne rien retourner. Ainsi, on ne peut pas directement utiliser la méthode jQuery car ses méthodes retourneront toujours un résultat ou this (pour pouvoir faire une chaîne d’appel), d’où la syntaxe utilisée dans l’exemple.