diff --git a/calendar/calendar_import_form.php b/calendar/calendar_import_form.php new file mode 100644 index 0000000..e2b9ec0 --- /dev/null +++ b/calendar/calendar_import_form.php @@ -0,0 +1,49 @@ +libdir.'/formslib.php'); +require_once($CFG->dirroot.'/calendar/lib.php'); + +class calendar_import_form extends moodleform { + + /** + * Defines the form elements + */ + function definition() { + $mform =& $this->_form; + $mform->addElement('header', 'importheader', 'Select iCal file to import:'); + $mform->addElement('file', 'importfile', get_string('importcalendar', 'calendar')); + $mform->addElement('hidden', 'courseid'); + + $mform->addElement('submit', 'preview', 'Preview Import'); + } +} + +class calendar_import_confirm_form extends moodleform { + + /** + * Defines the form elements + */ + function definition() { + global $allowed, $courseid; + $mform =& $this->_form; + $mform->addElement('header', 'confirmheader', 'Import these events as:'); + $mform->addElement('hidden', 'calendar'); + $mform->addElement('hidden', 'courseid'); + $radio = array(); + + if($allowed->site) { + $radio[] = &MoodleQuickForm::createElement('radio', 'eventtype', '', get_string('globalevents', 'calendar'), 1); + } + if($allowed->courses) { + $radio[] = &MoodleQuickForm::createElement('radio', 'eventtype', '', get_string('courseevents', 'calendar'), $courseid); + } + if($allowed->user){ + $radio[] = &MoodleQuickForm::createElement('radio', 'eventtype', '', get_string('userevents', 'calendar'), 0); + } + $mform->addGroup($radio, 'eventtypes', get_string('eventkind', 'calendar')); + + $mform->addElement('submit', 'import', 'Import Events'); + } +} + +?> diff --git a/calendar/import.php b/calendar/import.php new file mode 100644 index 0000000..59c2e12 --- /dev/null +++ b/calendar/import.php @@ -0,0 +1,156 @@ +libdir.'/bennu/bennu.inc.php'); +require_once($CFG->libdir.'/tablelib.php'); +require_once($CFG->dirroot.'/calendar/calendar_import_form.php'); +require_once($CFG->dirroot.'/calendar/lib.php'); + +$courseid = required_param('courseid', PARAM_INT); +$course = get_record('course', 'id', $courseid); + +if ($courseid && $courseid != SITEID) { + require_login($courseid); +} else if ($CFG->forcelogin) { + require_login(); +} + + +$now = usergetdate(time()); +$navlinks = array(); +$navlinks[] = array('name' => get_string('calendar', 'calendar'), + 'link' =>calendar_get_link_href(CALENDAR_URL.'view.php?view=upcoming&course='.$courseid.'&', + $now['mday'], $now['mon'], $now['year']), + 'type' => 'misc'); +$navlinks[] = array('name' => get_string('importcalendar', 'calendar'), 'link' =>'', 'type' => 'misc'); + +$navigation = build_navigation($navlinks); + +print_header_simple(get_string('importcalendar', 'calendar'), '', $navigation); + +echo '

'.get_string('importcalendar', 'calendar').'

'; + +if (calendar_user_can_add_event()) { + + $mform = new calendar_import_form(); + $data = new stdClass; + $data->courseid = $courseid; + $mform->set_data($data); + + $allowed = new stdClass; + calendar_get_allowed_types($allowed); + + $importform = new calendar_import_confirm_form(); + if($data = $importform->get_data()) { + + $ical = new iCalendar; + $ical->unserialize($data->calendar); + $eventcount = 0; + $updatecount = 0; + + foreach($ical->components['VEVENT'] as $event) { + $eventrecord = new stdClass; + + $name = $event->properties['SUMMARY'][0]->value; + $name = str_replace('\n', '
', $name); + $name = str_replace('\\', '', $name); + $name = preg_replace('/\s+/', ' ', $name); + $eventrecord->name = clean_param($name, PARAM_CLEAN); + + $description = $event->properties['DESCRIPTION'][0]->value; + $description = str_replace('\n', '
', $description); + $description = str_replace('\\', '', $description); + $description = preg_replace('/\s+/', ' ', $description); + $eventrecord->description = clean_param($description, PARAM_CLEAN); + + $eventrecord->courseid = $data->eventtypes['eventtype']; + $eventrecord->timestart = strtotime($event->properties['DTSTART'][0]->value); + $eventrecord->timeduration = strtotime($event->properties['DTEND'][0]->value) - $eventrecord->timestart; + $eventrecord->uuid = substr($event->properties['UID'][0]->value, 0, 36); // The UUID field only holds 36 characters. + $eventrecord->userid = $USER->id; + $eventrecord->timemodified = time(); + + if($updaterecord = get_record('event', 'uuid', $eventrecord->uuid)) { + $eventrecord->id = $updaterecord->id; + if (update_record('event', $eventrecord)) { + $updatecount++; + } else { + echo '

Failed to update event: '.$eventrecord->name.' '.date('H:i d/m/Y', $eventrecord->timestart).'

'; + } + } else { + if (insert_record('event', $eventrecord)) { + $eventcount++; + } else { + echo '

Failed to add event: '.$eventrecord->name.' '.date('H:i d/m/Y', $eventrecord->timestart).'

'; + } + } + } + echo '

'.$eventcount.' events imported successfully.

'; + echo '

'.$updatecount.' events updated.

'; + echo '

Back to Calendar.

'; + + } else { + if ($formdata = $mform->get_data()) { + $calendar = file_get_contents($_FILES['importfile']['tmp_name']); + $ical = new iCalendar; + $ical->unserialize($calendar); + + echo '

'; + foreach ($ical->parser_errors as $error) { + echo $error.'
'; + } + echo '

'; + + $table = new flexible_table('ical_import'); + $columns = array('summary', 'description', 'start', 'duration', 'uid'); + $headers = array('Summary', 'Description', 'Start', 'Duration', 'UUID'); + $table->define_columns($columns); + $table->define_headers($headers); + $table->setup(); + $count = 0; + + foreach($ical->components['VEVENT'] as $event) { + if($count < 20) { + $mevent = new stdClass; + $mevent->name = $event->properties['SUMMARY'][0]->value; + $mevent->description = $event->properties['DESCRIPTION'][0]->value; + $mevent->timestart = strtotime($event->properties['DTSTART'][0]->value); + $mevent->duration = strtotime($event->properties['DTEND'][0]->value) - $mevent->timestart; + $mevent->uuid = $event->properties['UID'][0]->value; + $mevent->timemodified = time(); + + $row = array(); + $row[] = $mevent->name; + $row[] = $mevent->description; + $row[] = date('d/m/Y H:i', $mevent->timestart); + $row[] = date('H:i', $mevent->duration); + $row[] = $mevent->uuid; + $table->add_data($row); + } + $count++; + + } + echo '

Import Preview

'; + $table->print_html(); + if($count > 20) { + echo ($count-20).' more...'; + } + $toform = new stdClass(); + $toform->courseid = $courseid; + $toform->calendar = $calendar; + $importform->set_data($toform); + $importform->display(); + + } + $mform->display(); + + } +} else { + print_error('nopermissions', 'error', '', 'Create Calendar Entires'); +} + +print_footer(); + + +?> + diff --git a/calendar/view.php b/calendar/view.php index b3245b1..82885a2 100644 --- a/calendar/view.php +++ b/calendar/view.php @@ -179,6 +179,9 @@ .''; } } + if (calendar_user_can_add_event()) { + print_single_button('import.php', array('courseid'=>$courseid), get_string('importcalendar', 'calendar')); + } echo ''; echo '';