Introduction
Cet article est maintenant obsolete. Une version de cette contribution existe sous forme de plugin gestion des inscriptions à des conférences.
Un problème qui se pose pour les gestionnaires de sites d’associations ou d’institutions organisant des colloques est de gérer efficacement les inscriptions des participants.
Cette contrib propose une solution simple et pratique pour le faire.
Fonctionnalités
Les fonctionnalités de cette contrib sont les suivantes :
- On peut gérer simultanément autant de colloque que l’on veut (chaque colloque est associé à l’article dans lequel la page d’inscription est insérée).
- L’ajout d’une page d’inscription est extrêmement simple pour les contributeurs : il suffit d’insérer un tag <registration adresse@de.notification.fr>
(ou <fastregistration adresse@de.notification.fr>
pour un formulaire simplifié) dans le texte de l’article.
- Lorsque quelqu’un s’inscrit ou se désinscrit, un mail de notification est automatiquement envoyé à l’adresse email de son choix (adresse@de.notification.fr).
- Toute les infos sont enregistrées dans la base de donnée (comme ça les personnes qui se sont inscrite une fois n’ont
pas à redonner leurs coordonnées pour le second colloque).
- Normalement le formulaire généré est XHTML conforme.
Installation
- Il faut tout d’abord ajouter un filtre sur le texte pour détecter la présence de la balise
Mon fichier mes_fonctions.php3 contient donc le code suivant :
// Mon "meta filtre" qui appelle tous les autres
function fl_complements($texte_in){
$texte = fl_registrationform($texte_in);
return $texte;
}
// fonction contrôlant l'apparition d'un formulaire d'enregistrement
function fl_registrationform($fl_txt){
global $notif_email;
// On récupère le/les email(s) pour la notification
$fl_patern_in="|<registration([^>]*?)>|i";
$fl_replace_in1="";
if (preg_match($fl_patern_in, $fl_txt, $matches) ) {
$GLOBALS['registration']=true;
$GLOBALS['fastregistration']=false;
if (trim($matches[1])<>""){
$notif_email=trim($matches[1]);
}
$fl_txt = preg_replace($fl_patern_in, "$fl_replace_in1", $fl_txt);
}
$fl_patern_in="|<fastregistration([^>]*?)>|i";
//if (strstr($fl_txt,$rechercher)!==false){
if (preg_match($fl_patern_in, $fl_txt, $matches) ) {
$GLOBALS['registration']=true;
$GLOBALS['fastregistration']=true;
if (trim($matches[1])<>""){
$notif_email=trim($matches[1]);
}
$fl_txt = preg_replace($fl_patern_in, "$fl_replace_in1", $fl_txt);
}
return $fl_txt;
}
// Fonctions génériques provenant du livre PHP4
// Utilisées entre autre pour les inscriptions aux colloques
function supprimer_encodage_MQ($valeur) {
// si magic quotes est actif, retourner
// la valeur après suppression de l'encodage
// (=> appel à stripslashes), sinon, retourner
// la valeur
return (get_magic_quotes_gpc())?
stripslashes($valeur):$valeur;
}
function valeur_saisie($valeur) {
return supprimer_encodage_MQ ( trim($valeur));
}
function vers_formulaire($valeur) {
// affichage dans un formulaire
// encoder tous les caractères HTML spéciaux
// - ENT_QUOTES : dont " et '
return htmlentities($valeur,ENT_QUOTES);
}
function vers_page($valeur) {
// affichage direct dans une page
// 1. encoder tous les caractères HTML spéciaux
// - ENT_QUOTES : dont " et '
// 2. transformer les sauts de ligne en <BR>
return nl2br(htmlentities($valeur,ENT_QUOTES));
}
function vers_base($valeur) {
// le seul caractère qui pose vraiment problème est
// l'apostrophe (') ; c'est donc le seul qui est échappé
// par cette fonction
// une solution valable pour toutes les bases consiste à
// l'échapper par lui-même => remplacement de ' par ''
return str_replace("'","''",$valeur);
}
function construire_requete($requete) {
// récupérer le nombre de paramètre
$nombre_param = func_num_args();
// boucler sur tous les paramètres à partir du deuxième
// (le premier contient la requête de base)
for($i=1;$i<$nombre_param;$i++) {
// récupérer la valeur du paramètre
$valeur = func_get_arg($i);
// si c'est une chaîne, remplacer ' par ''
if (is_string($valeur)) {
$valeur = str_replace("'","''",$valeur);
}
// mettre la valeur à son emplacement %n (n = $i)
$requete = str_replace("%$i",$valeur,$requete);
}
// retourner la requête
return $requete;
}
function affiche_msg($message)
{
$message=addslashes($message);
echo "<script language=\"JavaScript\" type=\"text/JavaScript\">\n";
echo "<!--\n";
echo "alert( '$message')\n";
echo "//-->\n";
echo "</script>\n";
}
function fl_at($fl_txt){
$rechercher="@";
$remplacer="<a class=\"hackers\" href=\"mailto:support@microsoft.com\"></a><img src=\"squelettes/design/at.gif\" border=\"0\" align=\"middle\" alt=\"at\" /><a class=\"hackers\" href=\"mailto:support@microsoft.com\"></a>";
$fl_txt = str_replace($rechercher,$remplacer,$fl_txt);
return $fl_txt;
}
Ensuite, il faut appeller le filtre. Cela se fait dans le squelette.
Dans le squelette, il faudra aussi tester si le formulaire a été demandé et si oui inclure le formulaire. Tout cela se fait en mettant les lignes suivantes dans le squelette « article.html ».
[<div class="textearticle"> (#TEXTE|fl_complements)</div>]
<?php
if ($registration) {
include("registrationform.php");
}
?>
Maintenant, il faut copier le fichier registrationform.php ci joint à la racine de votre site [1].
Il faudra aussi ajouter à la racine du site le fichier objets.inc.php (attention, si vous ne le mettez pas à la racine, il faudra changer son appel dans registrationform.php).
Configurez les variables $adresse_site et $adresse_email_defaut dans registrationform.php (adresse de votre site et adresse email d’où seront envoyé les emails de notification. On doit pouvoir utiliser l’adresse web défini pour le site, mais j’ai pas pris le temps de regarder comment... avis aux amateurs ! ).
Pour que ça s’afiche correctement, il faut aussi ajouter les styles correspondant.
Je conseille de les inclure une feuille de style séparée appelée registration.css placée à la racine (ou ailleurs).
Pour cela ajouter
<style type="text/css" media="projection, screen, tv">
@import "registration.css";
</style>
dans les entêtes des pages (entre les balises <head>
et </head>
).
Il faut également ajouter le fichier contenant le javascript Onglet.js à la racine du site.
Dernière étape, créer les tables dans la base.
Voici le code de création des tables :
#
# Table structure for table <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+c3BpcF9wZW9wbGU8L2NvZGU+"></span>
#
CREATE TABLE <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+c3BpcF9wZW9wbGU8L2NvZGU+"></span> (
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+aWRfcGVvcGxlPC9jb2RlPg=="></span> int(11) NOT NULL auto_increment,
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bm9tPC9jb2RlPg=="></span> char(30) NOT NULL default '',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+cHJlbm9tPC9jb2RlPg=="></span> char(30) NOT NULL default '',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZW1haWw8L2NvZGU+"></span> char(40) NOT NULL default '',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+aW5zdGl0dXQ8L2NvZGU+"></span> char(50) NOT NULL default '',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+YWRkcmVzc2UxPC9jb2RlPg=="></span> char(50) NOT NULL default '',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+YWRkcmVzc2UyPC9jb2RlPg=="></span> char(50) NOT NULL default '',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+emlwPC9jb2RlPg=="></span> char(10) NOT NULL default '',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+dmlsbGU8L2NvZGU+"></span> char(50) NOT NULL default '',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+cGF5czwvY29kZT4="></span> char(40) NOT NULL default '',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+dGVsMTwvY29kZT4="></span> char(20) NOT NULL default '',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+dGVsMjwvY29kZT4="></span> char(20) NOT NULL default '',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZmF4PC9jb2RlPg=="></span> char(20) NOT NULL default '',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+cGFzc3dkPC9jb2RlPg=="></span> char(15) NOT NULL default '',
UNIQUE KEY <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZW1haWw8L2NvZGU+"></span> (<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZW1haWw8L2NvZGU+"></span>),
UNIQUE KEY <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+aWRfcGVvcGxlPC9jb2RlPg=="></span> (<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+aWRfcGVvcGxlPC9jb2RlPg=="></span>)
) TYPE=MyISAM;
#
# Table structure for table <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+c3BpcF9wZW9wbGVfY29uZjwvY29kZT4="></span>
#
CREATE TABLE <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+c3BpcF9wZW9wbGVfY29uZjwvY29kZT4="></span> (
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+aWRfcGVvcGxlPC9jb2RlPg=="></span> int(11) NOT NULL default '0',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+aWRfY29uZjwvY29kZT4="></span> int(11) NOT NULL default '0',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bHVuY2g8L2NvZGU+"></span> char(1) NOT NULL default '',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+cmVtb3RlPC9jb2RlPg=="></span> char(1) NOT NULL default '',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+YXJyaXZhbDwvY29kZT4="></span> varchar(20) NOT NULL default '',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZGVwYXJ0dXJlPC9jb2RlPg=="></span> varchar(20) NOT NULL default '',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+cHJlc2VudGF0aW9uPC9jb2RlPg=="></span> char(1) NOT NULL default '',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+dGl0bGU8L2NvZGU+"></span> varchar(120) NOT NULL default '',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+YWJzdHJhY3Q8L2NvZGU+"></span> text NOT NULL,
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+Y29tbWVudHM8L2NvZGU+"></span> varchar(250) NOT NULL default '',
KEY <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+aWRfcGVvcGxlPC9jb2RlPg=="></span> (<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+aWRfcGVvcGxlPC9jb2RlPg=="></span>),
KEY <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+aWRfY29uZjwvY29kZT4="></span> (<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+aWRfY29uZjwvY29kZT4="></span>)
) TYPE=MyISAM;
Connectez-vous à votre base de données (phpmyadmin) et executez le code SQL ci-dessus pour créer les tables.
Voila, normalement, ça devrait fonctionner.
Chez moi, ça fonctionne avec spip 1.7.2 et 1.8.1.
Bonne chance.
Aucune discussion
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
Merci d’avance pour les personnes qui vous aideront !
Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.
Suivre les commentaires : |