2012-06-17 40 views
11

Normalmente este es un evento en el calendario:fullCalendar jQuery, repite todos los lunes?

  { 

       title: 'Test', 

       start: '2012-06-08', 

       end: '2012-06-08', 

       url: 'test/test' 

      }, 

funciona bien. Aunque, ¿cómo puedo hacer 1 evento que se muestra todos los lunes en el calendario? ¿O cada martes y así sucesivamente depende de qué día de la semana/número ingresa? ¿Cuál es el parámetro si existe uno?

Si no existe, ¿puedo de alguna manera modificar y agregar la función para que esto suceda? Entonces puede ingresar un parámetro como repeatEveryWeekDay: 2 (que es lunes), y luego todos los lunes futuros los datos se mostrarán allí.

He intentado buscar en http://arshaw.com/fullcalendar/docs/event_data/Event_Object/ pero no encuentro nada.

+1

Lectores futuros: ahora hay mejores formas de hacerlo (3 años más tarde), pero esto todavía está en los principales resultados de google. Eche un vistazo a http://stackoverflow.com/questions/15161654/recurring-events-in-fullcalendar – slicedtoad

Respuesta

33

fullCalendar permite que, en lugar de pasar una serie de eventos, se puede pasar una función que, por ejemplo, descarga los eventos de un servidor, o dinámicamente genera esos eventos.

La mayoría de los ejemplos en la documentación usan solicitudes HTTP para obtener datos de eventos. Pero la función de devolución de llamada sigue siendo lo suficientemente flexible como para que funcione de la manera que desee.

mira el siguiente ejemplo que acabo de escribir para usted:

$(document).ready(function() { 

    var date = new Date(); 
    var d = date.getDate(); 
    var m = date.getMonth(); 
    var y = date.getFullYear(); 

    $('#calendar').fullCalendar({ 
     header: { 
      left: 'prev,next today', 
      center: 'title', 
      right: 'month,agendaWeek,agendaDay' 
     }, 
     editable: true, 
     events: [ 
      // some original fullCalendar examples 
      { 
       title: 'All Day Event', 
       start: new Date(y, m, 1) 
      }, 
      { 
       title: 'Long Event', 
       start: new Date(y, m, d-5), 
       end: new Date(y, m, d-2) 
      }, 
      { 
       id: 999, 
       title: 'Repeating Event', 
       start: new Date(y, m, d-3, 16, 0), 
       allDay: false 
      } 
     ] 
    }); 

    // adding a every monday and wednesday events: 
    $('#calendar').fullCalendar('addEventSource',   
     function(start, end, callback) { 
      // When requested, dynamically generate virtual 
      // events for every monday and wednesday. 
      var events = []; 

      for (loop = start.getTime(); 
       loop <= end.getTime(); 
       loop = loop + (24 * 60 * 60 * 1000)) { 

       var test_date = new Date(loop); 

       if (test_date.is().monday()) { 
        // we're in Moday, create the event 
        events.push({ 
         title: 'I hate mondays - Garfield', 
         start: test_date 
        }); 
       } 

       if (test_date.is().wednesday()) { 
        // we're in Wednesday, create the Wednesday event 
        events.push({ 
         title: 'It\'s the middle of the week!', 
         start: test_date 
        }); 
       } 
      } // for loop 

      // return events generated 
      callback(events); 
     } 
    ); 
}); 

La función anterior genera automáticamente un evento para todos los lunes y miércoles entre las dos fechas. Las fechas se indican en los parámetros start y end. Esos parámetros se pasan por fullCallendar. Los eventos generados por la función anterior se devuelven al fullCallendar a través de la función callback en el tercer parámetro.

Uso DateJS para comprobar si una fecha dada es lunes.

ACTUALIZACIÓN: Si desea mezclar eventos estáticos y/o [más de] eventos repetibles, puede usar addEventSource.

+0

¡Gracias por su buena respuesta! ¿Puedes mostrarme cómo puedo mezclar eventos estáticos con fechas reales y más de un evento repetible todos juntos? – Karem

+1

¡Claro! He actualizado el código de ejemplo. He usado 'addEventSource' para agregar dos eventos repetibles. –

+0

¡Muchas gracias! Estoy realmente cerca de mi objetivo, estoy mezclando php y js para obtener mi objetivo. Ahora tengo una variable js que puede ser de 1 a 7, 1 es el domingo y el sábado 7, ¿cómo puedo hacerlo si es 2 lo que debería verificar es(). Lunes() y 3 es(). Martes() ¿y así? :-) Sin que tenga muchos duplicados del mismo código para obtener este – Karem

1

Es el campo de ID del objeto de evento que determina la repetibilidad de ese evento. Use la misma ID para todos sus eventos repetidos para un día particular de la semana.

+0

Hmm ¿No lo entiendo? Por ejemplo, quiero repetir el ejemplo anterior todos los lunes, así que en lugar de tener TONELADAS de elementos en los eventos [] con fechas de lunes del año, ¿estoy buscando un elemento que el calendario completo muestre cada lunes futuro sin una fecha específica? – Karem

+1

No creo que FullCalendar lo admita por defecto. Si no hay datos en el objeto events [], ¿cómo debería mostrar esos eventos? Puede configurar esto programáticamente utilizando una devolución de llamada como 'viewDisplay', pero incluso allí tendrá que crear objetos de evento. A menos que edite el código para agregar un nuevo parámetro de configuración, creo que deberá lograrlo teniendo un objeto por evento en su matriz de eventos [], con el mismo ID para repetir eventos. – ganeshk

+0

¿Por qué debería tener la misma identificación? ¿Cuál es el problema aquí? ¿Y necesitaría generar por PHP todas las próximas fechas de lunes del año actual solo para mostrarlas cada lunes? ? – Karem

1

La mejor manera que encontré para resolver un evento de repetición es configurar una llamada JSON al idioma de tu back-end (estoy usando Django/Python).

por lo que en las opciones del calendario me hubiera:

events: { url: '/event-data', cache: false },

Luego, en mi back-end que se aprovechan de los parámetros que son enviadas para el actual calendario 'inicio' que aparece y URL 'fin' variables GET. Es decir:

hxxp://example.com:8000/event-data?start=2014-09-28&end=2014-11-09&_=1413553318353

una petición GET se envía desde las opciones de eventos, que a continuación, crear eventos de un archivo de base de datos/fuente que se enumeran los eventos de la repetición, junto con los eventos del calendario regular, y enviar de vuelta sólo la lista de eventos que ocurren en ese rango de fechas en una lista JSON.

6

Una pequeña actualización de la publicación de Christopher Ramírez. Usando fullCalendar en v2.2.3 y momentjs en v2.8.4 es necesario modificar par de líneas en el fragmento anterior para hacer que funcione:

Primero:

function(start, end, callback) {} 

a

function(start, end, status, callback) {} 

como tercer parámetro es un booleano y el cuarto es la función de devolución de llamada

Luego:

for (loop = start.getTime(); 
    loop <= end.getTime(); 
... 

a

for (loop = start._d.getTime(); 
    loop <= end._d.getTime(); 

como los objetos de inicio y finalización pasados ​​a la función no son objetos Date y llamando .getTime() sobre ellos terminarán en 'Indefinido no es una función' error.

Y eso es todo! Estas enmiendas lo hicieron funcionar para mí.

+0

Por favor, aplique esta edición. – user3806549

Cuestiones relacionadas