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.