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.
Discussions par date d’activité
9 discussions
Cette méthode est elle toujours valable pour la dernière version de spip (1.9.2d) ? Doit on insérer le script dans mes_options.php comme un lecteur l’a indiqué ?
J’ai modifié cette contrib et en ai fait un plugin.
Il est dispo sur l’article 2681 (demande de validation faite).
Le code est là : http://www.spip-contrib.net/IMG/zip/gestion_conferences.zip
Répondre à ce message
Bonjour,
Je trouve cette contrib fort intéressante d’autant plus qu’on m’a demandé d’offrir une inscription en ligne pour un colloque d’une journée en mars prochain.
Or, mes tests ne sont pas concluants. Je n’ai pas réussi à faire fonctionner cette contrib. L’appel de registrationform.php s’effectue, donc le filtre fonctionne. Mais la page produite s’arrête à l’ancre reg_step. Aucun formulaire ne s’affiche. J’ai essayé plusieurs trucs pour faire fonctionner la contrib, toujours sans succès (test avec SPIP 1.8.1 ; test sur un autre ordi ; changements de dossier, etc.).
Je travaille avec SPIP 1.8.2e, sur Apache 2.054, MYSQL 4.1.14 et PHP 5.0.4 tout ça en développement sur windows XP.
Une idée de solution ?
A priori, après investigations de smlavoie, pour les serveurs sous windaube, il faut :
- Remplacer le mot « abstract » par autre chose (sinon php/win interpète mal)
- Placer les fichiers php (objets.inc.php) à la racine du serveur. Enfin ce dernier point doit être valable dans un cas plus général si racine du site <> racine du serveur. Sinon il faut mettre
require_once("chemin_from_racine_serveur/objets.inc.php");
dans registrationform.php
Bonjour,
Cela ne semble pas régler complètement le problème. L’appel de registrationform.php s’effectue, le filtre fonctionne, les formulaires s’affichent, Mais une fois que l’on tente d’inscrire un email, la page produite s’arrête à l’ancre reg_step et dans mon cas, le site me renvoie à la page d’accueil.
Une solution ?
Répondre à ce message
Bonjour,
Voilà, je viens d’intégrer cette contribution au site spip mais je n’arrive pas à comprendre comment créer un formulaire d’inscription dans un article.
Merci pour votre aide.
Répondre à ce message
je songe à intégrer cette contrib à un site d’asso (Les CEMEA), pour gérer l’inscritpion à des stages ou journée de formation, et je voudrais savoir s’il serai possible de gérer la présence ou non de l’inscritpion par la sélection d’un mot clef lors de la rédaction de l’article.
Salut,
Pour l’instant la selction se fait par ajout d’un « tag » dans le corps de l’article, mais il doit être assez facile de remplacer ça par un test sur la présence d’un mot clé !!!
Répondre à ce message
pourquoi tu n’utilises pas les points d’entrée inc-texte pour faire cela ? tu pourrais tout mettre dans otn fichier mes_options.php3 dans une fonction apres_propre et SPIP l’appliquerait automatiquement sur tes textes, sans modifier les squelettes.
Effectivement ta solution serait plus logique (j’aurais du le faire quand j’ai commencé en fait) et je la recommande...
Pour la petite histoire, il y a peu encore, j’aurais pu l’appliquer. Mais depuis quelque mois, j’ai besoin, selon les cas, d’appliquer certains filtres ou pas... donc dans certains squelettes j’appelle pas les mêmes filtres.
le système de plugin de la 1.9a sera ton ami alors ;)
Répondre à ce message
J’ai testé ce script (en local) et, après une après-midi de recherche car il ne donnait aucun résultat, j’ai eu l’idée d’appeler dans le filtre, non pas fl_complements, mais directement fl_registrationform, et là, miracle, cela fonctionne, tant dans Safari que Firefox ... Reste maintenant à franciser tout ça ...
A part ce détail, c’est top, et exactement ce dont on a besoin dans la gestion d’évènements. Merci à fleg.
Marc
comme markouch, j’ai eu quelques difficultés avec le meta-tag, et en appelant directement #TEXTE|fl_registrationform tout est rentré dans l’ordre.
Peut-être faudrait-il rajouter quelque part dans l’article le format de ce qu’il faut insérer danss le texte de l’article ?
A l’avenir, avec un peu de temps, on pourrait aussi envisager de mettre toutes les ressources texte dans un fichier de langue ; j’ai traduit sauvagemennt, mais directemennt dans le code...
sinon, ça fonctionne pile poil
¨thanks !
CORRECTIF : J’ai merdu en recopiant la fonction fl_complements... l’argument à passer à registrationform est $texte_in et pas $texte... Donc voila la « bonne » fonction.
function fl_complements($texte_in)
$texte = fl_registrationform($texte_in) ;
return $texte ;
correction de la fonction dans la contrib, tout ça marcheras mieux :)
Répondre à ce message
Cet article est très intéresant et répond très nettement à un souci dans le cas d’associations, effectivement (j’en gère trois !!), mais amène quelques questions néanmoins :
1. qu’entends-tu par colloque ? Je suppose qu’il s’agit d’un évènement quelconque, non ? Un dîner, une soirée, une conférence, une partie de golf ... ?
2. concernant le fichier javascript : as-tu vérifié qu’il « tourne » sous tous les navigateurs courants, notamment Safari, Firefox ... pour mac (je vais tester ça de toute façon) ? En effet, par exemple, les onglets de mise en forme des articles dans la partie privée ne marchent pas sur mac, ni dans safari, ni Shiira, ni Opéra.
Merci encore pour cette contribution très documentée ...
Marc
> 1. qu’entends-tu par colloque ? Je suppose qu’il s’agit d’un évènement quelconque, non ? Un dîner, une soirée, une conférence, une partie de golf ... ?
Exactement...
> 2. concernant le fichier javascript : as-tu vérifié qu’il « tourne » sous tous les navigateurs courants, notamment Safari, Firefox ... pour mac (je vais tester ça de toute façon) ? En effet, par exemple, les onglets de mise en forme des articles dans la partie privée ne marchent pas sur mac, ni dans safari, ni Shiira, ni Opéra.
J’ai testé les navigateurs suivants :
IE, Mozilla >1.0 sous Win et Linux, Opera, firefox.
J’ai des utilisateurs qui se servent de Safari, Galeon et Konqueror et ils ne m’ont pas reporté de problèmes.
Répondre à ce message
Ca a l’air super, mais c’est dommage qu’on ait pas un lien pour voir ça en action ...
Bon, allez... je vais être bon !!!
voila un endroit où vous pouvez voir ce que ça donne....
http://www.planck.fr/article172.html
Mais si possible utilisez le user = test et le passwd = test
pour éviter de polluer ma base de users...
Merci !
F.
Pardon : login = test@test.fr
Merci
Répondre à ce message
avec une petite démo, ce serait bien plus sympa, non ?
Répondre à ce message
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 : |