Импортировать iCal (ics) с полным календарем? - PullRequest
11 голосов
/ 23 февраля 2012

Что нужно сделать, чтобы загрузить файлы .ics с fullcalendar? К сожалению, я не могу использовать php или .net.

Ответы [ 4 ]

8 голосов
/ 29 февраля 2012

Вам нужно написать собственное расширение для fullcalendar (аналогично gcal.js, поставляемому с fullcalendar), которое вы можете назвать ical.js

Вы должны знать, что написание полноценного синтаксического анализатора может быть довольно утомительным, поэтому вы можете рассмотреть возможность использования календаря Google для своего сервера, если у вас нет веских причин.

Если вы пойдете по пути разработки собственного расширения для fullcalendar, вы можете захотеть взглянуть на существующий синтаксический анализатор jquery ( здесь - заявление об отказе от ответственности: я никогда не пробовал этот плагин)

5 голосов
/ 13 ноября 2017

Мне удается это сделать.Не так сложно, как я думал.Я использую ical.js в качестве парсера ics.После синтаксического анализа я получаю объект json, который содержит всю информацию в ИКС.Затем просмотрите его и создайте объект события в соответствии с определением объекта события FullCalendar .

Обновление с помощью FullCalendar v4 и получение событий

As v4 изменил код инициализации , и приведенный ниже код не учитывается при повторяющихся событиях. Вот пример, который работает и работает с версией v4:

$.get(calendarUrl).then(function (data) {
     // parse the ics data
     var jcalData = ICAL.parse(data.trim());
     var comp = new ICAL.Component(jcalData);
     var eventComps = comp.getAllSubcomponents("vevent");
     // map them to FullCalendar events
     var events = $.map(eventComps, function (item) {

        if (item.getFirstPropertyValue("class") == "PRIVATE") {
            return null;
        }
        else {
            var toreturn = {
                "title": item.getFirstPropertyValue("summary"),
                "location": item.getFirstPropertyValue("location"),
            };
            var rrule=item.getFirstPropertyValue("rrule");
            if(rrule!= null){ //event recurs
                toreturn.rrule={};
                if(rrule.freq) toreturn.rrule.freq=rrule.freq;
                if(rrule.parts.BYDAY) toreturn.rrule.byweekday=rrule.parts.BYDAY;
                if(rrule.until) toreturn.rrule.until=rrule.until.toString();
                if(rrule.until) toreturn.rrule.until=rrule.until.toString();
                if(rrule.interval) toreturn.rrule.interval=rrule.interval;
                var dtstart=item.getFirstPropertyValue("dtstart").toString();
                var dtend=item.getFirstPropertyValue("dtend").toString();
                toreturn.rrule.dtstart=dtstart;
                //count duration ms
                var startdate=new Date(dtstart);
                var enddate=new Date(dtend);
                toreturn.duration = enddate - startdate;
            }else{
                toreturn.start=item.getFirstPropertyValue("dtstart").toString();
                toreturn.end=item.getFirstPropertyValue("dtend").toString();
            }
            return toreturn;
        }
     });
     var calendarEl = document.getElementById('calendar');
     var calendar = new FullCalendar.Calendar(calendarEl, {

              plugins: [ 'interaction','dayGrid','rrule' ],
              defaultView: 'dayGridWeek',
              displayEventEnd: true,
              header: {
                  left: 'prev,next',
                  center: 'title',
                  right: 'dayGridDay,dayGridWeek,dayGridMonth'
              },
              events: events,
              eventRender: function (info) {
                // console.log(info.event);
                // append location
                if (info.event.extendedProps.location != null && info.event.extendedProps.location != "") {
                    info.el.append(info.event.extendedProps.location );
                }
              }
     });
     calendar.render();
});

Исходный код ответа (v3и ниже):

$.get(calendarUrl).then(function (data) {
// parse the ics data
var jcalData = ICAL.parse(data.trim());
var comp = new ICAL.Component(jcalData);
var eventComps = comp.getAllSubcomponents("vevent");
// console.log(JSON.stringify(eventComps));
// map them to FullCalendar events
var events = $.map(eventComps, function (item) {
    if (item.getFirstPropertyValue("class") == "PRIVATE") {
        return null;
    }
    else {
        return {
            "title": item.getFirstPropertyValue("summary") + ";",
            "start": item.getFirstPropertyValue("dtstart").toJSDate(),
            "end": item.getFirstPropertyValue("dtend").toJSDate(),
            "location": item.getFirstPropertyValue("location")
        };
    }
});

// refresh the control
calendarCtrl.fullCalendar('destroy');
calendarCtrl.fullCalendar({
    events: events,
    timeFormat: "H:mm",
    displayEventEnd: true,
    eventRender: function (event, element) {
        // console.log(element);
        // append location
        if (event.location != null && event.location != "") {
            element.append("<span>" + event.location + "</span>");
        }
    },
    header: {
        left: 'title',
        center: '',
        right: 'today,month,basicWeek,listDay prev,next'
    }
});
});
0 голосов
/ 12 апреля 2013

Вы можете импортировать его в Календарь Google, а затем импортировать Календарь Google в FullCalendar.

0 голосов
/ 23 февраля 2012

если у вас есть сайт WordPress, есть приложение для этого.http://wordpress.org/extend/plugins/amr-ical-events-list/

если у вас нет веб-сайта WordPress, пожалуйста, предоставьте еще немного информации, чтобы люди могли более адекватно консультировать в отношении вашей ситуации - есть некоторые специальные сценарии icalendar - я не смотрелна некоторое время, поэтому не могу поручиться за, например: http://phpicalendar.net/

...