Format d’exportation natif
L’exportation des listes de comptes des professeurs fournit un fichier texte dont les données sont extrêmement malcommodes à manipuler 1. En effet, la présentation ayant primé sur la portabilité, le fichier se sert de l’espace, du retour à la ligne, du tiret de soulignement (underscore) et du point de manière non sémantique. Ainsi, les données d’un même compte sont réparties sur plusieurs lignes et les champs sont séparés par un nombre variable d’espaces et de points afin qu’il soient alignés verticalement. Les tirets de soulignement séparent les comptes.
Voici un exemple d’un tel fichier 2 :
______________________________________________________________
Publication de la liste des professeurs
______________________________________________________________
NOM.......... hugo LOG-IN....... hugo2
PRENOM....... victor MOT DE PASSE. 4gted
DOSSIER...... <profs\hugo.victor>
______________________________________________________________
NOM.......... barthes LOG-IN....... barthes
PRENOM....... roland MOT DE PASSE. re4hk
DOSSIER...... <profs\barthes.roland>
______________________________________________________________
Format CSV attendu
Afin d’être aisément traitables, des données exportées devraient répondre au cahier des charges suivant :
─ une seule ligne par compte ;
─ séparation systématique des champs par un signe unique ;
─ ordre des champs immuable.
Au final, à partir des données ci-dessus, il faudrait obtenir le format suivant (l’ordre des champs important peu et le chemin vers le dossier de l’utilisateur n’étant pas intéressant puisque peu d’applications en ont besoin) :
prenom;nom;login;mot_de_passesoient :
victor;hugo;hugo2;4gted;
roland;barthes;barthes;re4hk;
Méthode de traitement en PHP
Récupération des champs
En supposant un formulaire (de type textarea) passant par POST les données copicollées depuis le fichier d’exportation d’Adele2K dans une variable $_POST['liste_comptes'], le script suivant permet d’isoler les champs utiles 3 :
$liste_comptes = $_POST['liste_comptes'];
/* récupérer le login et l'intégrer à un tableau $liste_logins */
preg_match_all('/LOG-IN\.*?\s(.*)/', $liste_comptes, $liste_logins);
/* récupérer le mot de passe et l'intégrer à un tableau $liste_pass */
preg_match_all('/MOT\sDE\sPASSE\.*?\s(.*)/', $liste_comptes, $liste_pass);
/* récupérer le nom et l'intégrer à un tableau $liste_patronymes */
preg_match_all('/NOM\.*?\s(.*?)LOG-IN/', $liste_comptes, $liste_patronymes);
/* récupérer le prénom et l'intégrer à un tableau $liste_patronymes */
preg_match_all('/PRENOM\.*?\s(.*?)MOT\sDE\sPASSE/', $liste_comptes, $liste_prenoms);
/* parcours des tableaux et création de lignes contenant les données des champs */
for($i=0; $i<count($liste_logins[1]); $i++){
/* en cas de champ vide, ne pas afficher le compte */
if(
$liste_logins[1][$i] != "" &&
$liste_pass[1][$i] != "" &&
$liste_patronymes[1][$i] != "" &&
$liste_prenoms[1][$i] != ""
){
/* afficher ligne par ligne en supprimant les espaces inutiles éventuellement
présentes. Les lignes sont séparées par un retour à la ligne, qui ne s'affichera
pas tel quel en HTML */
echo(
trim($liste_logins[1][$i]).";"
.trim($liste_prenoms[1][$i]).";"
.trim($liste_patronymes[1][$i]).";"
.trim($liste_pass[1][$i]).";\n"
);
}
}
Mise en forme des champs prénom et nom
Si l’on souhaite utiliser les champs prénom et nom, il est préférable de les formater quelque peu : en effet, ils sont pour l’instant en bas-de-casse. On peut améliorer quelque peu la situation (mais vu que l’exportation d’Adele2K ne prend pas en compte les éventuels diacritiques, on ne fera pas de miracles) en mettant au moins les majuscules nécessaires. Dans ce cas, on peut utiliser la fonction suivante :
function mettre_en_forme($donnee) {
/* on met tout en bas-de-casse */
$donnee = strtolower($donnee);
/* on met en capitale la première lettre de chaque mot pour obtenir des majuscules et on traite :
d'éventuels noms dotés d'une apostrophe interne */
$donnee = join("'", array_map('ucwords', explode("'", $donnee)));
/* les noms composés */
$donnee = join("-", array_map('ucwords', explode("-", $donnee)));
/* le cas de la particule. Il n'est pas possible de distinguer entre la particule
<de> et <De> du néerlandais, du portugais ou de certains noms français */
$donnee = preg_replace('/De /', 'de ', $donnee);
return $donnee;
}Pour mettre en œuvre cela, il suffit d’appeler la fonction au sein de la boucle créant les lignes CSV :
echo(
trim($liste_logins[1][$i]).";"
.mettre_en_forme(trim($liste_prenoms[1][$i])).";"
.mettre_en_forme(trim($liste_patronymes[1][$i])).";"
.trim($liste_pass[1][$i]).";\n"
);Ainsi, avec les données suivantes :
______________________________________________________________
Publication de la liste des professeurs
______________________________________________________________
NOM.......... de saint-firmin LOG-IN....... desaintfirmin
PRENOM....... jacques MOT DE PASSE. as12r
DOSSIER...... <profs\desaintfirmin.jacques>
______________________________________________________________
NOM.......... broutinoux LOG-IN....... broutinoux
PRENOM....... marie-reine MOT DE PASSE. aqf5u
DOSSIER...... <profs\broutinoux.marie-reine>
______________________________________________________________
NOM.......... chrysostome LOG-IN....... chrysostome
PRENOM....... marcel MOT DE PASSE. er5io
DOSSIER...... <profs\chrysostome.marcel>
______________________________________________________________
NOM.......... renaulet-dandelion LOG-IN....... gertrude
PRENOM....... veronique MOT DE PASSE. hgr5j
DOSSIER...... <profs\renaulet-dandelion.gertrude>
______________________________________________________________
NOM.......... o'brian LOG-IN....... obrian
PRENOM....... claire MOT DE PASSE. hg8rt
DOSSIER...... <profs\obrian.claire>
______________________________________________________________on obtient :
desaintfirmin;Jacques;de Saint-Firmin;as12r;
broutinoux;Marie-Reine;Broutinoux;aqf5u;
chrysostome;Marcel;Chrysostome;er5io;
gertrude;Veronique;Renaulet-Dandelion;hgr5j;
obrian;Claire;O'Brian;hg8rt;et sans mise en forme :
desaintfirmin;jacques;de saint-firmin;as12r;
broutinoux;marie-reine;broutinoux;aqf5u;
chrysostome;marcel;chrysostome;er5io;
gertrude;veronique;renaulet-dandelion;hgr5j;
obrian;claire;o'brian;hg8rt;
Applications
Au collège, la synchronisation entre les comptes générés par Adele2K et le logiciel GLPI est assurée par un script de ce type, qui récupère les données des listes d’Adele2K et crée les comptes voulus dans la base de données MySQL de GLPI.
Collège de la petite Camargue

2.1.2 [16017]