Plusieurs articles à la meme date #1

Closed
opened 1 year ago by george · 13 comments
george commented 1 year ago
Collaborator

Hello

Avec un appel:
[(#CALENDRIER_MINI{#ENV{date}, date, #URL_PAGE{jour}, #URL_PAGE{calendrier_mini.json}})]

dans le calendrier, quand un jour contient un article, le click sur ce jour ouvre la page jour.
Mais quand un jour contient plus d'un article, le click sur ce jour ne produit rien.

Hello Avec un appel: `[(#CALENDRIER_MINI{#ENV{date}, date, #URL_PAGE{jour}, #URL_PAGE{calendrier_mini.json}})]` dans le calendrier, quand un jour contient un article, le click sur ce jour ouvre la page jour. Mais quand un jour contient plus d'un article, le click sur ce jour ne produit rien.
Poster
Collaborator

Evidemment, le probleme est le même avec les evenements du plugin Agenda

Evidemment, le probleme est le même avec les evenements du plugin Agenda
Owner

Peux-tu préciser quelle version du plugin et quelle version de SPIP cela concerne ?

Toute la partie JS a été ré-écrite pour SPIP 4 puisqu'on a plus jquery-ui, donc c'est pas du tout la même chose si on parle de la version pour SPIP 3.x ou la version pour SPIP 4

Peux-tu préciser quelle version du plugin et quelle version de SPIP cela concerne ? Toute la partie JS a été ré-écrite pour SPIP 4 puisqu'on a plus jquery-ui, donc c'est pas du tout la même chose si on parle de la version pour SPIP 3.x ou la version pour SPIP 4
Poster
Collaborator

Désolé j'ai oublié de preciser que c'est SPIP 4 et la version 3.0.1 du mini calendrier.

Désolé j'ai oublié de preciser que c'est SPIP 4 et la version 3.0.1 du mini calendrier.
Poster
Collaborator

Je precise que avec SPIP 3.2.11 et minicalendrier 2.4.3 le probleme ne se pose pas.

Je precise que avec SPIP 3.2.11 et minicalendrier 2.4.3 le probleme ne se pose pas.
Collaborator

SPIP 4.0.4, php 7.4, calendrier-mini à jour, je viens également de constater le même problème. Sur contrib un message fait référence au même souci.
On peut constater le pb sur ce site à la date du 6 mars par exemple (trois évènements) https://www.echecs-occitanie.fr/

SPIP 4.0.4, php 7.4, calendrier-mini à jour, je viens également de constater le même problème. Sur contrib un message fait référence au même souci. On peut constater le pb sur ce site à la date du 6 mars par exemple (trois évènements) https://www.echecs-occitanie.fr/
Collaborator

La page jour fonctionne bien, par exemple
https://www.echecs-occitanie.fr/spip.php?page=jour&date_debut=2022-3-20
pour le 20 mars
c'est juste le lien qui ne se fait pas à partir de calendrier_mini

La page jour fonctionne bien, par exemple https://www.echecs-occitanie.fr/spip.php?page=jour&date_debut=2022-3-20 pour le 20 mars c'est juste le lien qui ne se fait pas à partir de calendrier_mini
Collaborator

Un dernier mot :

  • le 5 mars il y a un évènement qui dure deux jours, 5 et 6 mars. Le 6 mars il y a trois évènements.
  • Si je clique d'abord sur le 5 mars, la page de l'evenement unique s'affiche : plugins/auto/agenda/v4.3.7/squelettes/content/evenement.html
  • A partir de cette page si je clique sur le dimanche 6 mars, la page jour s'affiche avec ses trois évènements plugins/auto/agenda/v4.3.7/squelettes/content/jour.html
Un dernier mot : * le 5 mars il y a un évènement qui dure deux jours, 5 et 6 mars. Le 6 mars il y a trois évènements. * Si je clique d'abord sur le 5 mars, la page de l'evenement unique s'affiche : plugins/auto/agenda/v4.3.7/squelettes/content/evenement.html * A partir de cette page si je clique sur le dimanche 6 mars, la page jour s'affiche avec ses trois évènements plugins/auto/agenda/v4.3.7/squelettes/content/jour.html
Collaborator

Bonjour,

je suis nouveau par ici, mais utilisateur de longue date des plugins agenda + calendrier mini. Alors que je testais en local une montée de version SPIP 3.2.x > 4.0.x j'ai été confronté au problème mentionné ici, sur lequel j'ai d'abord cherché de l'aide en passant par SPIP Contrib, puis SPIP Discuter.

Le site que je gère référence beaucoup d'événements avec une proportion relativement équilibrée d'évenements sur 1 jour (concerts) et sur une plage de dates (expositions, spectacles), et un nombre assez conséquent pour que même sur ce mois d'aout, 80% peut-être des dates référencent plusieurs événements. Avec ce bug cela signifie que 80% des dates ne sont plus cliquables. Hors de questions donc pour moi de basculer en production tant que ce problème n'était pas résolu.

Je fais un copier/coller (a peu près) de mes explications partagées sur SPIP Discuter :

Le problème est donc dans le JS dans le fichier calendrier_mini.js.html du Calendrier Mini.

Je ne maitrise pas tout, mais je pense avoir compris que :

le plugin fait appel au datepicker JQuery qui est basé sur une liste de date (cliquables), appelons là LD1
Au clic sur une date, JQuery renvoie une liste LD2 avec 1 élément en moins : la date cliquée.
Partant de là, le Calendrier Mini 3.0.x parcourt la liste LD1 et vérifie si l’élément est bien dans LD2. Si ce n’est pas le cas (index = -1), alors il estime qu’il a trouvé la date cliquée et génère l’URL en conséquence.

Le problème :

Dans le cas d’événement multiples pour un jour J, la liste LD1 va ressembler par exemple à ça si on a 2 événements au 2 septembre :

  • 2022-09-01
  • 2022-09-02
  • 2022-09-02
  • 2022-09-03

Du coup, si l’utilisateur clique sur le 2 sept. la liste LD2 sera la suivante après suppression de l’élément cliqué :

  • 2022-09-01
  • 2022-09-02
  • 2022-09-03

Et donc quel que soit l’élément parcouru de LD1, on le trouve dans LD2 (puisque l’un a été supprimé, mais il en reste encore 1 puisqu’il y avait 2 événements pour cette date), et le plugin n’arrive pas à trouver la date qui a été cliquée et donc à produire l’URL cible. CQFD.

Proposition de solution :
Je me suis rendu compte que les 2 listes étaient bien classées exactement de la même façon, donc si un élément de LD1 a été supprimé pour produire LD2, au bout d’un moment on doit avoir LD1[n] qui n’est plus égal à LD2[n] et si on arrive à détecter le moment où le déphasage apparait, alors on tient la date qui a été cliquée.

Si je reprends l’exemple ci dessus, pour que ca fonctionne je parcours LD2 jusqu’à arriver à LD2[3] (3 sept.) qui est différent de LD1[3] (2 sept.) donc je tiens la date cliquée : 2022-09-02 qui correspond à LD1[3].
Par contre comme je suis dans une boucle et que ce déphasage se vérifie jusqu’à la fin de la boucle, j’insère toutes ces dates dans un tableau arrayDephasage[], et j’irai chercher la première fois que ce déphasage s’est produit arrayDephasage[0] pour récupérer la date cliquée et enfin générer l’URL.

Bon, c’est hyper alambiqué, mais justement je me pose des questions sur le choix de l’utilisation du date Picker JS… Bon après ca ne représente que 6 lignes de JS.

J’évoquais dans un précédent message de possibles problèmes de performances, mais je pense que c’est très lié à la nature des événements. Sur le site que je gère on est sur des expos qui s’étalent par exemple sur 3-4 mois, donc les listes à traiter dépassent facilement les 100 éléments (100 dates).

Je vous propose mes quelques lignes de code, mais même si ce n'est pas le plus propre j'ai bien envie de l'optimiser en forçant une sortie de la boucle (on gagne du temps en rompant la boucle et en evitant de contruire un autre tableau).
Après ceci est ma solution dans l'urgence pour me débloquer, mais peut-être que qqun qui maitrise mieux le fonctionnement interne de ce plugin, de ses dépendances avec JQuery trouvera une meilleure solution.

Comme dit sur SPIP Discuter, je ne maitrise pas (encore) Git, donc je propose juste et je laisse les gens compétents reporter la correction dans le code.

Par rapport au Calendrier Mini 3.0.2, ma modif consiste à remplacer les lignes 218 à 230 par celles-ci :

    var arrayDephasage = [];
    for (var i in e.dates) {
        var d = this.currentDates[i].getFullYear()+'-'+(this.currentDates[i].getMonth()+1)+'-'+this.currentDates[i].getDate();
        var de = e.dates[i].getFullYear()+'-'+(e.dates[i].getMonth()+1)+'-'+e.dates[i].getDate();
        if (d != de) {
            arrayDephasage.push(d);
                            }
    }
    var datePicked;	
        datePicked = arrayDephasage[0];
        var url = me.attr('data-url');
        url = parametre_url(url,me.attr('data-vardate'),datePicked);
    //	console.log("REDIRECT",url);
        window.location = url;
Bonjour, je suis nouveau par ici, mais utilisateur de longue date des plugins agenda + calendrier mini. Alors que je testais en local une montée de version SPIP 3.2.x > 4.0.x j'ai été confronté au problème mentionné ici, sur lequel j'ai d'abord cherché de l'aide en passant par SPIP Contrib, puis SPIP Discuter. Le site que je gère référence beaucoup d'événements avec une proportion relativement équilibrée d'évenements sur 1 jour (concerts) et sur une plage de dates (expositions, spectacles), et un nombre assez conséquent pour que même sur ce mois d'aout, 80% peut-être des dates référencent plusieurs événements. Avec ce bug cela signifie que 80% des dates ne sont plus cliquables. Hors de questions donc pour moi de basculer en production tant que ce problème n'était pas résolu. Je fais un copier/coller (a peu près) de mes explications partagées sur SPIP Discuter : Le problème est donc dans le JS dans le fichier calendrier_mini.js.html du Calendrier Mini. Je ne maitrise pas tout, mais je pense avoir compris que : le plugin fait appel au datepicker JQuery qui est basé sur une liste de date (cliquables), appelons là LD1 Au clic sur une date, JQuery renvoie une liste LD2 avec 1 élément en moins : la date cliquée. Partant de là, le Calendrier Mini 3.0.x parcourt la liste LD1 et vérifie si l’élément est bien dans LD2. Si ce n’est pas le cas (index = -1), alors il estime qu’il a trouvé la date cliquée et génère l’URL en conséquence. **Le problème :** Dans le cas d’événement multiples pour un jour J, la liste LD1 va ressembler par exemple à ça si on a 2 événements au 2 septembre : * 2022-09-01 * 2022-09-**02** * 2022-09-**02** * 2022-09-03 Du coup, si l’utilisateur clique sur le 2 sept. la liste LD2 sera la suivante après suppression de l’élément cliqué : * 2022-09-01 * 2022-09-**02** * 2022-09-03 Et donc quel que soit l’élément parcouru de LD1, on le trouve dans LD2 (puisque l’un a été supprimé, mais il en reste encore 1 puisqu’il y avait 2 événements pour cette date), et le plugin n’arrive pas à trouver la date qui a été cliquée et donc à produire l’URL cible. CQFD. **Proposition de solution :** Je me suis rendu compte que les 2 listes étaient bien classées exactement de la même façon, donc si un élément de LD1 a été supprimé pour produire LD2, au bout d’un moment on doit avoir LD1[n] qui n’est plus égal à LD2[n] et si on arrive à détecter le moment où le déphasage apparait, alors on tient la date qui a été cliquée. Si je reprends l’exemple ci dessus, pour que ca fonctionne je parcours LD2 jusqu’à arriver à LD2[3] (3 sept.) qui est différent de LD1[3] (2 sept.) donc je tiens la date cliquée : 2022-09-02 qui correspond à LD1[3]. Par contre comme je suis dans une boucle et que ce déphasage se vérifie jusqu’à la fin de la boucle, j’insère toutes ces dates dans un tableau arrayDephasage[], et j’irai chercher la première fois que ce déphasage s’est produit arrayDephasage[0] pour récupérer la date cliquée et enfin générer l’URL. Bon, c’est hyper alambiqué, mais justement je me pose des questions sur le choix de l’utilisation du date Picker JS… Bon après ca ne représente que 6 lignes de JS. J’évoquais dans un précédent message de possibles problèmes de performances, mais je pense que c’est très lié à la nature des événements. Sur le site que je gère on est sur des expos qui s’étalent par exemple sur 3-4 mois, donc les listes à traiter dépassent facilement les 100 éléments (100 dates). Je vous propose mes quelques lignes de code, mais même si ce n'est pas le plus propre j'ai bien envie de l'optimiser en forçant une sortie de la boucle (on gagne du temps en rompant la boucle et en evitant de contruire un autre tableau). Après ceci est ma solution dans l'urgence pour me débloquer, mais peut-être que qqun qui maitrise mieux le fonctionnement interne de ce plugin, de ses dépendances avec JQuery trouvera une meilleure solution. Comme dit sur SPIP Discuter, je ne maitrise pas (encore) Git, donc je propose juste et je laisse les gens compétents reporter la correction dans le code. **Par rapport au Calendrier Mini 3.0.2**, ma modif consiste à remplacer les lignes 218 à 230 par celles-ci : var arrayDephasage = []; for (var i in e.dates) { var d = this.currentDates[i].getFullYear()+'-'+(this.currentDates[i].getMonth()+1)+'-'+this.currentDates[i].getDate(); var de = e.dates[i].getFullYear()+'-'+(e.dates[i].getMonth()+1)+'-'+e.dates[i].getDate(); if (d != de) { arrayDephasage.push(d); } } var datePicked; datePicked = arrayDephasage[0]; var url = me.attr('data-url'); url = parametre_url(url,me.attr('data-vardate'),datePicked); // console.log("REDIRECT",url); window.location = url;
Owner

merci de ton retour et de ta proposition de patch ! je vais regarder ça en détail pour l'intégrer

merci de ton retour et de ta proposition de patch ! je vais regarder ça en détail pour l'intégrer
Collaborator

Bon et bien voilà une version optimée.
On sort de la boucle FOR dès qu'on a trouvé le déphasage, donc on ne construit plus le tableau.
Et bien sûr toutes les dates qui ont un ou plusieurs événements sont cliquables.

Et en bonus le code est lui aussi plus léger.

    for (var i in e.dates) {
        var datePicked = this.currentDates[i].getFullYear()+'-'+(this.currentDates[i].getMonth()+1)+'-'+this.currentDates[i].getDate();
        var dateE = e.dates[i].getFullYear()+'-'+(e.dates[i].getMonth()+1)+'-'+e.dates[i].getDate();
        if (datePicked != dateE) break;
    }
    var url = me.attr('data-url');
    url = parametre_url(url,me.attr('data-vardate'),datePicked);
    //console.log("REDIRECT",url);
    window.location = url;
Bon et bien voilà une version optimée. On sort de la boucle FOR dès qu'on a trouvé le déphasage, donc on ne construit plus le tableau. Et bien sûr toutes les dates qui ont un ou plusieurs événements sont cliquables. Et en bonus le code est lui aussi plus léger. for (var i in e.dates) { var datePicked = this.currentDates[i].getFullYear()+'-'+(this.currentDates[i].getMonth()+1)+'-'+this.currentDates[i].getDate(); var dateE = e.dates[i].getFullYear()+'-'+(e.dates[i].getMonth()+1)+'-'+e.dates[i].getDate(); if (datePicked != dateE) break; } var url = me.attr('data-url'); url = parametre_url(url,me.attr('data-vardate'),datePicked); //console.log("REDIRECT",url); window.location = url;
Owner

j'ai regardé en détail grace à tes indications et j'ai envoyé un patch dans 2e73431 qui corrige le problème et optimise un peu le code au passage. Merci @Fabrice_A

C'est dans la v3.0.3

j'ai regardé en détail grace à tes indications et j'ai envoyé un patch dans 2e73431 qui corrige le problème et optimise un peu le code au passage. Merci @Fabrice_A C'est dans la v3.0.3
cerdic closed this issue 1 month ago
Collaborator

\o/ Bravo !

\o/ Bravo !
Collaborator

Ah du coup je vais étudier les différences car j'ai cru voir que tu avais traité le problème différemment. Plus en amont il me semble.
Bon en tout cas c'est top, je vais installer cette nouvelle version.
Merci bien !

Ah du coup je vais étudier les différences car j'ai cru voir que tu avais traité le problème différemment. Plus en amont il me semble. Bon en tout cas c'est top, je vais installer cette nouvelle version. Merci bien !
Sign in to join this conversation.
No Label
No Milestone
No Assignees
4 Participants
Notifications
Due Date

No due date set.

Dependencies

This issue currently doesn't have any dependencies.

Loading…
There is no content yet.