Navigation
Le framework graphique permet aisément de naviguer d’un écran vers un autre.
Le INavigateContext
Cet élément sert de “transitions” entre deux écrans. Ainsi, quand on souhaite naviguer d’un écran A vers un écran B, il suffit de passer un INavigateContext dans lequel on trouvera :
- L’identifiant unique de l’écran cible (class et method)
- D’éventuels paramètres (String ou tout autre objet)
Ainsi quand l’écran B se chargera, au moment de son initialisation, il récupérera cet INavigateContext et pourra s’initialiser en conséquences.
Exemple :
INavigateContext nav = new NavigateContext();
nav.setClassName("server");
nav.setMethodName("browse");
Navigator.getNavigator().navigate(nav);
Cet exemple permet par exemple de naviguer vers l’administration. La notion de Navigator utilisée est détaillée ci-dessous.
Le Navigator
Cet objet est l’image du navigateur client, côté serveur. Il s’agit d’une classe “à la limite” du SDK.
Il permet de récupérer des informations sur le contexte d’exécution et de gérer la navigation dans le framework graphique.
Le récupérer
Certaines classes, comme les providers d’écrans, ont une méthode getNavigator()
disponible. Sinon, il est possible de le récupérer de n’importe quel endroit par Navigator.getNavigator()
.
On ne peut récupérer un navigateur que si quelqu’un est présent derrière un poste client ! Si ce code est exécuté dans un agent, il renverra “null”.
Les différents modes de navigation
Navigate
Sur l’objet Navigator, il est possible de déclencher un navigate vers le prochain écran (en fournissant un INavigateContext).
Dans ce cas le système va “empiler” les écrans. Ainsi, on navigue de A vers B et, quand l’écran B se termine, le système renvoie automatiquement sur un rechargement de l’écran A.
Un exemple depuis Process : naviguer vers un écran fictif class = myForm et method = edit
depuis un bouton posé en script dans un formulaire (on aurait très bien pu naviguer vers des écrans custom) :
<button labelid="LG_MY_TRANSLATION"><![CDATA[
var ctx = new Packages.com.axemble.vdp.ui.framework.foundation.NavigateContext();
ctx.setClassName("myForm");
ctx.setMethodName("edit");
navigator.navigate(ctx);
]]></button>
Il est possible de passer un ou des paramètres dans le contexte :
// Passage d'un paramètre
navigateContext.setParameter("toto", objet);
// Passage d'une Map
navigateContext.setParameters(Map<String,Object>);
Forward
Sur l’objet Navigator, il est possible de déclencher un forward vers le prochain écran (en fournissant un INavigateContext).
Dans ce cas, le système va vider la pile des écrans. Ainsi, si on navigue de A vers B; quand l’écran B se termine, on retourne à l’endroit où la navigation dans le framework a commencé : portail, easysite, …
Définir une URL de Retour lors de la Navigation
Il est possible de spécifier une URL de retour avec la méthode suivante :
Navigator.getNavigator().getRootNavigator().setBackURL("url/de/retour");
Passage de paramètre à la navigation
Il existe plusieurs façons de stocker les paramètres à transmettre lors de la navigation entre pages (selon le périmètre désiré). Pour cela, on utilise le Navigator
.
Stockage des paramètres
Navigator.getNavigator().getExecutionContext().getRequest().setAttribute("toto", objet);
Navigator.getNavigator().getExecutionContext().getRequest().getSession().setAttribute("toto", objet);
Navigator.getNavigator().getRootNavigator().setParameter("toto", objet);
Navigator.getNavigator().getRootNavigator().getExecutionContext().getRequest().setAttribute("toto", objet);
Navigator.getNavigator().getExecutionContext().getRequest().setAttribute("toto", objet);
Récupération des paramètres
Navigator.getNavigator().getExecutionContext().getRequest().getAttribute("toto");
Navigator.getNavigator().getExecutionContext().getRequest().getSession().getAttribute("toto");
Navigator.getNavigator().getRootNavigator().getParameter("toto");
Navigator.getNavigator().getRootNavigator().getExecutionContext().getRequest().getAttribute("toto");
Navigator.getNavigator().getExecutionContext().getRequest().setAttribute("toto", objet);
Autres méthodes sur le Navigator
Méthode | Commentaire |
---|---|
getCurrentScreen() |
Renvoie l’écran courant : CtlForm, CtlSheet, CtlWizard, … |
popScreen() |
Dépile un écran dans la pile de navigation. |
clearAllScreens() |
Vide la pile d’écrans pour revenir à la page d’origine. |
showPopup() |
Ouvre un lien (par exemple, depuis un bouton ajouté dans un formulaire de document). |
Déclenchement d’évènements
Même si on sort un peu ici du sujet de la navigation, il est intéressant de présenter la possibilité de déclencher via l’objet Navigator un évènement WEB utilisateur, par exemple un clic sur un bouton.
Exemple
On souhaite placer dans un formulaire un bouton supplémentaire qui réalise les traitements suivants :
- Un traitement spécifique
- Ensuite, le traitement exécuté sur le bouton “Enregistrer et fermer”
Au lieu d’essayer de coder le même comportement que ce bouton, il est possible, depuis le traitement du bouton, de simuler le clic sur le bouton “Enregistrer et fermer”.
Pour cela, il faut utiliser un IResourceController. Voici donc à quoi pourrait ressembler le code d’exécution sur le clic du bouton :
//CtlButton buttonSaveAndClose = getResourceController().getTopButton("saveandclose"); //deprecated since 2025.1 removed in 2026
IButton buttonSaveAndClose = getResourceController().getTopIButton("saveandclose"); //since 2025.1
getResourceController().execute(buttonSaveAndClose);
Manipulation des paramètres de requête
Il est fréquent de devoir lire la valeur d’un paramètre GET (plus souvent que POST). Il existe un plugin pour intégrer les processus dans les sites web.
Si une classe d’extension doit fonctionner dans les deux cas de figures (Site web et Processus) il faut faire comme suit :
@Override
public boolean onAfterLoad() {
Navigator.getNavigator().getRootNavigator().getExecutionContext().getContext().getParameterString( key )
}
Sources :