IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

jQuery Discussion :

Fullcalendar et eventReceive


Sujet :

jQuery

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 9
    Par défaut Fullcalendar et eventReceive
    Bonjour à tous,

    J'utilise Fullcalender pour avoir un planning en ligne pour une association. J'utilise des drag and drop externes afin que ce soit plus facile à l'utilisation.

    En bref, il s'agit d'un planning ou on peut venir dropper des agents (d'une div externe au calendrier) et de les entrer dans les jours correspondant. Il est possible de modifier le jour et l'heure de l'évenement par drag and drop et de le supprimer en cliquant dessus. Cela reste relativement simple.

    Si j'utilise les eventsObjects de fullcalendar "Select" ou "Drop" aucun problème j'arrive a entrer une valeur et cela s'enregistre, idem pour un udpate avec drop. Mais lorsque j'essaie avec eventReceive, le navigateur internet me retourne
    TypeError: a.isValid is not a function
    J'ai eu beau recherché des heures je ne trouve pas d'où viens mon erreur et n'ai pas trouvé non plus de réponse sur internet.

    Pouvez-vous m'éclairer ?


    Merci d'avance

    index.php
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset='utf-8' />
      <link href='css/fullcalendar.css' rel='stylesheet' />           
      <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.4.0/fullcalendar.css" />
      <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha.6/css/bootstrap.css" />
      <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.4.0/fullcalendar.min.js"></script>
      <script>
     
        $(document).ready(function() {
     
            /* initialize the external events
            -----------------------------------------------------------------*/
     
            $('#external-events .fc-event').each(function() {
     
                // store data so the calendar knows to render an event upon drop
                $(this).data('event', {
                    title: $.trim($(this).text()), // use the element's text as the event title
                    stick: true // maintain when user navigates (see docs on the renderEvent method)
                });
     
                // make the event draggable using jQuery UI
                $(this).draggable({
                    zIndex: 999,
                    revert: true,      // will cause the event to go back to its
                    revertDuration: 0  //  original position after the drag
                });
     
            });
     
     
        /* initialize the calendar
        -----------------------------------------------------------------*/
     
        $(document).ready(function() {
           var calendar = $('#calendar').fullCalendar({
            editable:true,
            droppable:true,
            header:{
             left:'prev,next today',
             center:'title',
             right:'month,agendaWeek,agendaDay'
            },
            events: 'load.php',
            eventReceive: function(start, end, allDay)
            {
              var title = event.title;
              var start = $.fullCalendar.formatDate(start, "Y-MM-DD HH:mm:ss");
              var end = $.fullCalendar.formatDate(end, "Y-MM-DD HH:mm:ss");
              $.ajax({
               url:"insert.php",
               type:"POST",
               data:{title:title, start:start, end:end},
               success:function()
               {
                calendar.fullCalendar('refetchEvents');
                alert("Added Successfully");
               }
              })
            },
            editable:true,
            eventResize:function(event)
            {
             var start = $.fullCalendar.formatDate(event.start, "Y-MM-DD HH:mm:ss");
             var end = $.fullCalendar.formatDate(event.end, "Y-MM-DD HH:mm:ss");
             var title = event.title;
             var id = event.id;
             $.ajax({
              url:"update.php",
              type:"POST",
              data:{title:title, start:start, end:end, id:id},
              success:function(){
               calendar.fullCalendar('refetchEvents');
               alert('Event Update');
              }
             })
            },
     
            eventDrop:function(event)
            {
             var start = $.fullCalendar.formatDate(event.start, "Y-MM-DD HH:mm:ss");
             var end = $.fullCalendar.formatDate(event.end, "Y-MM-DD HH:mm:ss");
             var title = event.title;
             var id = event.id;
             $.ajax({
              url:"update.php",
              type:"POST",
              data:{title:title, start:start, end:end, id:id},
              success:function()
              {
               calendar.fullCalendar('refetchEvents');
               alert("Event Updated");
              }
             });
            },
     
            eventClick:function(event)
            {
             if(confirm("Are you sure you want to remove it?"))
             {
              var id = event.id;
              $.ajax({
               url:"delete.php",
               type:"POST",
               data:{id:id},
               success:function()
               {
                calendar.fullCalendar('refetchEvents');
                alert("Event Removed");
               }
              })
             }
            },
     
           });
          });
          });
     
      </script>
     
    </head>
    <body>
        <div id='wrap'>
     
            <div id='external-events'>
                <h4>Draggable Events</h4>
                <div class='fc-event' data-event='1'>Agent 1</div>
                <div class='fc-event' data-event='2'>Agent 2</div>
                <div class='fc-event' data-event='3'>Agent 3</div>
                <div class='fc-event' data-event='4'>Agent 4</div>
                <div class='fc-event' data-event='5'>Agent 5</div>
            </div>
     
            <div id='calendar'></div>
     
            <div style='clear:both'></div>
     
        </div>
    </body>
    </html>

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 211
    Par défaut
    Bonjour,
    tu récupères mal tes données, mets un console.log() en entrée de ta fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    eventReceive: function(start, end, allDay)  {
      console.log(arguments)
    et tu devrais voir qu'il te faut initialiser avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var start = $.fullCalendar.formatDate(start.start, "Y-MM-DD HH:mm:ss");
    var end   = $.fullCalendar.formatDate(end.end,     "Y-MM-DD HH:mm:ss");
    ce n'est pas forcément une bonne pratique que d'utiliser des variables internes à une fonction ayant le même nom que les paramètres, juste pour une question de lisibilité.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 9
    Par défaut initialise
    J'ai bien mis un console.log devant et voici le résultat :

    Arguments
    ​0: Object { title: "Agent 1", _id: "_fc2", allDay: true, … }
    ​1: Object { type: "month", name: "month", widgetHeaderClass: "fc-widget-header", … }
    ​callee: function eventReceive(start, end, allDay)
    ​length: 2
    ​Symbol(Symbol.iterator): function values()
    ​<prototype>: Object { … }
    trb.local:52:19
    Je ne suis vraiment pas expert en la matière et je ne vois pas comment initialiser avec le reste ! Et pourquoi les autres fonctions , fonctionnent-elles alors, c'est ce que je ne pige pas .

    En tout cas merci pour ce début de réponse .

  4. #4
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 211
    Par défaut
    Et pourquoi les autres fonctions , fonctionnent-elles alors, c'est ce que je ne pige pas .
    J'ai regardé ton code plus en profondeur et je ne sui spas sûr que tout fonctionne comme tu le voudrais

    On va commencer par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $(document).ready(function () {
      // le code
    });
    une seule de cette directive est nécessaire et il te faut mettre la totalité de ton code à l'intérieur, dupliquer celle-ci fait partie des mauvaises habitudes à ne pas prendre.

    On note que tu dupliques beaucoup de code qu'il est important de factoriser à des fins de lisibilité et de maintenance.

    Commençons pas ta tes fonctions $.ajx({}), tu peux créer une fonction que tu appelleras en son lieu et place.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    /**
     * @param {String} url - fichier serveur appelé
     * @param {Object} param - objet contenant les données à transmettre
     * @param {String} msg - message affiché dans la console
     */
    function sendDatas(url, param, msg) {
      console.log("param : %o\n%s", param, JSON.stringify(param, null, 2))
      $.ajax({
          url: url,
          type: "POST",
          data: param
        })
        .done (function () {
          calendar.fullCalendar('refetchEvents');
          console.log( "Succes :", msg);
        })
        .fail(function (error, textStatus) {
          console.log("Error : %s\n %o", textStatus, error);
        })
        .always(function () {
          console.log( "Always :", msg);
        })
    }
    Celle-ci devrait répondre à tous tes besoin, elle est simplifiable après debugging.

    Une autre qui peut être concernée afin d'éviter des redites, toujours dans le but d'améliorer la lisibilité/maintenance, une seule à ligne à modifier au cas où ! :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function formatDate(date) {
      return $.fullCalendar.formatDate(date, "Y-MM-DD HH:mm:ss");
    }
    Ceci étant passons aux fonctions placées sur tes événements, eventReceive, eventResize, eventDrop et eventClick.

    De part les fonctions définies ci-dessus elles deviennent plus simple à écrire et à lire et pourraient donner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    eventReceive: function (start, end, allDay) {
      console.log("eventReceive :", arguments);
      const data = {
        "title": start.title || UNDEFINED,
        "start": start.start ? formatDate(start.start) : UNDEFINED,
        "end": end.end ? formatDate(end.end) : UNDEFINED
      };
      sendDatas("insert.php", data, "Added Successfully");
    },
    //--
    eventResize: function (event) {
      console.log("eventResize :", event);
      const data = {
        "title": event.title || UNDEFINED,
        "start": event.start ? formatDate(event.start) : UNDEFINED,
        "end": event.end ? formatDate(event.end) : UNDEFINED,
        "id": event.id || UNDEFINED
      };
      sendDatas("update.php", data, "Event Update");
    },
    //--
    eventDrop: function (event) {
      console.log("eventDrop :", event);
      const data = {
        "title": event.title || UNDEFINED,
        "start": event.start ? formatDate(event.start) : UNDEFINED,
        "end": event.end ? formatDate(event.end) : UNDEFINED,
        "id": event.id || UNDEFINED
      };
      sendDatas("update.php", data, "Event Update");
    },
    //--
    eventClick: function (event) {
      console.log("eventClick :", event);
      if (confirm("Are you sure you want to remove it?")) {
        const data = {
          "id": event.id || UNDEFINED
        };
        sendDatas("delete.php", data, "Event Removed");
      }
    }
    Tu noteras que comme on ne maitrise, pas encore, les données celles-ci sont testées et initialisées si non existantes, j'ai juste ajouté une constante UNDEFINED pour pouvoir mieux suivre ce qui se passe et ceci aussi grâce aux console.log() qui jalonne le code. Cette constante est déclarée simplement comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const UNDEFINED = "undefined";
    Au final ton code gagne en clarté et tu seras à même de le modifier ou de le faire évoluer plus facilement.

    Je remets le code en complet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    $(document).ready(function () {
      /* initialize the external events
      -----------------------------------------------------------------*/
      $('#external-events .fc-event').each(function () {
        // store data so the calendar knows to render an event upon drop
        $(this).data('event', {
          title: $.trim($(this).text()), // use the element's text as the event title
          stick: true // maintain when user navigates (see docs on the renderEvent method)
        });
        // make the event draggable using jQuery UI
        $(this).draggable({
          zIndex: 999,
          revert: true, // will cause the event to go back to its
          revertDuration: 0 //  original position after the drag
        });
      });
     
      // les modifications c'est à partir d'ici
      const UNDEFINED = "undefined";
      // fonctions commmunes
      function formatDate(date) {
        return $.fullCalendar.formatDate(date, "Y-MM-DD HH:mm:ss");
      }
      /**
       * @param {String} url - fichier serveur appelé
       * @param {Object} param - objet contenant les données à transmettre
       * @param {String} msg - message affiché dans la console
       */
      function sendDatas(url, param, msg) {
        console.log("param : %o\n%s", param, JSON.stringify(param, null, 2))
        $.ajax({
            url: url,
            type: "POST",
            data: param
          })
          .done (function () {
            calendar.fullCalendar('refetchEvents');
            console.log( "Succes :", msg);
          })
          .fail(function (error, textStatus) {
            console.log("Error : %s\n%o", textStatus, error);
          })
          .always(function () {
            console.log( "Always :", msg);
          })
      }
      /** 
       * initialize the calendar
       */
      var calendar = $('#calendar').fullCalendar({
        editable: true,
        droppable: true,
        header: {
          left: 'prev,next today',
          center: 'title',
          right: 'month,agendaWeek,agendaDay'
        },
        events: 'load.php',
        //--
        eventReceive: function (start, end, allDay) {
          console.log("eventReceive :", arguments);
          const data = {
            "title": start.title || UNDEFINED,
            "start": start.start ? formatDate(start.start) : UNDEFINED,
            "end": end.end ? formatDate(end.end) : UNDEFINED
          };
          sendDatas("insert.php", data, "Added Successfully");
        },
        //--
        eventResize: function (event) {
          console.log("eventResize :", event);
          const data = {
            "title": event.title || UNDEFINED,
            "start": event.start ? formatDate(event.start) : UNDEFINED,
            "end": event.end ? formatDate(event.end) : UNDEFINED,
            "id": event.id || UNDEFINED
          };
          sendDatas("update.php", data, "Event Update");
        },
        //--
        eventDrop: function (event) {
          console.log("eventDrop :", event);
          const data = {
            "title": event.title || UNDEFINED,
            "start": event.start ? formatDate(event.start) : UNDEFINED,
            "end": event.end ? formatDate(event.end) : UNDEFINED,
            "id": event.id || UNDEFINED
          };
          sendDatas("update.php", data, "Event Update");
        },
        //--
        eventClick: function (event) {
          console.log("eventClick :", event);
          if (confirm("Are you sure you want to remove it?")) {
            const data = {
              "id": event.id || UNDEFINED
            };
            sendDatas("delete.php", data, "Event Removed");
          }
        },
      });
    });
    Voilà je te laisse en prendre possession, bon courage !

    PS : pour afficher la console du navigateur, touche F12.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 9
    Par défaut
    Je comprends un peu mieux quelques erreurs effectivement.

    J'y ai apporté les modifications nécessaires et effectivement cela fonctionne à merveille. Je vous remercie pour ce retour très constructif.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème jQuery template (menu-nav et pages)
    Par Graincheux dans le forum Langage
    Réponses: 0
    Dernier message: 25/01/2012, 17h53
  2. Problème JQuery avec JSF
    Par élève_ingénieur dans le forum JSF
    Réponses: 1
    Dernier message: 15/07/2011, 16h17
  3. Problème jQuery Dreamweaver CS5 Code Hinting
    Par Nicooolas dans le forum Dreamweaver
    Réponses: 3
    Dernier message: 03/02/2011, 14h15
  4. JQuery FullCalendar Gerer la TimeZone GMT
    Par silverfab34 dans le forum jQuery
    Réponses: 3
    Dernier message: 24/08/2010, 09h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo