Formulaire de participation à un événement

Cet article tente de rassembler des informations au sujet de l’affichage d’un formulaire de participation aux événements gérés par le plugin Agenda développé par Cédric Morin.

La version 2 du plugin Agenda permet d’afficher dans l’espace public des formulaires de participation aux événements. Cette fonctionnalité est incomplète, mais utilisable.

Voici à quoi ressemble le formulaire sur une page de l’espace public en utilisant les squelettes par défaut de SPIP :

Capture d’écran d’un formulaire de participation à un événement

Les utilisateurs [1] ont la possibilité de répondre j’y serai, j’y serai peut-êre ou je n’y vais pas.

Il est possible de limiter le nombre de places disponibles. Dans ce cas, quand l’événement est complet, les utilisateurs en sont tenus informés par un message et le formulaire n’est plus affiché, sauf pour les utilisateurs connectés ayant déjà répondu j’y serai de manière à leur permettre de se désinscrire et de libérer éventuellement une place.

Si l’utilisateur revient au cours de sa visite sur la page du formulaire, sa réponse reste affichée.

Le plugin ne permet pas encore l’affichage des réponses dans l’espace privé, mais elles peuvent être consultées dans la table spip_evenements_participants en base de données.

Par ailleurs, l’inscription est valable sur toute la durée de l’événement, y compris si l’événement se produit avec des répétitions.

Affichage du formulaire

Le formulaire s’affiche dans un squelette grâce à la balise #FORMULAIRE_PARTICIPER_EVENEMENT{#ID_EVENEMENT} [2] à condition qu’elle soit incluse dans une boucle de type EVENEMENTS. Par exemple, dans le squelette article.html, vous pouvez rajouter la boucle suivante pour afficher les événement liés à l’article et les formulaires de participation associés :

<BOUCLE_evenement(EVENEMENTS){id_article}>
        <p>#TITRE</p>
        #FORMULAIRE_PARTICIPER_EVENEMENT{#ID_EVENEMENT}
</BOUCLE_evenement>

Notez que la boucle ne doit pas se trouver dans un INCLURE statique, faute de quoi le formulaire ne sera pas rafraîchi à chaque consultation de la page par l’utilisateur. Autrement dit, si au lieu de placer la boucle directement dans article.html, vous souhaitez la placer dans un squelette nommé formulaire-evenement.html, n’utilisez pas [(#INCLURE{fond=formulaire-evenement})] pour appeller ce squelette depuis article.html, mais <INCLURE{fond=formulaire-evenement}> [3].

Par ailleurs, la balise #FORMULAIRE_PARTICIPER_EVENEMENT étant un formulaire CVT (charger, vérifier, traiter), vous pouvez bénéficier du chargement du formulaire en AJAX en encapsulant la balise dans une div de classe ajax.

<div class='ajax'>
#FORMULAIRE_PARTICIPER_EVENEMENT
</div>

L’insertion de la balise #FORMULAIRE_PARTICIPER_EVENEMENT{#ID_EVENEMENT} dans vos squelettes ne suffit pas. Pour que le formulaire s’affiche, vous devez cocher la case « inscription en ligne » du formulaire de saisie de l’événement. Vous avez également la possibilité de saisir un nombre de places si celui-ci est limité.

Formulaire de saisie d’un événement avec une inscription en ligne

Sauvegarde des réponses dans la base de données

Les réponses sont stockées en base de données dans la table spip_evenements_participants, créée à l’installation du plugin. Elle comporte les champs suivants :

  • id_evenement
  • id_auteur
  • date
  • reponse
La table spip_evenements_participants dans phpMyAdmin

Le champ reponse peut prendre les valeurs suivantes :

  • ’oui’ (si la réponse est "j’y serai")
  • ’non’ (si la réponse est "je n’y vais pas")
  •  ?’ (si la réponse est "j’y serai peut-être")

La seule façon d’identifier l’auteur d’une réponse est donc id_auteur. Il vaut donc mieux inciter les utilisateurs n’ayant pas de compte de rédacteur ou d’administrateur à créer un compte sur votre site et à se connecter avant de répondre. Cette connexion préalable est d’autant plus nécessaire que dans le cas où un utilisateur ne serait pas connecté, sa réponse serait enregistrée sous l’id_auteur zéro et sa réponse perdue par l’enregistrement de la réponse du prochain utilisateur non connecté.

Pour vérifier si l’utilisateur est connecté, vous pouvez essayer de modifier formulaires_participer_evenement_verifier_dist, en rajoutant après $reponse = _request('reponse'); le test suivant :

if ($GLOBALS['visiteur_session']['id_auteur'] == 0)
$erreurs['reponse'] = "Pour signaler votre participation a l'evenement vous devez etre connecte sur le site. Si vous n'avez pas encore de compte, veuillez en creer un.";

et en remplaçant if (!($reponse=_request(’reponse’)) suivant par elseif (!($reponse=_request(’reponse’)).

Si vous hésitez à autoriser des inconnus à se connecter à votre site, notez que SPIP vous donne la possibilité de créer des auteurs nommés « visiteurs », n’ayant pas accès à l’espace privé. Ce type d’auteur est généralement utilisé pour permettre à des utilisateurs de poster des messages dans des forums après abonnement. Pour autoriser l’inscription des visiteurs, allez dans Configuration > Interactivité > Visiteurs puis cochez la case Accepter l’inscription de visiteurs du site public.

Les balises #FORMULAIRE_INSCRIPTION et #LOGIN_PUBLIC vous permettront d’afficher le formulaire d’inscription et le formulaire permettant à vos utilisateurs de s’identifier tout en restant sur le site public [4]. Vous pouvez afficher la liste des visiteurs dans Auteurs puis en cliquant sur Afficher les visiteurs.

Affichage des inscriptions

Le formulaire d’inscription étant une fonctionnalité en cours de développement du plugin Agenda, il n’est pas encore possible de visualiser les inscriptions dans l’espace privé. Vous pouvez toutefois visualiser le contenu de la table spip_evenements_participants avec un outil comme phpMyAdmin si votre hébergeur l’a mis à votre disposition.

Par contre, il est possible d’afficher dans l’espace public la liste des auteurs inscrits à un événement en rajoutant dans le squelette article.html une boucle du type :

<BOUCLE_evenement(EVENEMENTS){id_article}>
<BOUCLE_personnes_inscrites(spip_auteurs spip_evenements_participants){id_evenement}{par nom}> 
#NOM 
</BOUCLE_personnes_inscrites>
</BOUCLE_evenement>

La boucle utilise deux fonctionnalités de SPIP :

  • la possibilité d’interroger une table de la base de donnée pour laquelle aucun alias n’a été déclaré (ce qui est le cas actuellement pour la table spip_evenements_participants). Par exemple, l’alias de la table spip_articles est ARTICLES (en majuscules), ce qui permet d’écrire <BOUCLEx(ARTICLES)> au lieu de <BOUCLEx(spip_articles)>.
  • les jointures : la table spip_evenements_participants ne contient pas le nom des auteurs qui se trouve dans la table spip_auteurs, c’est pourquoi la boucle fait appel à ces deux tables pour créer une jointure [5].

Etude du code du formulaire

Pour revenir à la balise #FORMULAIRE_PARTICIPER_EVENEMENT, celle-ci est un formulaire CVT (charger, vérifier, traiter). Vous trouverez donc dans le dossier formulaires à la racine du plugin, le squelette participer_evenement.html et le script participer_evenement.php contenant les fonctions :

  • formulaires_participer_evenement_charger_dist($id_evenement)
  • formulaires_participer_evenement_verifier_dist($id_evenement)
  • formulaires_participer_evenement_traiter_dist($id_evenement)

La fonction formulaires_participer_evenement_charger_dist est exécutée avant l’affichage du formulaire pour vérifier si l’événement passé en paramètre par #FORMULAIRE_PARTICIPER_EVENEMENT{#ID_EVENEMENT} existe réellement et qu’une inscription en ligne est bien prévue pour cet événement (la case « Inscription en ligne » est bien cochée dans le formulaire de saisie de l’événement). Si ce n’est pas le cas, le formulaire n’est pas affiché. Sinon, la fonction vérifie si un nombre de places a été défini et le cas échéant, calcule si l’événement est complet ou non. Les réponses ’oui’ ont un poids de 1 et les réponses ’peut-être’ un poids de 0,5. La somme des réponses ’peut-être’ est arrondie à l’entier supérieur. Par exemple, si deux personnes ont répondu ’oui’ et trois personnes ’peut-être’, on considère que (2 x 1) + arrondi(3 x 0,5) = 4 places ont été réservées. Si l’événement est complet, le message "evenement complet" est affiché et le formulaire ne s’affiche que si l’utilisateur (identifié par $GLOBALS['visiteur_session']['id_auteur']) a déjà répondu ’oui’ de manière à lui permettre de se désinscrire et de libérer éventuellement une place.

Si le formulaire est affiché et que l’utilisateur clique sur le bouton d’envoi, la fonction formulaires_participer_evenement_verifier_dist prend le relais pour vérifier que l’utilisateur a bien coché une des propositions, faute de quoi le message "Indiquez votre choix" est affiché. Si l’événement est complet et que l’utilisateur qui avait préalablement répondu ’non’ ou ’peut-être’ change sa réponse pour ’oui’, on affiche le message ’Plus de places’.

Si aucun message d’erreur n’est affiché, les réponses sont traitées par formulaires_participer_evenement_traiter_dist qui met à jour ou insère dans la base de donnée la réponse de l’utilisateur puis affiche un message de confirmation de prise en compte de la réponse.

Notes

[1Nous préférons à « visiteur » le terme d’« utilisateur » pour désigner une personne qui consulte votre site. En effet, dans le jargon de SPIP, un visiteur est un auteur qui peut avoir des droits pour participer à des forums, par exemple, mais qui ne peux pas accéder à l’espace privé et modifier le contenu du site.

[2Attention, il est important d’utiliser la balise #ID_EVENEMENT et non pas le critère {id_evenement}, faute de quoi le code ne sera pas valide.

[3Pour connaitre les différences entre les INCLURE statiques et dynamiques, consultez <INCLURE> d’autres squelettes.

[4Pour en savoir plus sur les formulaires, consultez l’article éponyme sur le site officiel.

[5Pour en savoir plus sur les jointures, voir programmer.spip.org.

Dernière modification de cette page le 9 février 2019

Discussion

14 discussions

  • 2

    Bonjour,
    Petite question : dans une rubrique qui liste mes articles-événements, je voudrais afficher un lien vers le formulaire de participation uniquement quand l’événement est ouvert à l’inscription. Comment dois-je écrire cela ?
    Ce doit être un truc de ce genre...

    [(#EVENEMENT|?{' '}) | <a href="#URL_ARTICLE">Inscription</a>]

    Je suis dans

    <BOUCLE_evenementDate(EVENEMENTS){id_rubrique}{par date_debut}{age<0}{statut=publie}> 
        <B_articlesAgenda>     
        <BOUCLE_articlesAgenda(ARTICLES) {id_article} {par date}{pagination}> 

    D’avance, Merci !

    • Bon, apparemment je faisais fausse route en cherchant à tester l’existence d’un événement (vu que je suis dans une page d’agenda, il n’y a que des événements !!). Donc, j’ai trouvé quelque chose comme çà :

      [(#PLACES|moins{#TOTAL_BOUCLE}|>{1}|oui) <a href="#URL_ARTICLE">Inscription</a> ]

      ... mais ce n’est pas satisfaisant puisque je teste ici le nb de places restantes et non l’existence ou non de l’option Inscription.
      Quelle est donc la formule magique ?

    • Pas testé, mais comme il y a un champ booléen inscription dans la table et qui correspond à une case à cocher dans l’interface ; ne serait-ce pas simplement [(#INSCRIPTION|oui) <a href="#URL_ARTICLE">Inscription</a> ] ?

      Il n’y a pas de mal à tester s’il reste une place disponible : ça fait le boulot aussi  :) Sauf qu’on peut ouvrir les inscriptions sans pour autant limiter le nombre de places... (mais à l’inverse, quand le nombre de places est limité, c’est forcément sur inscription... et pas besoin de changer si dans votre cas le nombre de places disponibles est toujours indiqué  ;))

    Répondre à ce message

  • 1

    Bonjour,
    Excellent tuto ! J’ai testé le code de Artlogic qui fonctionne parfaitement bien. Mais je cherche à y inclure une 4e option pour le cas ou le visiteur n’est pas connecté : un message de type ’votre inscription sur ce site / identification est nécessaire pour vous inscrire à cet événement’ avec l’affichage des formulaires #FORMULAIRE_INSCRIPTION et #LOGIN_PUBLIC.
    Comment écrire cela ? Merci d’avance !

    • Bon... pour çà, j’ai trouvé toute seule :

      <li>
       [<div class='ajax'>(#SESSION{statut}|match{1comite|0minirezo|6forum}|oui)   
       [(#FORMULAIRE_PARTICIPER_EVENEMENT{#ID_EVENEMENT})]]
      
        [(#SESSION{id_auteur}|?{' '})| <a href="#URL_LOGOUT" rel="nofollow"><:icone_deconnecter:></a>]
        <br />
       [<div class='ajax'>(#SESSION{statut}|match{1comite|0minirezo|6forum}|non)
       [(#SESSION{id_auteur}|?{' '})| <a href="#URL_LOGOUT" rel="nofollow"> <:icone_deconnecter:></a>]
       [(#SESSION{id_auteur}|?{'',' '})| <a href="[(#URL_PAGE{login}|parametre_url{url,#SELF})]" rel="nofollow" class='login_modal'><:lien_connecter:></a><br />
       | <a href="[(#URL_PAGE{inscription}|parametre_url{url,#SELF})]" rel="nofollow" class='login_modal'>S'inscrire</a>]</div>]
        </li>

    Répondre à ce message

  • 1

    Bonjour, et bravo pour le plugin... mais je suis vraiment débutant sous spip...
    je ne sais pas comment accéder à la fameuse table spip_evenements_participation, afin de récupérer les inscrits à un évènement... ???
    Merci d’avance !
    Jean-Michel

    Répondre à ce message

  • Bonjour,

    Coté site public, peut-on afficher les personnes inscrites ?

    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