Infrastructure côté serveur

Un plug-in reçoit du client des demandes HTTP pour des menus spécifiques et répond par le flux de menu au format JSON. La réponse est associée au type de contenu application/JSON.

L'adresse URL de la demande pour le fournisseur de flux de menu se trouve sous l'adresse URL /wps/contenthandler ou /wps/mycontenthandler, selon que la demande provient d'un contexte d'utilisateur connecté. L'URL de demande peut exécuter l'état de navigation de l'URL du portail, mais nécessite une chaîne de requête spécifique pour accéder au fournisseur de flux de menus. La chaîne de requête spécifique permettant d'accéder au fournisseur de flux JSON par défaut est la suivante :
?uri=menu:<specific menu name>&navID=<navigation node OID or custom unique name>
[&windowID=<portlet window control ID on the page> ]
où :
navID
Ce paramètre est l'ID objet au format chaîne sérialisé ou le nom unique personnalisé d'un noeud de navigation du portail (une page de portail), qui est affiché lorsque le menu est demandé. Ce paramètre fournit un contexte au fournisseur de flux de menu à utiliser lorsque vous générez le menu pour que l'on sache quel thème utiliser, car le thème est associé à la page explicitement ou par héritage.
windowID
Ce paramètre est facultatif et est au format chaîne sérialisé d'une commande de fenêtre de portlet sur la page qui est spécifiée par navID. Ce paramètre n'est nécessaire que pour les menus contenant des actions de portlet, en d'autres termes, des skin menus. Ce paramètre doit être un ID objet en série. Un nom unique personnalisé ne fonctionne pas pour l'ID fenêtre du portlet.
HCL Portal fournit trois fichiers de définition de menu prêts à l'emploi avec le thème optimisé de Portal 8.5 :
  • pageAction
  • skinAction
  • moreActions

Ces fichiers existent dans WebDAV, sous un répertoiremenuDefinitions dans la racine du thème. La racine est définie dans les métadonnées du thème sous le nom d'entrée de métadonnées com.ibm.portal.theme.template.ref. D'autres fichiers de ce répertoire sont de syntaxe JSON mais ils ne sont pas utilisés par l'infrastructure de menu JSON


Capture d'écran dans la racine du thème dans WebDAV
New starting in version 8.0.0.1 : Il est possible de nommer un ID de menu (le specific menu name après ?uri=menu: dans la demande) qui n'existe pas. Avant la version 8.0.0.1, ce menuID aurait généré un message d'erreur concernant un nom de menu non valide ou inexistant. Dans la version 8.0.0.1 et les versions ultérieures, ce menuID est traité comme si un fichier de menu de ce nom existait, avec pour contenu un tableau vide ("[ ]"). Une réponse de flux de menu est alors générée. Elle est composée uniquement du traitement des contributions de menu ou des sous-contributions JSON pour le profil de thème en cours qui sont étiquetées avec un ref-id correspondant au nom de menu de la demande.
Important : L'ordre des éléments ajoutés dynamiquement à un menu n'est pas contrôlé ni garanti en aucune manière. Bien que dans le tri, l'ordre était cohérent entre les redémarrages du serveur sur le même système, il est incohérent sur différents systèmes d'exploitation. Notamment entre les JVM IBM® et celles qui ne proviennent pas d'IBM®. S'il est nécessaire de contrôler strictement l'ordre des options de menu, utilisez l'entrée explicite "type":"ModuleRef" dans un fichier de définition de menu pour insérer explicitement l'option de menu au lieu d'utiliser le mécanisme de contribution dynamique.

Syntaxe du fichier de définition de menu JSON

Pour plus d'informations sur JSON, voir la page d'accueil de JSON.

La syntaxe JSON d'un fichier de définition de menu se compose d'un tableau d'objets JSON, où le tableau est placé entre crochets [ ]. Chaque objet JSON est placé entre accolades ({ }) et séparé par des virgules :
[
   // optional one-line comment 
   {
     JSON object 1 (first menu item)
   },
   /*
     optional multi-line comment
   */
   {
     JSON object 2 (second menu item)
   },
   ...
]

Vous pouvez ajouter des commentaires dans ce fichier en utilisant une extension spécifique au portail de la syntaxe JSON.

Remarque : Le fichier de définition de menu JSON minimum et valide se compose d'un crochet d'ouverture et de fermeture ([]). Un fichier vide entraîne une exception de syntaxe incorrecte.

Il n'y a pas de virgule dans l'objet final dans le tableau entre l'accolade fermante et le crochet fermant du tableau de fin.

L'ordre des objets dans le tableau dans le fichier de définition de menu détermine l'ordre d'apparition des éléments dans le menu sur le client.

Chaque objet dans le tableau est une définition d'élément de menu autonome individuelle, ou une référence à un module d'optimisation de thème pouvant fournir un marquage de fichier de définition de menu JSON en ligne supplémentaire. Ce JSON ajouté est inclus en ligne comme s'il figurait dans le fichier de menu lui-même.

Chaque objet se compose de plusieurs membres JSON séparés par une virgule, possédant chacun un nom et une valeur séparés par un signe deux-points. Le nom du membre est toujours une chaîne entre guillemets. Les valeurs peuvent être des chaînes, des valeurs booléennes, des objets imbriqués ou des tableaux, selon le nom de membre. Certains noms de membre ne peuvent avoir que certaines valeurs, conformément à la liste ci-après.

Chaque définition d'élément de menu doit avoir une entrée type, qui définit cette entrée de menu particulière.
Important : La distinction minuscules/majuscules est appliquée pour tous les noms d'entrée.

Les noms et valeurs d'éléments de menu suivants sont les valeurs acceptables pour le type d'entrée.

"type" : "Header"
Définit un libellé pour les entrées suivantes dans le menu. En général, il est mis en évidence et en retrait dans l'interface utilisateur client, bien que cet élément de menu soit contrôlé par le style appliqué aux éléments de menu. Un en-tête dans le menu n'est généralement pas cliquable.

Vous pouvez ajouter d'autres entrées d'objet de titre dans la valeur titles pour d'autres langues.

Vous pouvez ajouter un membre itemClass pour contrôler l'apparence de l'en-tête.

{
"type" : "Header",
"titles" : [{"lang":"en","value":"<English text>"}, {"lang":"de", "value" : "German text"},...]
}
"type" : "Separator"

Définit un séparateur pour les éléments de menu. Un séparateur peut apparaître sous forme de blanc ou prendre l'apparence d'une ligne par exemple, selon le style appliqué au menu.

En général, un séparateur ne requiert pas d'autres membres, bien que vous puissiez ajouter un membre itemClass pour contrôler l'apparence.

{
"type" : "Separator",
}
"type" : "DynamicMenuitem"

Potentiellement cliquable et ayant une action, l'élément DynamicMenuitem a un membre id dont la valeur est un nom de plug-in. Le fournisseur de flux de menu utilise cet ID pour extraire une instance de l'opération nommée, dans laquelle sont ensuite recherchées les informations requises pour générer le contenu du flux de menu pour ce menuitem. Plusieurs plug-ins sont mis à disposition par HCL Portal et prêts à l'emploi dans les définitions de menu par défaut, qui peuvent être réutilisées dans des menus et des thèmes personnalisés.

Ce plug-in détermine lui-même s'il est actif, ainsi que les droits de contrôle d'accès pour l'utilisateur courant, et fournit son propre titre traduit, ainsi qu'une description, en option, et une valeur actionHttpMethod, que le fournisseur de flux de menu utilise lorsque vous générez l'entrée de menu pour cet élément. L'URI OperationURI de ce plug-in d'opérations devient l'adresse URL actionUrl dans l'entrée de menu correspondante. D'autres membres d'objet son admis, notamment actionFn, actionHttpMethod, visibilityFn, itemClass et des métadonnées. Un membre markupID peut être ajouté de sorte à créer un ID sur la balise HTML de l'élément de menu qui en découle.

Si la méthode isActive() renvoie la valeur false lorsqu'elle est appelée par le code du fournisseur de flux de menu, l'élément de menu est présent dans le flux de menu, mais un membre booléen "visibility" : false est ajouté au flux. Ce membre booléen indique au code côté client de ne pas présenter cette opération à l'utilisateur, et le code côté client n'inclut pas cet élément dans le menu final affiché.

En option, vous pouvez aussi spécifier un membre moduleArgs. Ce membre est une chaîne de noms et de valeurs présentés sous forme de paramètres de requête qui sont séparés par une perluète (&). S'ils sont présents, ces arguments sont transmis au plug-in lorsque le fournisseur de flux accède au plug-in pour générer l'entrée de menu courante.

{
"type" : "DynamicMenuitem",
"id" : "operations.framework.plugin.name"
}
"type" : "StaticMenuitem"

Possible de cliquer dessus et associé à une action. En général, il est utilisé pour insérer un élément de menu possédant une implémentation côté client, plutôt qu'une implémentation côté serveur.

Permet à l'auteur du fichier de définition de flux de menu de spécifier entièrement une entrée d'élément de menu arbitraire. Toutes les informations nécessaires doivent être fournies par le fichier de définition de menu, car il n'existe pas d'opération correspondante pour une entrée StaticMenuitem. Le paramètre id est facultatif et est ignoré par le code du fournisseur de flux de menu pour une entrée StaticMenuitem, même s'il ne génère pas d'erreur de syntaxe en cas d'absence.

Vous pouvez ajouter d'autres membres facultatifs, en fonction de vos besoins.

{
"type" : "StaticMenuitem",
 "titles" : [{"lang" : "en", "value" : "My English menu item text"},
        {"lang" : "de", "value" : "Mein menu item text auf Deutsch"},
         ...
        ],
"descriptions" : [{"lang" : "en", "value" : "My English menu item longer description flowing beautiful prose"},
             {"lang" : "de", "value" : "Mein menu item longer description flowing beautiful prose auf Deutsch"},
             ...
             ],
"actionUrl" : "http://www.cntserv_exmp.com/wps/myportal/some_useful_url",
"actionHttpMethod" : "POST",
"actionFn" : "client_method_to_override_actionUrl",
"metadata" : {
        "navID" : "${navID}",
        "some_name" : "some_value",
        "some_other_name" : "${SubVar_From_Request_Query_Parms}"
        }
"markupId" : "my.item.markupId"
}
"type" : "ModuleRef"

Un fichier de définition de menu possède un membre id dont la valeur est le nom d'un plug-in. Ce plug-in doit disposer d'une contribution du type de menu et d'une sous-contribution du type JSON. Le fournisseur de flux de menu utilise la valeur du membre id de ce projet JSON pour extraire une référence à la contribution JSON dans la contribution de menu pour ce module. Cette sous-contribution JSON doit être un marquage de définition de menu JSON autonome valide, incluant les crochets ouvrant et fermant entre lesquels est placé le tableau. Le fournisseur de flux de menu supprime ces crochets et insère le marquage contribué à la réponse de flux de menu comme s'il était inclus dans le fichier de définition principal.

Désigne par son nom un plug-in qui fournit un marquage de syntaxe de fichier de définition de menu et au format JSON supplémentaire, que le fournisseur de flux place en ligne dans le flux de menu et qui remplace l'entrée ModuleRef.

Vous pouvez éventuellement ajouter un membre moduleArgs. Si elle est présente, la valeur du membre moduleArgs est transmise sous forme d'arguments pour extraire le marquage du fichier de définition de menu JSON du plug-in.

{
"type" : "ModuleRef",
"id" : "Theme Optimization Framework module name"
}
"type" : "Submenu"

Définit un signet dans le menu en cours dans un nouveau sous-menu est associé. Cet élément permet des menus à plusieurs niveaux. Le niveau d'imbrication est illimité. Le sous-menu est extrait par une demande de menu supplémentaire indépendante au fournisseur de flux de menu JSON lorsque l'entrée de sous-menu est survolée dans le menu affiché.

Le menu est ajouté à un côté, comme l'indique la position de l'écran. Un membre de sous-menu est extrait dans une demande distincte du client.

Un membre de sous-menu nomme la source du contenu de son menu à l'aide d'un membre id ou moduleId, et doit posséder un membre titles pour fournir le texte de l'élément de menu signet ; en option, il peut aussi posséder un membre descriptions.

La seule différence entre ces deux membres concerne la façon dont la demande suivante est traitée, lorsque le sous-menu est développé et que le code du client extrait le flux de menu d'expansion dans une nouvelle demande HTTP :
  • Pour un membre id, le système considère que la demande suivante nomme un fichier de définition de menu, où la valeur id et le nom de fichier et l'extension est .json.
  • Pour un membre moduleId, le système considère que la demande suivante nomme un plug-in qui fournit le marquage JSON nécessaire. Cette demande est accessible de la façon dont l'a indiqué un fichier de définition de menu.
    {
    "type" : "ModuleRef",
    "id" : "moduleId_value"
    }

Vous pouvez également ajouter un membre moduleArgs. Si elle est présente avec un membre moduleRef dans une entrée SubMenu, la valeur du membre moduleArgs est ajoutée à l'URL qui est construite comme l'ID de l'élément de menu. Cette valeur est utilisée en tant que référence de menu à partir du client pour l'extraction du menu de marquage pour le sous-menu en cascade.

    {
    "type" : "SubMenu",
    "id" : "name_of_submenu_definition_JSON_file",
     "titles" : [{"lang" : "en", "value" : "My English sub-menu item text"},
          {"lang" : "de", "value" : "Mein sub-menu item text auf Deutsch"},
          ...
          ],
    "descriptions" : [{"lang" : "en", "value" : "My English sub-menu item longer description flowing beautiful prose"},
          {"lang" : "de", "value" : "Mein sub-menu item longer description flowing beautiful prose auf Deutsch"},
          ...
          ]
     }
    or
     {
    "type" : "SubMenu",
    "moduleId" : "name_of_theme_opt_framework_module_which_contributes_submenu_definition_JSON_",
    ...
    }  

Membres valides dans un fichier de définition de menu JSON

Nom du membre Valeur et exemple de syntax Commentaires
type "Header", "Separator", "DynamicMenuitem", "StaticMenuitem", "ModuleRef", "Submenu" Détermine le type d'élément de menu qui est créé par cet objet de fichier de définition de menu
id Chaîne Pour DynamicMenuitem ou ModuleRef, le membre id est requis. Pour un Submenu, id ou moduleId est requis.
DynamicMenuitem
L'ID est le nom du plug-in auquel le fournisseur de flux de menu accède pour obtenir l'actionUrl (qui est l'URI OperationURI de l'opération), le titre et la description traduits et la méthode de l'opération isActive, qui indique si l'action est active et également accessible par l'utilisateur en cours. L'adresse URL actionUrl est envoyée au serveur dans une demande distincte si l'utilisateur clique sur cet élément de menu dans le menu affiché.
ModuleRef
L'ID est le nom du plug-in accessible pour extraire le marquage de définition du fichier de menu supplémentaire.
Submenu
L'id est présent et correspond au nom du menu demandé par le client dans une demande de menu HTTP pour créer la liste des éléments du sous-menu.
titles Tableau des objets, dont chacun possède les membres suivants :

un objet "lang" définit la langue de cette entrée de titre et un objet "value" contient la chaîne de cette langue pour le titre.

"titles" : [ {"lang":"en", "value":"Title in English"}, {"lang":"de", "value":"Title auf Deutsch"}, ... ]

Requis pour les entrées d'en-tête, StaticMenuitem et de sous-menu. La liste des langues fournies couvre uniquement les langues nécessaires pour les utilisateurs d'un portail. Peut également être utilisé pour DynamicMenuitem. DynamicMenuitem extrait le titre du plug-in correspondant. Le plug-in est requis pour implémenter l'interface Localized, et fournir des chaînes localisées pour les langues appropriées. Vous pouvez remplacer les titres et la description à l'aide des éléments correspondants dans JSON. Toutefois, le remplacement s'applique à toutes les langues. Vous ne pouvez pas sélectionner des langues spécifiques à remplacer. Un membre Separator n'est associé à aucun texte. Un ModuleRef est remplacé par un autre balisage.
descriptions Identique à titles. "descriptions" : [ {"lang":"en", "value":"Title in English"}, {"lang":"de", "value":"Title auf Deutsch"}, ... ] Facultatif pour tous les types. S'il est présent, ce membre est interprété par le code du client par défaut comme texte d'infobulle pour l'élément de menu.
itemClass Chaîne Facultatif pour tous les types. Ce membre est le nom de classe de style appliqué à l'élément de menu. S'il est présent, il doit s'agir du nom de classe qui figure dans la feuille de style associée au thème pour le menu.
enabled Valeur booléenne true ou false Facultatif pour tous les types. La valeur par défaut est true. Ce membre indique si l'élément de menu est cliquable côté client. La valeur true indique qu'il est actif et la valeur false qu'il est inactif.
enableFn Chaîne Facultatif pour tous les types. Si ce membre est présent, il correspond au nom d'une fonction JavaScript à exécuter sur le client afin de déterminer si cet élément de menu est actif. L'objet JSON de flux de menu complet pour cet élément de menu est transmis sous forme d'argument à la fonction.

Le résultat de cet appel de fonction remplace le paramètre "enabled".

actionUrl Chaîne Pour StaticMenuitem, actionUrl ou actionFn doit être spécifié. Si actionUrl est spécifié, il peut s'agir d'une adresse URL absolue ou relative ou d'une chaîne de requête qui est ajoutée à l'adresse URL de demande courante ou à la valeur de balise. Non requis pour DynamicMenuitem. Inutile pour tout autre type.

Appeler actionFn est prioritaire par rapport à actionUrl si les deux sont présents.

actionHttpMethod Chaîne, avec les valeurs HTTP normales "GET", "POST", "PUT", "DELETE" et autres valeurs. La valeur par défaut est "GET". Facultatif pour tous les types d'objet. Si ce membre est présent dans un membre DynamicMenuitem, il remplace toute action fournie par le plug-in de structure des opérations.
actionFn Chaîne Pour StaticMenuitem, actionUrl ou actionFn doit être spécifié. Si actionFn est présent, ce membre correspond au nom d'une fonction JavaScript à exécuter sur le client lorsque l'utilisateur clique sur l'élément de menu. L'objet JSON de flux de menu complet pour cet élément de menu est transmis sous forme d'argument à la fonction. Appeler actionFn est prioritaire par rapport à actionUrl si les deux sont présents.
visibilityFn Chaîne Facultatif pour tous les types, mais pas utile pour Separator et ModuleRef). Pour un DynamicMenuitem ou StaticMenuitem, si visibilityFn est présent, ce membre correspond au nom d'une fonction JavaScript à exécuter sur le client afin de déterminer si cet élément de menu est actif. L'objet JSON de flux de menu complet pour cet élément de menu est transmis sous forme d'argument à la fonction.
metadata

Objet imbriqué dont les seuls types de valeur admis sont des chaînes. Exemple : "metadata": { "name1" : "value1", "name2" : "${substitution-variable}", ... }

Pour la version 8.0.0.1 : L'objet imbriqué, dont les membres peuvent être des valeurs de chaîne, des valeurs booléennes, ou des valeurs numériques, ou d'autres objets imbriqués. Le niveau d'imbrication est illimité. Il n'existe que deux restrictions sur les métadonnées :
  • Aucune matrice peut être utilisé dans les métadonnées
  • Aucun membre au sein d'un objet de métadonnées peut être doté du nom "métadonnées". Cela génère une erreur de syntaxe IllegalSyntaxException.

Avant la version 8.0.0.1, les métadonnées ont été limités uniquement aux types de chaîne sans imbrication intégrée.

Facultatif pour tous les types. S'il est présent, le membre doit s'agir d'un objet imbriqué simple associé à des valeurs de type chaîne uniquement. Aucune imbrication d'objet plus profonde ou aucun tableau n'est admis en tant que valeur. Si des variables de substitution sont indiquées sous la forme ${variableName}, ces valeurs sont substituées à partir des paramètres de requête dans la demande de menu reçue. Plusieurs paramètres de requête peuvent apparaître dans une chaîne, mais ils ne sont transmis qu'une fois via la chaîne.

Facultatif pour tous les types. S'il est présent, les membres s'y trouvant doivent observer les restrictions répertoriées pour la version appropriée. Si des variables de substitution sont présentes dans n'importe quelle valeur de chaîne dans l'objet de métadonnées, à n'importe quel niveau d'imbrication, sous la forme ${variableName}, ces valeurs sont remplacées à partir des paramètres de demande sur la demande de menu reçue (...&variableName=value...). Plusieurs variables de remplacement peuvent être contenues dans une chaîne de valeur de métadonnées, mais elles ne sont transmises qu'une fois via la chaîne. Toutes les variables de remplacement trouvées pour lesquelles il n'existe pas de substitution dans les paramètres de requête de la demande, demeurent inchangées dans les métadonnées transmises au client dans le cadre de la réponse de flux JSON.

Par exemple:
[
  {
    ....
    "metadata" : {
           "a" : "something",
           "b" : true,
           "c" : 123,
           "thisIsNestedMetadata" : {
                 "a" : "something nested",
                 "d" : "This is a substitution:  ${subVar}"
           }
      }
      ...
  }
]
moduleId Chaîne Facultatif pour Submenu mais applicable uniquement à Submenu. S'il est présent à la place d'un membre ID dans une entrée Submenu, ce membre correspond au nom d'un module comme l'id d'un ModuleRef auquel le client accède dans une demande directe distincte si l'élément Submenu est développé par l'utilisateur. Le format de l'élément de menu généré par ce biais est {"type":"Submenu", "id" : "moduleRef:", ... }. Le code du client adresse une demande au serveur à l'aide de cet ID qui est une variante de la demande de menu normale : ?uri=menu:moduleRef:". Le code de fournisseur de flux gère cette demande en démarrant le module nommé comme s'il s'agissait d'un fichier de définition de flux de menus contenant un ModuleRef avec cet ID.
moduleArgs Chaîne, sous forme d'ensemble de paramètres de requête de demande HTTP, sans perluète de début (le fournisseur de flux de menu ajoute une perluète au début). S'il existe plusieurs paramètres de requête, insérez une perluète entre chaque paramètre, après le premier paramètre. Exemple :
foo=bar&foo2=bar2&... 
Facultatif pour Submenu mais applicable uniquement à Submenu. Si ce membre est présent avec un membre moduleId, l'URI généré par le fournisseur de flux de menu pour l'entrée Submenu dans le flux ressemble à {"type" : "Submenu", "id" : "moduleRef:moduleId_value&moduleArgs_value", ... }. S'il est présent avec un ID dans le sous-menu, l'URI s'apparente à l'exemple précédent, mais sans le préfixe moduleRef: pour l'ID et les arguments.
markupId Chaîne arbitraire, utilisée pour créer un ID dans la balise html qui définit l'élément de menu. Facultatif. Utile uniquement pour les entrées de menu DynamicMenuItem et StaticMenuItem. La substitution de variable est prise en charge pour cet objet, de sorte que le ${windowID} peut être utilisé pour rendre uniques les instances d'un ID pour chaque portlet lors de l'affichage.

Ecriture d'un nouveau fichier de définition de menu pour un thème modularisé

Vous pouvez écrire un nouveau fichier de définition de menu pour un nouveau thème à l'aide du fournisseur de flux côté serveur et du code JavaScript côté client. Si vous copiez l'exemple de thème prêt à l'emploi et le modifiez pour générer un nouveau thème personnalisé, vous pouvez utiliser les mêmes fichiers de menu JSON ou les modifier, si nécessaire. Si aucune nouvelle fonction côté client n'est référencée à partir d'éléments de menu, ces nouvelles fonctions JavaScript doivent être créées et référencées.

Le fournisseur de flux de menu JSON recherche les fichiers de définition de menu JSON dans un répertoire menuDefinitions sous la racine de thème dans WebDAV.

Utilisez comme exemples les fichiers existants de définitions de menu et des outils tels que jsonlint pour prévalider la syntaxe JSON.

La syntaxe JSON est restrictive pour les fichiers de définition de menu, sauf que les commentaires sont autorisées.

Lors du débogage, utilisez la chaîne de trace com.ibm.wps.jsonmenu.*=all sur le serveur.

Menus étendus et construits dynamiquement

Depuis HCL Portal 8.0.0.1, il est possible d'ajouter dynamiquement des éléments de menu à un fichier de définition de menu. Vous pouvez utiliser cette fonction pour étendre un fichier de définition de menu "statique" existant, tel que les fichiers existants dans l'exemple de thème, dans le dossier menuDefinitions de WebDAV. Vous pouvez également l'utiliser pour construire dynamiquement un menu sans fichier de menu statique existant.

Souvenez-vous que dans l'URI de demande d'un menu, le paramètre de requête commence par "?uri=menu:menu name". Ce nom de menu est traité comme un nom de fichier par l'infrastructure de menus, et nous recherchons ce fichier dans "l'emplacement de base" des ressources de ce thème, tel qu'il est fourni par la propriété de métadonnées du thème com.ibm.portal.theme.template.ref. Dans la définition de menu, l'entrée "type":"ModuleRef" peut faire référence à un module d'optimisation de thème qui contient une contribution menu, contenant elle-même une sous-contribution JSON. La sous-contribution JSON comporte une URL pointant vers le code JSON même. Le code JSON, extrait de cette URL de sous-contribution, remplace dans le flux de menu l'entrée "type":"ModuleRef" du fichier.

Depuis HCL Portal 8.0.0.1, cette sous-contribution JSON peut également être étiquetée par un qualificateur ref-id. La valeur de ce qualificateur est une chaîne. A la fin du traitement du fichier de définition de menu, l'infrastructure de menu ajoute une étape. Elle recherche la page en cours dans toutes les sous-contributions JSON trouvées dans les modules de thème du profil, où la page est indiquée par le paramètre navID dans la demande de menu. Si l'une des balises ref-id provenant de ces sous-contributions correspond au nom du menu demandé qui est en cours de traitement, le code JSON de ces sous-contributions est dynamiquement ajouté à la fin du flux de menus, exactement comme s'il existait une entrée "type":"ModuleRef" désignant spécifiquement ce module.

Cette infrastructure de menus permet l'extension dynamique des contenus de menu avec de nouveaux éléments de menu par la création de modules de thème ou de sous-contributions, et par la mise à jour du profil, plutôt que d'avoir à mettre à jour les fichiers de définition de menu.

En outre, cette fonction peut être utilisée pour construire dynamiquement un menu sans créer de fichier de définition de menu. Si la demande de menu entrante contient un nom de menu qui n'existe pas, l'infrastructure de menus traite désormais cela comme si elle désignait un fichier de définition de menu contenant la syntaxe de menu minimale pour une matrice vide, "[ ]". Le menu est alors créé à l'aide des seules sous-contributions JSON à partir des modules qui sont indiqués dans le profil pour la page en cours où le qualificateur ref-id correspond au nom de menu demandé, même s'il indique un fichier qui n'existe pas.
Important : L'ordre des éléments ajoutés dynamiquement à un menu n'est pas contrôlé ni garanti en aucune manière. Bien que dans le tri, l'ordre était cohérent entre les redémarrages du serveur sur le même système, il est incohérent sur différents systèmes d'exploitation. Notamment entre les JVM IBM® et celles qui ne proviennent pas d'IBM®. S'il est nécessaire de contrôler strictement l'ordre des options de menu, utilisez l'entrée explicite "type":"ModuleRef" dans un fichier de définition de menu pour insérer explicitement l'option de menu au lieu d'utiliser le mécanisme de contribution dynamique.

Pour plus d'informations sur la construction de modules d'optimisation de thème qui incluent la sous-contribution JSON, voir Ajout d'un élément de menu avec un module.

Contrôle de la durée de vie du cache d'un flux de menu JSON

Dans HCL Portal versions 8.0.0.1 et ultérieures, le canevas de menu JSON accepte une ou plusieurs propriétés WP ConfigService au format "jsonmenu.cache.time.<menu name>" où la valeur est la durée en cache, exprimée en secondes. Cette valeur doit être supérieure ou égale à 0. Une valeur 0 indique que le menu n'est pas mis en mémoire cache.

Les valeurs <menu name> provenant de ces paramètres WP ConfigService sont mises en correspondance avec la valeur provenant du paramètre de requête "?uri=menu:<menu name>" sur la demande entrante d'un menu. La comparaison des noms de menu entre WP ConfigService et la demande reçue pour un menu est sensible à la casse.