Plugin séances

Dans la gestion d’événements, il arrive d’avoir à mettre en rapport un spectacle (film, concert ou autre), un lieu et une date. Il est alors possible d’envisager plusieurs modes de présentation : pour un spectacle donné, les dates et lieux de celui-ci, de même à partir d’une date donnée, ou d’un lieu déterminé.
Ce plugin s’adresse plutôt aux sites de programmation culturelle ou événementielle (festival ou autre) pour la tenue de leur agenda de spectacles, films,…

Pour ce plugin, un spectacle (film, concert, conférence,…) est défini par un article. Le plugin rajoute la possibilité de définir les endroits (lieux, salles, scènes,…) eux-mêmes rattachables en option à un article. Les séances sont définies par un article de rattachement, un endroit et une date (avec éventuellement une remarque supplémentaire). Seule la date de début est définie. Une rubrique est alors comparable à une section, une thématique, ou à l’ensemble de la programmation.

Installation

Comme tout plugin. Celui-ci installe deux nouvelles tables spip_seances et spip_seances_endroits. Il ajoute également un champ « seance » sur la table spip_rubrique.

Fonctionne à partir de spip-2.0.10 inclus.
Compatible Champs Extra 2.

Désinstallation - désactivation

On peut soit désactiver (dans ce cas décocher simplement l’activation du plugin), les tables sont alors conservées, soit désinstaller en cliquant sur le lien correspondant (les tables sont alors supprimées).

Utilisation

Définir un endroit (obligatoire).
Il est obligatoire de définir au moins un endroit.
Dans « Édition » > « Séances / endroits »
Un endroit est défini au minimum par son titre. On peut lui adjoindre un descriptif ou le rattacher à un article. Les noms des endroits peuvent être numérotés « x. » pour définir des priorités dans l’affichage (voir plus loin).

Définir les endroits
Liste des endroits des séances
Formulaire de saisie pour les endroits


Définir des séances
Il est nécessaire pour cela d’activer le mode « séances » pour la rubrique.
Ceci étant fait, pour chaque article de celle-ci on pourra alors définir des séances.

Activer les séances
(dans la colonne de gauche)
Désactiver les séances


Remarque : la désactivation du mode séances pour une rubrique supprime les séances enregistrées pour tous les articles de celle-ci. Cette action est immédiate, elle constitue donc un moyen de supprimer toutes les séances d’une rubrique.
Le mode séance n’est pas hérité par les rubriques filles. Il faudra donc l’activer pour chaque rubrique d’une branche éventuellement.

Pour chaque article de la rubrique il est alors possible de définir des séances.

Listes des séances définies
Formulaire de définition d’une séance


Les séances peuvent être dupliquées (pratique lorsque seul un élément est modifié, jour, lieu par exemple)
Il est possible de supprimer une séance ou toutes les séances d’un article.

Remise à zéro
En fin de saison il peut être utile de supprimer toutes les séances de tous les articles. Pour cela dans « configuration » choisir « Configuration plugin séances » et supprimer toutes les séances enregistrées. cela ne désactive pas le mode séance pour les rubriques où il est activé.

Réinitialiser les séances


Dans les squelettes

La boucle SEANCES
<BOUCLEn(SEANCES){critères...}>

les critères de la boucle SEANCES

  • id_seance sélectionne la séance dont l’identifiant est id_seance. Comme l’identifiant de chaque séance est unique, ce critère ne retourne qu’une ou zéro réponse.
  • id_article sélectionne toutes les séances associées à un article.
  • date_seance ou age_seance sélectionne toutes les séances d’une date donnée ou d’un age donné (positif ou négatif) age_seance = 0 pour aujourd’hui par exemple ou age_seance <= 0 pour l’avenir.
  • id_endroit sélectionne toutes les séances se déroulant dans un endroit donné (ou dans une sélection d’endroits avec le critère IN)

par extension
id_rubrique sélectionne toutes les séances de tous les articles contenus dans une rubrique. (utile si une rubrique représente un genre, une section d’un festival,…).

statut restreint l’affichage des séances à celles rattaché à un article publié.

<BOUCLEn(SEANCES){id_rubrique}{age_seance <= 0}{statut = publie}{par date_seance}>

les balises de la boucle SEANCES

  • #ID_SEANCE
  • #ID_ARTICLE : id de l’article de rattachement de la séance
  • #ID_ENDROIT : id de l’endroit rattaché à la séance
  • #DATE_SEANCE tous les filtres de date sont applicables à #DATE_SEANCE
  • #REMARQUE_SEANCE : remarque éventuelle sur la séance (« en présence du réalisateur », « Attention, exceptionnellement… ».

Exemple : affichage des dates d’un spectacle donné (donc des séances rattachées à un article donné). Dans une boucle englobante de type ARTICLES :

<B_dates><ul>
<BOUCLE_dates (SEANCES) {id_article}{par date_seance}>
[<li>(#DATE_SEANCE|affdate) - [(#DATE_SEANCE|heures)]h [(#DATE_SEANCE|minutes)]</li>]
</BOUCLE_dates>
</ul></B_dates>

La boucle SEANCES_ENDROITS
<BOUCLEn(SEANCES_ENDROITS){critères...}>

Les critères

  • id_endroit id de l’endroit
  • id_article id de l’article éventuellement rattaché à un endroit
  • nom_endroit nom de l’endroit

Les balises

  • #NOM_ENDROIT : nom de l’endroit
  • #ID_ENDROIT : son id
  • #ID_ARTICLE : id de l’article décrivant plus précisément l’endroit éventuellement
  • #DESCRIPTIF_ENDROIT : descriptif de l’endroit.

Filtres du plugin séances

|heure_seance [(#DATE_SEANCE|heure_seance)] est équivalent à [(#DATE_SEANCE|heures)]h[(#DATE_SEANCE|minutes)], avec un format d’affichage plus convivial (20h au lieu de 20h00).

|heure_fin_seance le nom de ce filtre n’est pas forcément le plus approprié, mais il détermine la date de fin d’une séance à partir de sa date de début et de sa durée. Cette dernière peut être stockée dans un champ de l’article correspondant au film, au concert ou autre. Cette donnée peut être passée sous la forme 1h30, 1.30, 1,30, 1:30 (pour 1 heure 30).
[(#DATE_SEANCE|heure_fin_seance{#SUR_TITRE})] si la durée est stockée dans le sur-titre de l’article.

Les dates et les âges

les critères age et age_relatif sont applicables aux séances avec age_seance et age_relatif_seance. Ainsi on pourra utiliser {age_seance < 0} pour obtenir les séances à venir.

À partir de spip 3.0.8, les requêtes sql ont été modifiées et simplifiées. Le critère {age = 0} retourne les séances ayant lieux dans les 24 heures avant et après la requête.
Pour avoir les séances du jour, il est possible d’utiliser une expression du type

en dehors d'une boucle 
[(#SET{aujourdhui,[(#DATE|affdate{'Y-m-d'})]})]

puis dans une boucle sur la table SEANCES avec ou sans jointure
<BOUCLE_a (SEANCES)....{date_seance like #GET{aujourdhui}%}....>

Les jointures.

Il est possible de faire des jointures principalement sur la table spip_articles.

Exemple afficher les 5 prochains spectacles par ordre de date avec leur titre et les endroits de celles-ci. La jointure sur la table seances_endroits se fera automatiquement dans ce cas.

<B_prochains><ul>
<BOUCLE_prochains (SEANCES articles){age_seance <= 0}{par date_seance}{0,5}{statut=publie}>
<li>[(#TITRE)] [(#DATE_SEANCE|affdate)] - [(#DATE_SEANCE|heure_seance)] - [(#NOM_ENDROIT)]</li>
</BOUCLE_prochains>
</ul></B_prochains>

Afficher les dates et lieux d’un spectacle donné

<B_lesseances><ul>
<BOUCLE_lesseances (SEANCES seances_endroits){id_article}{par date_seance}{statut=publie}>
	<li>[(#DATE_SEANCE|affdate)] - #NOM_ENDROIT - #REMARQUE_SEANCE*</li>
</BOUCLE_lesseances>
</ul></B_lesseances>

Afficher les séances des spectacles d’une rubrique donnée.

<BOUCLE_lesseances (SEANCES seances_endroits){id_rubrique}{par date_seance}{statut=publie}>
	<li>[(#TITRE)] - [(#DATE_SEANCE|affdate)] - #NOM_ENDROIT - #REMARQUE_SEANCE*</li>
</BOUCLE_lesseances>

Voir dans le dossier tests du plugins pour d’autres exemples de boucles.

Squelettes définis par le plugin

flux rss
rss_seances_article, rss_seances_rubrique, rss_seances fournissent respectivement les flux rss pour un article, une rubrique ou tout le site. (On pourra les modifier pour qu’ils affichent les séances à venir ou toutes les séances passées et à venir).

l’appel se fait classiquement par #URL_PAGE dans le contexte d’un article ou d’une rubrique pour les deux premiers.

// dans le contexte d'un article
[(#URL_PAGE{rss_seances_article,id_article=#ID_ARTICLE})]
// dans celui d'une rubrique
[(#URL_PAGE{rss_seances_rubrique,id_rubrique=#ID_RUBRIQUE})]
// pour tout les séances du site
[(#URL_PAGE{rss_seances})]

agenda ical
De même ical_seances_article, ical_seances_rubrique, ical_seances fournissent respectivement les agenda au format iCalendar auxquels on peut s’abonner via le client ou le service en ligne adéquat (ical, lithning, netvibes,…) pour un article, une rubrique ou tout le site.
En outre un squelette ics_seance (sans S) permet de télécharger un fichier au format .ics, que l’on peut importer ou ajouter à la volée dans son agenda favori.

Les méthodes d’appel sont semblables à celles des fluxx rss.

Dans les deux cas (flux rss et ical) si aucune séance n’est définie, les squelettes ne retournent rien et produisent donc une erreur 404.

À faire

Gestion plus fine des autorisations (avec cfg ?).
Compatibilité Champs Extra 2 À partir de la version 1.1

Plugin disponible sur la zone

Merci à Matthieu pour ses chats et programmer spip
Merci à Cédric pour la partie activation des séances sur une rubrique inspirée du plugin agenda.

Discussion

32 discussions

  • 4
    eyeless

    Bonjour

    Je tenais à remercier l’auteur de ce module qui m’a bien servi pour créer le site du ciné-club dont je fait parti.

    Ici l’adresse du site http://culture-et-cinema.com

    Merci encore

    • Bonjour,

      Comment faîtes-vous pour afficher l’agenda du mercredi au samedi seulement ?
      Horaires de la semaine en cours & Horaires des prochaines séances ?

      Merci.

    • Bonjour

      On doit pouvoir travailler avec les âges le critère age_seance devant fonctionner.

      // numéro du jour courant dans la semaine (0 pour le dimanche, 1 le lundi,…
      [(#SET{lejour,[(#VAL{w}|date{})]})]
      // age de debut pour la plage
      [(#SET{age_debut,[(#VAL{3}|moins{#GET{lejour})]})]
      // age de fin pour la plage
      [(#SET{age_fin,[(#VAL{7}|moins{#GET{lejour})]})]
      
      et pour les boucles on a alors
      
      <BOUCLE_a (SEANCES){age_seance <= #GET{age_debut}}{age_seance > #GET{age_fin}}{...}>

      On prend la fin au dimanche pour avoir le samedi en entier avec une inégalité stricte sur l’age de fin.
      Pour la semaine suivante il suffit de remplacer 3 par 10 et 7 par 14.

      Une autre solution est de définir une fonction qui donne les dates des jours de la semaine courante en fonction du numéro du jour.

      Dans mes_fonctions.php définir

      function jour_semaine($lejour = 0){
      	// jour = numero du jour de la semaine
      	// dimanche= 0, lundi = 1, mardi = 2, mercredi = 3,...
      	$jour = date('d');
      	$mois = date('m');
      	$an = date('Y');
      	// numero du jour en cours
      	$num_jour = date('w');
      	
      	$date = mktime(0, 0, 0, $mois, $jour-$num_jour+$lejour, $an);
      	return date('Y-m-d H:i:s',$date);
      }

      On peut alors l’utiliser avec

      [(#SET{date_debut,[(#VAL{3}|jour_semaine)]})]
      [(#SET{date_debut,[(#VAL{7}|jour_semaine)]})]
      et
      <BOUCLE_a (SEANCES) {date_seance >= #GET{date_debut}} {date_seance < #GET{date_fin}} {...}>

      On travaille alors directement avec les dates des séances. Avantage on peut même utiliser
      [(#VAL{3}|jour_semaine|affdate)] pour afficher la date du mercredi par exemple. De même on décale de 7 jours pour la plage suivante.

      Dis-nous si cela fonctionne.

    • Merci j’essaye ça.

    • Du coup comment créer un calendrier avec les séances ?

    Répondre à ce message

  • 2
    Etienne

    Bonjour,
    Très intéressant. Je vais refaire le site d’une association en spip3 et en profiter pour intégrer ce plugin, ce qui facilitera la tâche des rédacteurs par rapport à mon bricolage actuel. Une compatibilité du plugin avec spip3 est-elle envisagée à moyen terme ?
    Merci d’avance,
    Etienne

    • C’est envisagé… Il faut en avoir le temps.
      Le code est sur la zone si le cœur t’en dit…

    • Etienne

      Oups, Là c’est très loin de mes compétences. Et il n’y a aucune urgence de mon côté. Je te souhaite un bon courage.

    Répondre à ce message

  • Bonjour,

    Je pense que le commit sur le plugin iterateurs que j’ai fait ce matin vous intéressera, avec de belles perspectives cinéphiles.

    Soit permettre de récupérer automatiquement les flux cinémas : horaires des séances d’un cinéma donné, ou d’une zone géographique, ou d’un film à partir de l’api d’allocine... que l’on peut saluer au passage, pour une fois qu’un code cinema est ouvert et utilisable simplement !

    http://zone.spip.org/trac/spip-zone...

    Répondre à ce message

  • 1
    fouinette

    Bonjour,
    Par rapport au site du cinéma sur lequel je travaille, je suis très intéressée par le formulaire de recherche de séances en fonction de plusieurs critères visible sur le site du Festival International du Film (page Agenda/calendrier des séances).
    Mais étant nulle en programmation, je suis incapable de mettre cela en place moi-même. Est-ce qu’il existe un page expliquant la mise en place d’un tel formulaire ou pouvez-vous me dire vous-même comment vous avez fait ?
    Merci !

    • Voir dans le dossier « test-exemples » du plugin.
      Faire une copie des deux fichiers du dossier « formulaires » contenu dans celui-ci (recherche_seances.html et .php) vers un dossier « formulaires » de ton dossier « squelettes » si il existe sinon le créer.
      seances_recherche.html contient l’appel du formulaire et la boucle de traitement. Copier-coller dans le squelette d’une page de ton site que tu peux appeler comme tu veux et habiller de même.

      L’essentiel est là. Ensuite il est possible de personnaliser l’affichage ou le traitement des résultats suivant les besoins.

    Répondre à ce message

  • 2

    Bonjour,

    J’ai un petit problème avec le plugin séance. Bien que les tables aient été créée, que le plugin soit activé, lorsque je saisi un endroit, celui-ci n’est pas enregistré. Je n’ai aucun message d’erreur.
    Après saisie du lieu, je fais enregistrer. Le plugin me renvoie sur ma page admin de spip et lorsque je reviens dans les lieux, l’endroit saisie n’est pas enregistré et ne peut être par conséquent sélectionné.

    Je travail sous la version SPIP 2.1.8

    Je vous remercie
    Peter Din

    Répondre à ce message

  • Bonjour,
    Je suis aussi intéressé par ce genre de plugins, mais dans mon cas c’est plus pour des expositions.
    J’ai fait cela en utilisant les date et date de rédac pour exprimer le début et la fin de l’événement.
    Qui sont ensuite interprétées dans des boucles par des dates futurs, des dates futurs proches (un mois avant), des dates futurs très proches (une semaine avant), des dates vernissages (présent) et ensuite des dates pendant expo, et finalement une date après (archive).

    Je me demandais si c’était difficile d’adapter ce plugin pour mon approche ?
    Est-ce que je me lance ? Est-ce que quelqu’un d’autre est intéressé par cette version ?

    Bonne année
    G

    [MàJ] : Bon je m’excuse je viens de voir qu’il y avait Agenda 2.0

    Répondre à ce message

  • 1

    Bonjour,

    De passage sur ce site, je trouve votre système fort intéressant et utile ...

    Petites questions :
    -  est-il possible de limiter le nombre de places disponibles pour chaque séance ?
    -  est-il possible qu’une personne s’inscrive pour réserver une place et ainsi lui confirmer sa réservation par e-mail en y joignant un document (ou un lien clikable) par exemple l’affiche ou une autre pub ?

    Merci

    • Bonjour
      Le plugin ne gère pas d’aspects de réservations d’origine. Il est compatible Champs Extra 2. On peut donc tout à fait définir un nombre de places par salle ou séance. Reste à gérer les réservations par un système ou un autre.

    Répondre à ce message

  • 1

    Bonsoir,

    Ton plugin a rencontré l’enthousiasme des usagers à qui je l’ai montré.

    Par contre, comme le site que nous envisageons va traiter non d’un cinéma, mais de tous les cinémas d’une zone géographique (que nous espérons relativement vaste). Il serait utile d’avoir un ou des champs supplémentaires (zone géographique, par exemple).

    Tu signales dans ton texte que le plugin n’est pas compatible avec Champs extra 2. Dès lors, comment est-il possible d’envisager l’ajoût d’un champ dans l’un des deux tables ?

    • Merci pour l’enthousiasme :)

      Pour le reste il n’est pas évident que ce ne soit qu’une question de champs extra. cela dépend pas mal de la façon de structurer les données, de l’utilisation des objets de spip (hiérarchie rubriques > articles, mots-clés,…).
      Je te contacte en privé pour parler de tout cela, ici ce serait probablement trop long et hors sujet.

    Répondre à ce message

  • 4

    J’ai souhaité faire une boucle imbriquée pour grouper les séances d’un film par lieu de diffusion.

    Cela donne, dans une boucle article :

    <B_lieux>
    <ul >
    <BOUCLE_lieux (SEANCES seances_endroits){id_article}{par id_endroit}>
    	<li>>#NOM_ENDROIT
    	<B_lesseances>
    	<ul >
    	<BOUCLE_lesseances(SEANCES){id_endroit}>
    		<li>[(#DATE_SEANCE|affdate)] [- (#DATE_SEANCE|heures)]h[(#DATE_SEANCE|minutes)] [<br>(#REMARQUE_SEANCE)]</li>
    	</BOUCLE_lesseances>
    	</ul>
    	</B_lesseances>
    </BOUCLE_lieux>
    </ul>
    </B_lieux>

    Qui me restitue des lignes multiples : si un film à n séances prévue, la liste des séances de ce film apparaît n fois
    Ce doit-être une pécadille, mais je n’arrive pas à trouver quoi modifier pour avoir une liste unique.

    • 1. il faut un critère unique sur les endroits (pour qu’ils ne s’affichent qu’une fois)
      2. je suppose qu’un film = 1 article donc pour les séances (boucle lesseances) il faut aussi filtrer sur l’id_article, mais à cause du contexte il faut sauvegarder celle-ci par un #SET.

      ce qui donne

      <h3>Par lieux</h3>
      #SET{film,#ID_ARTICLE}	
      <B_lieux>
      <ul >
      <BOUCLE_lieux (SEANCES){id_article}>
      	<BOUCLE_lelieu (SEANCES_ENDROITS){id_endroit}{par id_endroit}{unique}>
              <li>>#NOM_ENDROIT
              <B_lesseances>
              <ul>
              <BOUCLE_lesseances(SEANCES){id_endroit}{id_article=#GET{film}}>
                      <li>[(#DATE_SEANCE|affdate)] [- (#DATE_SEANCE|heures)]h[(#DATE_SEANCE|minutes)] [<br>(#REMARQUE_SEANCE*)]</li>
              </BOUCLE_lesseances>
              </ul>
              </B_lesseances>
              </li>
          </BOUCLE_lelieu>
      </BOUCLE_lieux>
      </ul>
      </B_lieux>
    • Merci beaucoup de ta réponse, rapide et efficace !

      J’avoue que je ne comprends pas pourquoi il est nécessaire de passer par une variable et cela reste encore un peu mystérieux, mais l’écureuil se laisse apprivoiser petit à petit.

    • Le code ci-dessus prend place dans une boucle affichant les articles, par exemple
      <BOUCLE_lesfilms(ARTICLES){id_rubrique}...>
      ou <BOUCLE_lefilm(ARTICLES}{id_article}...>
      la boucle _lieux récupère id_article de la boucle qui l’englobe (du style d’une des deux ci-dessus). Donc pas d’ambiguïté pour celle-ci.

      La boucle _lesseances est englobée dans la boucle _lelieu, elle récupère donc id_article de cette dernière. Dans ce cas ce serait l’id de l’article rattaché au lieu (puisque c’est prévu de pouvoir rattacher un lieu à un article).

      Voilà pourquoi il faut fixer dans une variable id_article hérité de la boucle englobante ou de l’environnement, pour filtrer les séances uniquement rattachées au film en cours de traitement.

      Voir l’article la partie « Des critères d’environnement en cascade ».

    • C’est très clair. Merci.

    Répondre à ce message

  • 3

    Je suis très intéressé par ce plugin qui correspond à une fonctionnalité à laquelle nous réflechissions depuis quelques temps.

    Hélas, il est indiqué qu’il faut être en SPIP 2.1, alors que nous sommes bloqué en 2.0.12.
    Y’a t’il moyen d’espérer une compatibilité ? Je veux bien servir de testeur pour cela.

    Merci de me donner votre avis sur la question.

    • J’avais développé en 2.1 et testé en 2.0 . Ça ne passait pas avec cette version (2.0).
      Bonne nouvelle, je viens de le faire en 2.0.12 et ça fonctionne très bien. Il suffit de changer le « necessite » dans le fichier plugin.xml et de mettre 2.0.12 à la place de 2.1.
      <necessite id="SPIP" version="[2.0.12;]" />

      Après il faudrait redescendre pour voir à partir de quelle version il y a problème mais je ne pense pas que le jeu en vaille la chandelle.

    • Bonjour Domiw,

      Merci de ton indication. Effectivement cela semble marcher.
      Pour ce qui est de l’intérêt de s’assurer la compatibilité avec les version précédente, cela ne me paraît pas du tout anodin.

      En effet, certains plugins utillsés mais pas encore adaptés en version récente obligent sans certains cas de retarder la mises à jour.
      Ajoute à cela l’hésitation légitime de mettre à jour un site et de risquer de tout casser si celui-ci est en production et représente un enjeu critique (je passerai sous silence les adaptations ’en dur’ car c’est mal).

      Bref, les raison pour ne pas être sur la version la plus récente de SPIP sont nombreuses et ta réaction me semble illustrer le mal endémique de SPIP qui rend ce magnifique logiciel si délicat à utiliser pour des application pérennes.

      Donc, oui je t’encourage à vérifier la compatibilité descendant de ce plugin.

      Amicalement.

    • Je pense que la discussion serait longue sur certains points de ton argumentaire (investissement, temps, envies, compétences,...) par rapport au développement des plugins.

      Bref après tests la version limite est la 2.0.10. Ce sera modifié dans l’article et dans le fichier plugin.xml

    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 :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

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.

Qui êtes-vous ?
[Se connecter]

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