Les Cahiers du programmeur. PHP [2]. Ateliers Web professionnels avec PHP/
MySQL et JavaScript. Philippe Chaléat. Daniel Charnay. Avec la contribution de
...
Les Cahiers du programmeur
PHP [2]
Ateliers Web professionnels avec PHP/MySQL et JavaScript
Philippe Chaléat Daniel Charnay
Avec la contribution de Martine Chalmond
© Groupe Eyrolles, 2002 ISBN : 2-212-11089-8
atelier
E-mail et annuaire PHP JavaScript
10
Envoi d’e-mail par programme | e-mail automatique | e-mail assisté avec LDAP
SOMMAIRE
B Générer un e-mail B Utiliser un annuaire LDAP B Compléter automatiquement une adresse e-mail
B Utiliser un frame caché MOTS-CLÉS
B Envoi d’e-mail par programme B E-mail automatique B E-mail assisté avec LDAP B LDAP LANGAGES UTILISÉS
B JavaScript B PHP
© Eyrolles, 2002
F L’utilisation d’un courrier électronique généré par programme est souvent nécessaire. Une application, par exemple, alerte par e-mail l’administrateur lorsque quelqu’un tente d’accéder à une base de données sans en avoir les droits. Une autre enverra automatiquement un e-mail de confirmation lors d’une demande effectuée à l’aide d’un formulaire Web. Après un bref rappel de la méthode pour envoyer un e-mail depuis PHP, ce court chapitre aborde plus largement l’utilisation simultanée d’un annuaire dans le cadre d’envoi d’e-mails via un formulaire. On apprendra à utiliser le dialogue avec une application parallèle, via un canal « discret », le frame caché.
Les Cahiers du programmeur PHP/JavaScript (2)
Générer un e-mail en PHP Générer un e-mail depuis PHP est un véritable plaisir, et cela ne nécessite pas un chapitre car tout se résume à une seule ligne ! Il faut seulement se rappeler que la fonction s’appelle mail et qu’elle reçoit un minimum de paramètres, à savoir : à qui veut-on écrire ? (champ to), quel est le sujet du courrier ? (champ subject), le contenu du message et enfin qui en est l’expéditeur (champ from). Notons que ce dernier paramètre permet, outre de définir l’expéditeur, de spécifier aussi d’éventuelles copies (Cc) ou copies cachées (Bcc). Le petit exemple cidessous, se passe de commentaire ; le seul que nous pourrions faire est de conseiller la lecture du livre auquel il est fait allusion !
La fonctionnalité que nous allons programmer est une copie de la complétion automatique de l’adresse dans un agent de courrier électronique, Netscape par exemple, qui, correctement configuré, utilise en conjonction le carnet d’adresses local et l’annuaire LDAP pour tenter de résoudre l’adresse destinataire, dès la frappe des premiers caractères.
Utilisons LDAP
Figure 10–1 On voit sur la figure 10–1 que, dès la frappe de la chaîne de caractères « gains », le système a détecté deux possibilités et que, sauf à continuer la saisie ou à sélectionner un autre choix, il complètera automatiquement le champ par la première occurrence trouvée (gainsbourg).
98
Prenons maintenant l’exemple d’une application d’entreprise, où, depuis un formulaire Web, on puisse soumettre une note à n’importe quel employé. On imagine que l’usage d’un formulaire Web a été préféré à celui du courrier électronique pour permettre le stockage des notes dans une base de données. Supposons aussi que cette entreprise moderne dispose d’un annuaire LDAP. Le formulaire va donc proposer, à un moment, de saisir l’adresse e-mail du destinataire de la note. Évidemment, on connaît toujours le nom patronymique d’une personne mais moins souvent son adresse e-mail. Je connais même des gens snobs, ou tellement célèbres, dont l’adresse e-mail n’est composée que de leurs initiales, voire dont l’adresse e-mail n’a aucun rapport avec leur nom ! Nous nous proposons donc d’assister la saisie de l’adresse e-mail, en exécutant une recherche dans un annuaire LDAP à partir de la frappe de quelques caractères du nom du destinataire.
© Eyrolles, 2002
Comment va-t-on, dans une page HTML, réaliser un mécanisme ayant un comportement analogue à celui d’un agent de courrier électronique ? On va nécessairement devoir appeler, depuis le formulaire en cours sur le poste client, un programme PHP qui dialoguera avec le serveur LDAP. Or, la finalité de ce formulaire n’est pas d’appeler un annuaire ! Pourtant, si on appelle cet annuaire, la réponse qu’il va donner effacera le formulaire en cours de saisie… Ce n’est pas ce que l’on veut ! La cible du formulaire est une action sur le serveur, la complétion de l’adresse e-mail n’est qu’une action secondaire qui ne doit en aucun cas effacer le travail en cours. La figure 10–2 illustre le mécanisme qui va être mis en œuvre.
Il est évident que, dans le schéma de l’annuaire LDAP considéré, on trouve, associé au nom d’une personne, son adresse de courrier électronique !
Application principale
1
3
t0 6
serveur LDAP
Frame "invisible" de 1 pixel with (parent.visible.document){ n = new Option(' - Aucun resultat a votre demande ! '); var index = mail.proposition.options.length; mail.proposition.options[index]=n; }
2 t1
4 5
chercherMail.php
Serveur HTTP
Figure 10–2
© Eyrolles, 2002
99
Ateliers Web professionnels avec PHP/MySQL et JavaScript
Assister la saisie d’une adresse à l’aide d’un annuaire LDAP
Les Cahiers du programmeur PHP/JavaScript (2)
Utiliser un frame caché
Figure 10–3
Ceci est le fichier index.html, par exemple, B qui divise l’écran. Le second frame, qualifié d’invisible, mesure 1 pixel et reçoit le fichier requeteLdap.html. Le premier frame reçoit le formulaire. Que voit l’utilisateur ? formulaire.html.
La seule solution est de diviser l’écran en deux frames. Dans le premier frame, nous aurons notre formulaire qui contiendra, entre autres, le champ mail que nous voulons compléter à partir des premiers caractères frappés. Dans le second frame, que l’on va tenter de dissimuler, se trouvera un formulaire invisible dont le travail sera de dialoguer, sur ordre reçu depuis le frame visible, avec l’annuaire et cela, via un programme PHP. Ensuite, grâce à un script ( JavaScript), on fera passer dynamiquement les résultats du frame caché vers un objet (select) du frame visible. Simple, non ? Pour créer un frame caché, il suffit de placer dans le frameset une division du type *,1, en supprimant toute bordure. Ainsi, le second frame mesurera 1 pixel et sera donc quasiment invisible ! Dans ce frame, on installera un formulaire dont l’action sera le programme PHP qui récupèrera les adresses e-mail en appelant l’annuaire et qui écrira ces réponses dans le select du frame visible. Ce formulaire sera déclenché depuis le frame visible. Ça s’éclaircit ?
Le formulaire caché (ci-dessous) est, on le voit, très simple. Il ne contient pas d’objet visible, seulement un champ caché (to) qui contient les quelques caractères qui vont servir à rechercher les adresses e-mail. Le fichier requeteLdap.html est situé dans le B frame nommé invisible.
Ce formulaire, n’ayant ni bouton ni champ visible, ne peut donc être lancé que par une instruction JavaScript lui appliquant la méthode submit. Si sa mission est d’interroger la base LDAP, quand va-t-on appliquer cette méthode ? On pourrait tenter de lancer le programme chercherMail.php à chaque frappe d’un caractère dans le champ de saisie de l’adresse e-mail (événement onKeyPress sur l’input). Difficile ! On ne sait pas annuler une requête en cours… On a choisi une méthode plus légère : laisser à l’utilisateur l’initiative du déclenchement. Il commence la saisie des premiers caractères du patronyme, puis clique sur le bouton Loupe…
100
© Eyrolles, 2002
Lorsque l’on clique sur la loupe, le formulaire situé dans le frame invisible est activé et la requête est soumise au programme chercheMail.php. Le frame principal, visible, est toujours présent, l’utilisateur peut continuer à remplir son formulaire en attendant que l’annuaire réponde. Attention ! Cela peut prendre un peu de temps car on dépend du serveur LDAP mais aussi de la vitesse du réseau. Ce n’est ni pire ni meilleur que ce que sait faire l’agent de courrier électronique qui nous a inspiré…
Avec Netscape 4.X, la liste déroulante est graphiquement mal gérée sous Windows ; on peut contourner le problème en remplaçant la liste déroulante (select) par une combo box (select size=x avec x > 1).
formulaire.html mail 3
C’est cette fonction qui démarre le formulaire dont le nom est ldap et qui est située dans le frame « invisible ».
parent.invisible.document.ldap.to.value = document.mail.to.value;
3
Avant d’appeler l’annuaire, il faut passer les quelques caractères frappés dans le champ caché du formulaire ldap.
parent.invisible.document.ldap.submit();
3
On appelle l’annuaire LDAP.
3
Cette fonction effectue simplement le transfert de l’adresse choisie dans le select des réponses données par l’annuaire vers le champ de saisie de l’adresse e-mail.
function startRecherche(){ if (document.mail.to.value.length < 2){ alert("Donnez au moins 2 caracteres ! "); return; }
} function destinataire(){ index=document.mail.proposition.selectedIndex; document.mail.to.value= X document.mail.proposition.options[index].value; } Destinataire :
Frappez les 1er caracteres ci-dessus et cliquez X sur la loupe ---->
Message :
© Eyrolles, 2002
101
Ateliers Web professionnels avec PHP/MySQL et JavaScript
La partie visible
Les Cahiers du programmeur PHP/JavaScript (2)
Comment souhaitons-nous maintenant que le mécanisme fonctionne ?
Figure 10–4
Toutes les informations retournées par le serveur LDAP tombent naturellement dans le frame invisible mais devront être dirigées vers la liste déroulante (le select) située sous le champ destinataire de la partie visible. Si aucune adresse e-mail ne correspond aux caractères saisis (au minimum deux caractères, imposés par la fonction startRecherche), le premier élément de la liste contient « Aucun résultat… ». S’il n’y a qu’une réponse, le champ destinataire est automatiquement alimenté. Enfin, s’il y a plusieurs réponses, elles sont installées dynamiquement en autant d’éléments que nécessaire dans la liste déroulante, le premier invitant l’utilisateur à sélectionner l’adresse de son choix.
Rappel sur la génération dynamique d’options dans l’objet select Pour créer une nouvelle option – on dit une « instance » – il faut appeler le constructeur d’options (new Option) en fournissant deux paramètres : le premier correspond au décor, à ce qu’on lit lorsqu’on déroule la liste ; le second, optionnel, correspond à la value au sens HTML, c’est-à-dire la valeur qui sera transmise avec le formulaire pour l’item sélectionné.
102
Le programme d’interrogation de l’annuaire Le programme PHP interroge l’annuaire LDAP et envoie les réponses dans le frame invisible. Comment ces réponses vont-elles mettre à jour la liste déroulante du frame visible ? Tout simplement, le programme PHP envoie dans le frame invisible les instructions JavaScript qui vont agir directement sur l’objet select (la liste déroulante) du frame visible. Dans le code du programme PHP, nous n’avons mis en évidence que les instructions de connexion et d’interrogation de la base LDAP. Constatez que c’est peu de chose et que PHP fait beaucoup pour vous ! Le reste du code est constitué essentiellement d’instructions print qui génèrent le code JavaScript nécessaire pour alimenter le select du frame visible.
© Eyrolles, 2002