Gestion des inscriptions à des conférences

Cette contribution à pour objectif d’expliquer comment gérer automatiquement les inscriptions à des colloques sous SPIP.

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 . Pour ma part, j’ai regroupé tous mes filtres perso dans un « meta filtre » que j’appelle sur le contenu de mes articles. Mais vous n’êtes pas obligé de faire pareil et vous pouvez appeller directement le filtre fl_registrationform.
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).

registrationform.php
The registration form.
objets.inc.php
Classes de gestion des colloques.

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).

registration.css
Feuille de style pour les formulaires d’inscription.

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.

Onglet.js
Javascript pour basculer de la fiche d’inscription à la liste des participants.

Dernière étape, créer les tables dans la base.
Voici le code de création des tables :

#
# Table structure for table `spip_people`
#

CREATE TABLE `spip_people` (
  `id_people` int(11) NOT NULL auto_increment,
  `nom` char(30) NOT NULL default '',
  `prenom` char(30) NOT NULL default '',
  `email` char(40) NOT NULL default '',
  `institut` char(50) NOT NULL default '',
  `addresse1` char(50) NOT NULL default '',
  `addresse2` char(50) NOT NULL default '',
  `zip` char(10) NOT NULL default '',
  `ville` char(50) NOT NULL default '',
  `pays` char(40) NOT NULL default '',
  `tel1` char(20) NOT NULL default '',
  `tel2` char(20) NOT NULL default '',
  `fax` char(20) NOT NULL default '',
  `passwd` char(15) NOT NULL default '',
  UNIQUE KEY `email` (`email`),
  UNIQUE KEY `id_people` (`id_people`)
) TYPE=MyISAM;
    
#
# Table structure for table `spip_people_conf`
#

CREATE TABLE `spip_people_conf` (
  `id_people` int(11) NOT NULL default '0',
  `id_conf` int(11) NOT NULL default '0',
  `lunch` char(1) NOT NULL default '',
  `remote` char(1) NOT NULL default '',
  `arrival` varchar(20) NOT NULL default '',
  `departure` varchar(20) NOT NULL default '',
  `presentation` char(1) NOT NULL default '',
  `title` varchar(120) NOT NULL default '',
  `abstract` text NOT NULL,
  `comments` varchar(250) NOT NULL default '',
  KEY `id_people` (`id_people`),
  KEY `id_conf` (`id_conf`)
) 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.

Liens concernants la gestion de conférences (suggèrés par Minh)

ConfTool

OpenConf

Discussion

Notes

[1ou dans un autre répertoire, par exemple « squelettes », si vous modifiez include(« registrationform.php ») ; en include(« squelettes/registrationform.php ») ; dans article.html

Discussion

9 discussions

  • 1
    Jérôme

    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é ?

    Répondre à ce message

  • 2

    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

  • 1

    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

  • 2

    Pour ma part, j’ai regroupé tous mes filtres perso dans un « meta filtre » que j’appelle sur le contenu de mes articles.

    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

  • 3

    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 ?

      <registration> ou bien aussi <fastregistration>

      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

  • 1

    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

  • 2

    Ca a l’air super, mais c’est dommage qu’on ait pas un lien pour voir ça en action ...

    Répondre à ce message

  • avec une petite démo, ce serait bien plus sympa, non ?

    Répondre à ce message

Ajouter un commentaire

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom

Dernière modification de cette page le 20 avril 2008