Le DLM (ou fragments)
Le DLM (distributed layout management) est le nouveau mode de fonctionnement des environnements utilisateur (précédemment ALM - aggregated layout management-).
Principe
On définit dans un fichier XML (dlm.xml) le ciblage fragment <=> utilisateur.
Chaque fragment appartient a un utilisateur particulier : le Layout Owner (LO).
Lors de la connexion d'un utilisateur "normal" le portail regarde le fichier dlm.xml pour savoir quel fragment lui attribuer ; ensuite il va voir l'environnement de chaque propriétaire d'environnement (Layout Owner) concerné et attribue la partie d'environnement (onglet, groupe d'onglet) a l'utilisateur connecté.
Le fichier dml.xml
Il se trouve dans le dossier properties du portail.
<?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='20'> <dlm:audience evaluatorFactory='org.jasig.portal.layout.dlm.providers.GuestUserEvaluatorFactory'/> </dlm:fragment> <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 name='Default' ownerID='default-lo' precedence='10'> <dlm:audience evaluatorFactory='org.jasig.portal.layout.dlm.providers.GroupMembershipEvaluatorFactory'> <paren mode="AND"> <attribute mode='deepMemberOf' name='Etablissement'/> </paren> </dlm:audience> </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>
Détails d'un fragment
<dlm:fragment name='Default' ownerID='default-lo' precedence='10'> <dlm:audience evaluatorFactory='org.jasig.portal.layout.dlm.providers.GroupMembershipEvaluatorFactory'> <paren mode="AND"> <attribute mode='deepMemberOf' name='Etablissement'/> </paren> </dlm:audience> </dlm:fragment>
On retrouve :
nom [name]
Uniquement utilisé dans ce fichier pour les distinguer
propriétaite [ownerID]
C'est le layout owner (par convention on suffix le logins 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 : match tous les utilisateurs
- GroupMembershipEvaluatorFactory match l'appartenance a un groupe
- GuestUserEvaluatorFactory : match l'utilisateur guest
- PersonEvaluatorFactory : match 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)
Gestion des Layout Owner
Les Layout Owner sont des utilisateurs du portail. Ils sont automatiquement créés dans la base (table UP_USER) lors de la lecture de dlm.xml au démarrage du portail
Vous pouvez gérer ces environnements de 2 manières :
- Utilisation de fichiers XML contenant l'environnement de l'utilisateur puis importation/exportation via des tâches ANT.
- Connexion directement avec l'utilisateur et création de son environnement par l'interface web du portail.
Utilisation de fichiers XML
Fichier XML d'environnement
Les fichiers d'environnement sont stockés dans le portail/properties/layouts/[USER]-lo.xml
<?xml version="1.0" encoding="UTF-8"?> <layout user="guest-lo"> <root-folder> <folder mutable="True" removable="True" type="header"> <name>Header folder</name> <channel fName="header"/> <channel fName="portal/login/general"/> <channel fName="session-locales-selector"/> </folder> <folder mutable="True" removable="True" type="regular"> <name>Accueil</name> <folder mutable="True" removable="True" type="regular"> <name>Column</name> <channel fName="accueil-esup-portail"/> </folder> </folder> <folder mutable="True" removable="True" type="footer"> <name>Footer folder</name> <channel fName="footer"/> </folder> </root-folder> </layout>
On retrouve dans ce fichier la structure complète de l'environnement utilisateur :
le nom de l'utilisateur [user] : nom de l'utilisateur propriétaire du fragment
dossier racine [root-folder] : contient l'ensemble des folders
Un folder de premier niveau est un onglet, un folder de second niveau (folder/folder) est une colonne.
les onglets [folder]
- name : Nom qui s'affiche pour l'onglet
mutable : [true|false] est il déplaçable
removable : [true|false] est il supprimable
type : [header|regular|footer] : type de l'onglet (header et footer sont réservés par le portail)
Les colonnes [folder/folder] : idem onglets
- Les canaux contenus dans une colonne : le fName correspond au "functional name" utilisé lors de la publication du canal.
Import/Export ANT
Importation du fichier uPortal/properties/layouts/guest-lo.xml (appartenant a guest-lo) :
ant layout.import -Dusername=guest-lo
On peut aussi importer tous les environnements contenus dans le dossier layouts
ant layout.import -Dusername=all
Exportation de l'environnement de guest-lo dans uPortal/properties/layouts/guest-lo.xml
ant layout.export -Dusername=guest-lo
Utilisation de l'interface graphique
Pour modifier un layout avec l'interface graphique, il faut pouvoir se connecter sous le nom de l'utilisateur propriétaire. Il faut donc préalablement le créer dans la table servant à l'authentification locale :
ant user.add -Dusername=guest-lo
Puis indiquer son mot de passe. Ceci ajoute l'utilisateur dans la table UP_PERSON_DIR
Une fois l'utilisateur créé dans le portail vous pouvez vous connecter sous son nom. Attention il s'agit d'une authentification locale, le paramètre esup.db.auth de config.properties doit donc être égal à true. On devrait aussi pouvoir passer par une authentification distante (CAS => LDAP), mais je n'en voit pas l'intérêt.
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.