Groupe 1A (socle)

Date de création : 05 juillet 2005
Dernière modification :
Diffusion : Esup-Portail

Canal des préférences

L'ajout d'un item dans le menu

Dans cette partie, nous étudierons l'exemple de l'item : "Information personnel pour un membre du personnel"

Pré-requis de l'éxemple

L'action "default" permet d'accèder à un menu.

Le groupe"local.121" est déclaré dans le canal :

<groupmapping>
  <group localname="PERS" uportalid="local.121"/>
</groupmapping>

Déclaration des actions dans le fichier de configuration

Comme précisé dans la partie de configuration, il faut entrer le groupe d'actions MAG correspond au nouvel item du menu.
Nous allons donc retrouver les 3 actions MAG : visuInfoPers, infoPers, validInfoPers.
Chacune va avoir :

Les "ssltitle" sont différents et, par soucis de simplicité, nous allons mettre "visu" pour "visuInfoPers", "main" pour "infoPers", "valid" pour "validInfoPers".

Nous allons autoriser l'accès à ces 3 actions uniquement aux membres du groupe "PERS" (nom local du groupe "pags.TousPers"). Donc à chaque action il faut positionner le paramètre "plug.esup.restrictedAction" de cette manière :

<param name="plug.esup.restrictedAction">
	<value>PERS</value>
</param>

Voici le résultat obtenu une fois les actions déclarées :

<action name="visuInfoPers"
  classname="org.esupportail.portal.channels.CPref.actions.InfoPers"
  ssltitle="visu"
  sslfile="infoPers.ssl"
  rendertype="ssl"
  log="info">
  <param name="plug.esup.restrictedAction">
    <value>PERS</value>
  </param>
</action>
<action name="infoPers" classname="org.esupportail.portal.channels.CPref.actions.InfoPers" ssltitle="main" sslfile="infoPers.ssl" rendertype="ssl" log="info"> <param name="plug.esup.restrictedAction"> <value>PERS</value> </param> </action>
<action name="validInfoPers" classname="org.esupportail.portal.channels.CPref.actions.InfoPers" ssltitle="valid" sslfile="infoPers.ssl" rendertype="ssl" log="info"> <param name="plug.esup.restrictedAction"> <value>PERS</value> </param> </action>

Déclaration des attributs LDAP dans le fichier de configuration

Chaque attribut LDAP utilisé dans l'affichage ou dans l'écriture doit être déclaré dans le fichier de configuration. Dans notre exemple nous avons besoin du "uid", "sn" ... ces champs sont accessibles en "read".

<attribut ldapName="uid" access="read" />
<attribut ldapName="sn" access="read" />
<attribut ldapName="givenname" access="read" />
<attribut ldapName="mail" access="read" />

Nous allons laisser la possibilité à l'utilisateur de modifier les champs "telephonenumber", "facsimiletelephonenumber". Ces champs sont accessibles en "write".

<attribut ldapName="telephonenumber" access="write" />
<attribut ldapName="facsimiletelephonenumber" access="write" />

Sur les champs modifiables nous allons spécifier un format de validité. Ces formats vont permettre de vérifier la saisie et de formater la saisie avant l'écriture dans LDAP.

<attribut ldapName="telephonenumber" access="write" format="org.esupportail.portal.channels.CModifPerso.formats.TelephoneNumber" />
<attribut ldapName="facsimiletelephonenumber" access="write" format="org.esupportail.portal.channels.CModifPerso.formats.TelephoneNumber" />
Remarque

Création des formats spécifiques

Dans la méthode check(), nous allons spécifier par des expressions régulières les formats de téléphones autorisés.

Les valeurs acceptées doivent être de la sorte :

sinon, la valeur sera refusée.

public boolean check(String value) {
  if ( (value.matches("^\\+\\d\\d \\d( \\d\\d){4}$"))
     || (value.matches("^\\+\\d{11}$"))
     || (value.matches("^(\\d\\d[\\./ \\-,]){4}\\d\\d$"))
     || (value.matches("^\\d{10}$"))
     ){
     return true;
  }
  return false;
  }

Par contre dans LDAP le format de téléphone est "^\\+\\d\\d \\d( \\d\\d){4}$" (ex "+33 3 83 39 63 71"). Il faut donc transformer certaines saisies. La méthode transforme va donc exécuter une transformation de chaine pour chacun des cas acceptés par la méthode "check".

 public String transform(String before) {
  if (before.matches("^\\+\\d\\d \\d( \\d\\d){4}$")){
    return before;
  }
  
if (before.matches("^\\+\\d{11}$")){ StringBuffer newValue = new StringBuffer(""); newValue.append(before.charAt(0)); newValue.append(before.charAt(1)); newValue.append(before.charAt(2)); newValue.append(" "); newValue.append(before.charAt(3)); newValue.append(" "); newValue.append(before.charAt(4)); newValue.append(before.charAt(5)); newValue.append(" "); newValue.append(before.charAt(6)); newValue.append(before.charAt(7)); newValue.append(" "); newValue.append(before.charAt(8)); newValue.append(before.charAt(9)); newValue.append(" "); newValue.append(before.charAt(10)); newValue.append(before.charAt(12)); return newValue.toString(); }
if (before.matches("^(\\d\\d[\\./ \\-,]){4}\\d\\d$")){ StringBuffer newValue = new StringBuffer("+33"); newValue.append(" "); newValue.append(before.charAt(1)); newValue.append(" "); newValue.append(before.charAt(3)); newValue.append(before.charAt(4)); newValue.append(" "); newValue.append(before.charAt(6)); newValue.append(before.charAt(7)); newValue.append(" "); newValue.append(before.charAt(9)); newValue.append(before.charAt(10)); newValue.append(" "); newValue.append(before.charAt(12)); newValue.append(before.charAt(13)); return newValue.toString(); }
if (before.matches("^\\d{10}$")){ StringBuffer newValue = new StringBuffer("+33"); newValue.append(" "); newValue.append(before.charAt(1)); newValue.append(" "); newValue.append(before.charAt(2)); newValue.append(before.charAt(3)); newValue.append(" "); newValue.append(before.charAt(4)); newValue.append(before.charAt(5)); newValue.append(" "); newValue.append(before.charAt(6)); newValue.append(before.charAt(7)); newValue.append(" "); newValue.append(before.charAt(8)); newValue.append(before.charAt(9)); return newValue.toString(); }
return before;
}

Création de la classe correspondant aux actions MAG

Nous avons dit dans le fichier de configuration que nos actions se réfèrent à la classe : org.esupportail.portal.channels.CPref.actions.InfoPers.
Nous allons donc décrire cette classe.

Une classe correspondant à une action MAG étant normalement "SubChannel". Ce n'est pas directement le cas ici.
Certaines actions MAG sont soumises à authentification. C'est pourquoi une classe abstraite "SecureAction" permet de demander le mot de passe utilisateur par l'intermédiare d'un plugin. Cette classe étend "SubChannel".

Dans notre cas, il faut voir que nous avons un ordre à respecter entre nos 3 actions. C'est la classe abstraite "UpdateAction" qui permet cela. Cette classe étend "SecureAction".

Donc, toutes les devons écrire étendent "Update action". Par convention dans ce canal, les classes correspondantes aux actions sont dans le package "org.esupportail.portal.channels.CPref.actions".

Les méthodes obligatoires sont :

Certaines méthodes ont des comportements par défaut, mais vous pouvez les redéfinir :

Remarque :

Création des feuilles xsl

Les feuilles de style des actions sont dans le répertoire des stylesheets\org\esupportail\portal\channels\CPref\actions.

Créez une feuille ssl, dans notre exemple infoPers.ssl, qui répartie selon les titres et les pages xsl respectives.

<?xml version="1.0"?>
<?xml-stylesheet title="visu" href="infoPersVisu.xsl" type="text/xsl" media="explorer" default="true"?>
<?xml-stylesheet title="main" href="infoPers.xsl" type="text/xsl" media="explorer" default="true"?>
<?xml-stylesheet title="valid" href="../valid.xsl" type="text/xsl" media="explorer" default="true"?>
<document>
</document>

Décrivons la page "infoPers.xsl" (la feuille de saisie).

<?xml version="1.0"?>
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Il faut ensuite importer "errorBar.xsl" qui va permettre d'afficher un message en cas d'erreur de saisie.
  <xsl:import href="errorBar.xsl" />

Les paramètres recus par la feuille sont :

  <xsl:param name="baseActionURL">donne par le code</xsl:param>
  <xsl:param name="error">donne par le code</xsl:param>

Détaillons le formulaire ...

  <xsl:template match="/xml">
  <xsl:call-template name="errorBar"/>
  <form name="coord" action="{$baseActionURL}" method="post">

L'action MAG suivante

  <input type="hidden" name="action" value="validInfoPers"/>

La récupération des informations.
Elles se trouvent sous le tag "INFO" et ont comme nom le nom de l'attribut LDAP.

  <table>
    <tr><td><font class="uportal-channel-text">Login</font></td><td><xsl:value-of select="INFOS/@uid"/></td></tr>
    <tr><td><font class="uportal-channel-text">Nom</font></td><td><xsl:value-of select="INFOS/@sn"/></td></tr>
    <tr><td><font class="uportal-channel-text">Prénom</font></td><td><xsl:value-of select="INFOS/@givenname"/></td></tr>

Les champs modifiables peuvent être mal saisis. Il faut donc tester ce cas. Si un champ est mal saisie, alors il y a sous le tag "INFO" un attribut "error_%nomLogiqueDeLAttribut".

<tr><td>
    <xsl:choose>
      <xsl:when test="INFOS/@error_telephonenumber='1'"><font class="uportal-channel-error">Téléphone</font></xsl:when >
      <xsl:otherwise><font class="uportal-channel-text">Téléphone</font></xsl:otherwise>
    </xsl:choose>
    </td>
    <td><input class="uportal-input-text" type="text" name="telephonenumber" value="{INFOS/@telephonenumber}"/></td></tr>
    <tr><td>
    <xsl:choose>
      <xsl:when test="INFOS/@error_facsimiletelephonenumber='1'"><font class="uportal-channel-error">Fax</font></xsl:when>
      <xsl:otherwise><font class="uportal-channel-text">Fax</font></xsl:otherwise>
    </xsl:choose>
    </td><td><input class="uportal-input-text" type="text" name="facsimiletelephonenumber" value="{INFOS/@facsimiletelephonenumber}"/></td></tr>
    <tr><td colspan="2">&#160;</td></tr>

Pour envoyer le formulaire il faut un bouton type "submit". Pour annuler et revenir à l'action par défaut, il faut un bouton s'appellant "Cancel". Si un champs s'appelant "Cancel" est recu par le canal, il redirigé automatiquement vers l'action "default".

     <tr><td><input class="uportal-button" type="submit" value="Valider" name="Submit"/></td>
    <td><input class="uportal-button" type="submit" value="Retour à l'accueil" name="Cancel"/></td></tr>
  </table>
  </form>
  </xsl:template>
  </xsl:stylesheet>

retour au sommaire