Le DLM (distributed layout management ou gestion de profils répartis)
Le DLM (distributed layout management) est un mode de fonctionnement des environnements utilisateur qui utilise des fragments de profils répartis dans des utilisateurs modèles.
Principe
On référence dans un fichier XML (dlm.xml) des fragments de profils que les utilisateurs peuvent se voir attribuer.
Chaque fragment appartient a un utilisateur particulier qui sert de modèle : le layout owner (LO). Les propriétaires des fragments sont des utilisateurs du portail et sont automatiquement créés dans la base (table UP_USER) lors de la lecture de dlm.xml au démarrage du portail. Par convention on les nomme en les suffixant par "-lo" (comme layout owner) pour les distinguer des utilisateurs réguliers.
Lorsqu'un utilisateur se connecte :
- le portail parcourt le fichier dlm.xml pour savoir quels fragments lui attribuer (en fonction des règles d'audience indiquées dans la balise <dlm/audience>)
- ensuite il va voir le détail du profil de chaque propriétaire (layout owner) concerné (voir gestion des fragments) et attribue la partie de profil (onglet, groupe d'onglets) a l'utilisateur connecté.
- les fragments sont classés et affichés selon l'ordre indiqué dans l'attribut precedence
- pour finir le portail applique les personnalisations faites par l'utilisateur lors de ses connexions précédentes (déplacement, modification, suppression de fragment, ajouts d'onglets et de canaux...)
Le fichier dlm.xml
Il se trouve dans le dossier properties du portail. On définit dans ce fichier la position des fragments et leur visibilité pour les utilisateurs. Le contenu des fragments (canaux) est précisé ailleurs, dans les fichiers d'import de fragments ou par l'interface graphique (voir gestion des fragments)
<?xml version="1.0"?> <!-- $Header$ --> <managedLayoutFragments xmlns:dlm="http://org.jasig.portal.layout.dlm.config"> <dlm:property name='defaultLayoutOwner' value='fragmentTemplate'/> <!-- <dlm:property name='layoutDecorator' value='someClass'/> --> <!-- Controls clearing of dlm fragment cache. This allows changes made to layout owners to be reflected once the cache has been updated. Specified in minutes. --> <dlm:property name='org.jasig.portal.layout.dlm.RDBMDistributedLayoutStore.fragment_cache_refresh' value="5"/> <dlm:fragment name='Guests' ownerID='guest-lo' precedence='100'> <dlm:audience evaluatorFactory='org.jasig.portal.layout.dlm.providers.GuestUserEvaluatorFactory'/> </dlm:fragment> <dlm:fragment name='Scolarite' ownerID='scolarite-lo' precedence='50'> <dlm:audience evaluatorFactory='org.jasig.portal.layout.dlm.providers.GroupMembershipEvaluatorFactory'> <paren mode="AND"> <attribute mode='deepMemberOf' name='LDAP Tous les etudiants'/> </paren> </dlm:audience> </dlm:fragment> <dlm:fragment name='Personnels' ownerID='personnel-lo' precedence='50'> <dlm:audience evaluatorFactory='org.jasig.portal.layout.dlm.providers.GroupMembershipEvaluatorFactory'> <paren mode="AND"> <attribute mode='deepMemberOf' name='LDAP Tout le personnel'/> </paren> </dlm:audience> <dlm:fragment name='Admin' ownerID='admin-lo' precedence='10'> <dlm:audience evaluatorFactory='org.jasig.portal.layout.dlm.providers.PersonEvaluatorFactory'> <paren mode="AND"> <attribute name="username" mode='equals' value='admin'/> </paren> </dlm:audience> </dlm:fragment> </dlm:fragment></managedLayoutFragments>
On retrouve dans ce fichier :
- L'utilisateur par défaut (dont tout le monde hérite) : defaultLayoutOwner
- le temps pendant lequel ce fichier est caché : org.jasig.portal.layout.dlm.RDBMDistributedLayoutStore.fragment_cache_refresh
- tous les fragments <dlm:fragment> [...] </dlm:fragment>
Modification du fichier dlm.xml
Copier le fichier update/uPortal/uportal-impl/src/main/resources/properties/dlm.xml dans custom/uPortal/uportal-impl/src/main/resources/properties et travailler dans le répertoire custom
Définition d'un fragment
<dlm:fragment name='Scolarite' ownerID='scolarite-lo' precedence='50'> <dlm:audience evaluatorFactory='org.jasig.portal.layout.dlm.providers.GroupMembershipEvaluatorFactory'> <paren mode="AND"> <attribute mode='deepMemberOf' name='LDAP Tous les etudiants'/> </paren> </dlm:audience> </dlm:fragment>
On retrouve :
nom [name]
Uniquement utilisé dans ce fichier pour les distinguer
propriétaire [ownerID]
C'est le layout owner (par convention on suffixe le login de ces utilisateurs par -lo pour les distinguer des utilisateurs classiques).
emplacement de gauche a droite [precedence]
Détermine la place du fragment de gauche a droite par rapport aux autres.
C'est un numérique ; plus il est grand plus il se trouve a gauche.
Les precedences sont évaluées entre différents fragments.
<dlm:fragment name='Testing' ownerID='test-lo' precedence='90'> ... <dlm:fragment name='Other' ownerID='other-lo' precedence='100'>
Dans ce cas on retrouve dans l'ordre : Other puis Testing.
Les fragments sont des groupes d'onglets ; si on prend l'exemple de 2 fragments contenant chacun 2 onglets, on peut positionner le fragment complet, pas les onglets.
Il n'est donc pas possible d'intercaler un onglet d'un fragment puis un onglet d'un autre et ainsi de suite.
En cas de conflit c'est l'ordre de définition dans le fichier dlm.xml qui tranchera.
ciblage [audience]
Va déterminer à qui doit être attribué le fragment.
On paramètre une classe java qui va faire l'évaluation [evaluatorFactory].
On dispose de plusieurs classes java de base dans le portail :
- AllUsersEvaluatorFactory : évalue tous les utilisateurs
- GroupMembershipEvaluatorFactory évalue l'appartenance a un groupe
- GuestUserEvaluatorFactory : évalue l'utilisateur guest
- PersonEvaluatorFactory : évalue sur des attributs uPortal
On peut aussi faire des combinaisons a base de directive parent AND, OR, NOT.
La partie mode d'égalité dépend de la classe evaluatorFactory :
- PersonEvaluatorFactory
- equals
- exists
- contains
- startsWith
- endsWith
- GroupMembershipEvaluatorFactory
- memberOf (Membre direct)
- deepMemberOf (Membre Recusif)
Exemple
Le fichier dlm.xml ci-dessus définit quatre fragments de profils, affichés de gauche à droite comme suit :
- Guest (propriétaire : guest-lo) : Visible uniquement si l'utilisateur n'est pas authentifié
- Scolarite (propriétaire : scolarite-lo) : Visible par les membres du groupe "LDAP Tous les etudiants" (voir Groupes )
- Personnels (propriétaire : personnel-lo) : Visible par les membres du groupe "LDAP Tous les personnels"
- Admin (propriétaire : admin-lo) : Visible par l'utilisateur dont le nom est "admin"
Le contenu détaillé de chaque fragment est défini dans le profil de son propriétaire : voir le chapitre suivant
Gestion des fragments
Un fragment consiste en un ou des onglets, contenant un ou des canaux disposés en colonnes.
Vous pouvez gérer les fragments de deux manières :
- Créer un fichier xml (contenant le détail du fragment) pour chaque utilisateur propriétaire et importer ce fichier .
- Se connecter en tant qu'administrateur du portail (ou avec des droits suffisants) et configurer les fragments avec le canal fragment administrator.
Utilisation de fichiers XML
Fichier d'import de fragment
package ESUP :
Si vous voulez importer automatiquement les fragments lors de l'initialisation de la base (ant db.init, voir Installation ), vous devez stocker les fichiers dans le répertoire :
custom/uPortal/uportal-impl/src/main/resources/properties/db/mini/fragment-layout
Il y a un fichier par fragment. Par convention, on donne au fichier le nom de son propriétaire (guest-lo pour le propriétaire guest-lo), l'extension du fichier est .fragment-layout
<layout script="classpath://org/jasig/portal/io/import-layout_v3-0.crn" username="guest-lo"> <root unremovable="Y" immutable="N" hidden="N" name="Root folder"> <header unremovable="Y" immutable="Y" hidden="N" name="Header folder"> <channel unremovable="" immutable="" hidden="" fname="header"/> <channel unremovable="" immutable="" hidden="" fname="portal/login/general"/> <channel unremovable="" immutable="" hidden="" fname="session-locales-selector"/> <channel unremovable="" immutable="" hidden="" fname="fragment-admin-exit"/> </header> <footer unremovable="N" immutable="N" hidden="N" name="Footer folder"> <channel unremovable="" immutable="" hidden="" fname="footer"/> </footer> <tab unremovable="" immutable="N" hidden="N" name="ESUP Portail"> <column unremovable="" immutable="N" hidden="N" name="Column 1"> <structure-attribute type="folder"> <name>width</name> <value>100%</value> </structure-attribute> <channel unremovable="" immutable="" hidden="" fname="esup-portail.org"/> </column> </tab> </root> <profile name="HTML browser profile"> <description>A sample profile for common web browsers</description> <structure name="DLM Tabs and columns"/> <theme name="DLM XHTML"/> </profile> </layout>
On retrouve dans ce fichier la structure complète de l'environnement utilisateur :
layout
Element racine, indique le nom de l'utilisateur propriétaire du fragment (username)
root
header
Contenu (canaux) de l'en-tête de la page
footer
Contenu (canaux)du bas de page
tab
Un onglet :
- name : Nom de l'onglet affiché à l'écran
- mutable : [true|false] est-il déplaçable ?
- hidden : [true|false] est-il affiché ?
- removable : [true|false] est-il supprimable ?
column
Contient des canaux, qui seront affichés les uns en dessous des autres. Si plusieurs colonnes sont définies pour un onglet, elles seront affichées côte à côte.
- width : largeur de la colonne en pourcentage. pris en compte uniquement s'il y a plusieurs colonnes, sinon 100%
channel
Un canal affiché dans une colonne
- fname : nom fonctionnel (functional name) du canal. voir la partie Publication de canaux
profile
Le profil qui peut être utilisé pour afficher ce fragment, en fonction du navigateur du client (navigateur html, mobile, etc.). Un élément structre par type de client possible
- structure : rendu général
- theme : fichiers de transformation xsl utilisés (structure) et habillage (skin) par défaut
Import d'un fichier de fragment
L'import se fait par la tâche ant :
ant db.import -Ddir=<répertoire du fichier> -Dpattern=<nom ou pattern regex du fichier>
NB :En base, les fragments sont stockés dans les tables UP_LAYOUT_STRUCT et UP_LAYOUT_PARAM
Opération inverse : Exportation de l'environnement de guest-lo (utile par exemple si on a créé/modifié l'environnement de guest-lo avec l'interface graphique) :
ant db.export -Ddir=<répertoire où exporter le fichier> -DsysId=guest-lo
Exportation de tous les fragments :
ant db.export -Ddir= -Dtype=all-fragment-definitions
Exemple
Le fichier de fragment ci-dessus appartient à l'utilisateur guest-lo
- Il contient un onglet (tab) de libellé "ESUP Portail", qui n'est ni supprimable ni déplaçable par l'utilisateur
- Dans cet onglet, les canaux sont disposés en une seule colonne (column)
- Cette colonne contient un seul canal dont le nom fonctionnel est esup-portail.org
- Ce fragment est disponible pour les navigateurs html (profile)
Utilisation de l'interface graphique
Pour modifier un fragment avec l'interface graphique, il faut se connecter sous le nom d'un utilisateur ayant le droit d'utiliser le canal fragment administrator
Dans le canal fragment administrator, sélectionner le fragment puis effectuer les modifications voulues avec l'interface graphique :
Vous pouvez comme tout utilisateur ajouter des onglets, des colonnes et des canaux.
Ensuite si vous voulez gérer des restrictions, allez dans le canal préférence (Menu en haut a droite "Préférence")
En cliquant sur un onglet vous pourrez indiquer si on peut :
- Déplacer l'onglet
- Editer les propriétés
- Ajouter des colonnes
- Supprimer l'onglet
En cliquant sur une colonne vous pourrez indiquer si on peut :
- Déplacer la colonne
- Editer les propriétés
- Ajouter des canaux
- Supprimer la colonne
En cliquant sur un canal vous pourrez indiquer si on peut :
- Déplacer le canal
- Supprimer le canal
Toutes les modifications seront répercutées sur le layout, donc sur les utilisateurs autorisés à voir ce fragment.