You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

228 lines
8.7 KiB

<?php
/**
* @package tikiwiki
*/
// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
//
// All Rights Reserved. See copyright.txt for details and a complete list of authors.
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
// $Id$
use Tiki\TikiInit;
require_once('tiki-setup.php');
$access->check_feature('feature_calendar');
$access->check_permission('tiki_p_view_events');
// Initialization
TikiInit::appendIncludePath("lib/ical/");
include_once('lib/ical/iCal.php');
// list calendars //
$calendarlib = TikiLib::lib('calendar');
// ###trebly:B10111:[FIX-ADD-ENH]-> there are several meaning for the same var $calendarViewMode
if (! isset($calendarViewMode)) {
// ###trebly:B10111:[FIX-ADD-ENH]-> $calendarViewMode become an array, several bugs comes from confusion of global values and parameters by ref
// for calendars : (main-)calendar, action_calendar, mod_calendar, mod_action_calendar the changes of values by url request is terrible
// for the moment 01/11/2011:11:55 just one value is used with index 'default', but initialisation is done.
// The init is actually into two places, tiki-calendar_setup.php and tiki-calendar_export.php will be grouped for clean
// $prefs would be added when need, $_SESSION, $PARAMS too this now generates not any change in the behavior.
$calendarViewMode = [casedefault => 'month',calgen => 'month',calaction => 'month',modcalgen => 'month',modcalaction => 'month',trackercal => 'month'];
if (! empty($_REQUEST['viewmode'])) {
$calendarViewMode['casedefault'] = $_REQUEST['viewmode'];
} elseif (! empty($_SESSION['CalendarViewMode'])) {
$calendarViewMode['casedefault'] = $_SESSION['CalendarViewMode'];
} else {
$calendarViewMode['casedefault'] = $prefs['calendar_view_mode'];
}
}
# If specified, limit the export to the maximum number of records (events)
# indicated in the request; otherwise, the limit is from the global preferences.
if (isset($_REQUEST['maxRecords'])) {
$maxRecords = $_REQUEST['maxRecords'];
}
if (isset($_SESSION['CalendarFocusDate'])) {
$startTime = $_SESSION['CalendarFocusDate'];
} else {
// by default, export will start from yesterday's events.
$startDate = new TikiDate();
$startDate->addDays(-1);
$startTime = $startDate->getTime();
}
if (isset($_REQUEST['start_date_Month'])) {
$startTime = TikiLib::make_time(0, 0, 0, $_REQUEST['start_date_Month'], $_REQUEST['start_date_Day'], $_REQUEST['start_date_Year']);
} elseif (isset($_REQUEST["tstart"])) {
$startTime = $_REQUEST["tstart"];
}
$endDate = new TikiDate();
$endDate->setDate($startTime);
if ($calendarViewMode['casedefault'] == 'month') {
$stopTime = $endDate->addMonths(1);
} elseif ($calendarViewMode['casedefault'] == 'quarter') {
$stopTime = $endDate->addMonths(3);
} elseif ($calendarViewMode['casedefault'] == 'semester') {
$stopTime = $endDate->addMonths(6);
} elseif ($calendarViewMode['casedefault'] == 'year') {
$stopTime = $endDate->addMonths(12);
} else {
$stopTime = $endDate->addMonths(1);
}
$stopTime = $endDate->getTime();
if (isset($_REQUEST['stop_date_Month'])) {
$stopTime = TikiLib::make_time(0, 0, 0, $_REQUEST['stop_date_Month'], $_REQUEST['stop_date_Day'], $_REQUEST['stop_date_Year']);
} elseif (isset($_REQUEST["tstop"])) {
$stopTime = $_REQUEST["tstop"];
}
$calendarIds = [];
if (isset($_REQUEST['calendarIds'])) {
$calendarIds = $_REQUEST['calendarIds'];
foreach ($calendarIds as $anId) {
$smarty->assign('individual_' . $anId, $userlib->object_has_one_permission($anId, 'calendar'));
}
} else {
if (! isset($_REQUEST["calendarId"])) {
$_REQUEST["calendarId"] = 0;
} else {
$smarty->assign('individual_' . $_REQUEST["calendarId"], $userlib->object_has_one_permission($_REQUEST["calendarId"], 'calendar'));
}
}
$sort_mode = "name";
$find = "";
$calendars = $calendarlib->list_calendars(0, -1, $sort_mode, $find);
foreach (array_keys($calendars["data"]) as $i) {
$calendars["data"][$i]["individual"] = $userlib->object_has_one_permission($i, 'calendar');
}
$smarty->assign('calendars', $calendars["data"]);
// export calendar //
if (((is_array($calendarIds) && (count($calendarIds) > 0)) or isset($_REQUEST["calendarItem"]) ) && $_REQUEST["export"] == 'y') {
// get calendar events
if (! isset($_REQUEST["calendarItem"])) {
$events = $calendarlib->list_raw_items($calendarIds, $user, $startTime, $stopTime, -1, $maxRecords, $sort_mode = 'start_asc', $find = '');
} else {
$events[] = $calendarlib->get_item($_REQUEST["calendarItem"]);
}
if (isset($_REQUEST['csv'])) {
header('Content-type: text/csv');
header("Content-Disposition: inline; filename=tiki-calendar.csv");
$first = true;
$description = '';
foreach ($events as $event) {
$line = '';
foreach ($event as $name => $field) {
if ($first === true) {
$description .= '"' . $name . '";';
}
if (is_array($field)) {
$line .= '"' . str_replace(["\n","\r",'"'], ['\\n','','""'], join(',', $field)) . '";';
} else {
$line .= '"' . str_replace(["\n","\r",'"'], ['\\n','','""'], $field) . '";';
}
}
if ($first === true) {
echo (trim($description, ';')) . "\n";
$first = false;
}
echo trim($line, ';') . "\n";
}
} else {
// create ical
$userlb = TikiLib::get('Users');
$vcalendar = new Sabre\VObject\Component\VCalendar();
foreach ($events as $event) {
$vevent = [];
$vevent['SUMMARY'] = $event['name'];
$vevent['DTSTART'] = (new DateTime())->setTimestamp($event['start']);
$vevent['DTEND'] = (new DateTime())->setTimestamp($event['end']);
$vevent['DESCRIPTION'] = preg_replace(
'/\n/',
"\\n",
strip_tags(
TikiLib::lib('parser')->parse_data(
$event['description'],
['is_html' => $prefs['calendar_description_is_html'] === 'y']
)
)
);
$vevent['DTSTAMP'] = (new DateTime())->setTimestamp($event['created']);
$vevent['LAST-MODIFIED'] = (new DateTime())->setTimestamp($event['lastModif']);
$vevent['CONTACT'] = $event['user']; // Name
if (! empty($event['url'])) {
$vevent['URL'] = $event['url'];
}
$vevent['UID'] = 'tiki-' . $event['calendarId'] . '-' . $event['calitemId'];
$vcalEvent = $vcalendar->add('VEVENT', $vevent);
foreach ($event['organizers'] as $organizer) {
$orgEmail = $userlib->get_user_email($organizer);
if (! empty($orgEmail)) {
$vcalEvent->add('ORGANIZER', $orgEmail, ['CN' => $organizer]);
} elseif (filter_var($organizer, FILTER_VALIDATE_EMAIL) !== false) {
$vcalEvent->add('ORGANIZER', $organizer);
}
}
foreach ($event['participants'] as $attendee) {
$attendeeEmail = $userlib->get_user_email($attendee['name']);
if (! empty($attendeeEmail)) {
$vcalEvent->add('ATTENDEE', $attendeeEmail, ['CN' => $attendee['name']]);
} else {
if (filter_var($attendee['name'], FILTER_VALIDATE_EMAIL) !== false) {
$vcalEvent->add('ATTENDEE', $attendee);
}
}
}
}
$calendar_str = $vcalendar->serialize();
header("Content-Length: " . strlen($calendar_str));
header("Expires: 0");
// These two lines fix pb with IE and HTTPS
header("Cache-Control: private");
header("Pragma: dummy=bogus");
// Outlook needs iso8859 encoding
header("Content-Type:text/calendar; method=REQUEST; charset=iso-8859-15");
header("Content-Transfer-Encoding:quoted-printable");
$re_encode = stripos($_SERVER['HTTP_USER_AGENT'], 'windows'); // only re-encode to ISO-8859-15 if client on Windows
if (function_exists('recode') && $re_encode !== false) {
print(recode('utf-8..iso8859-15', $calendar_str));
} elseif (function_exists('iconv') && $re_encode !== false) {
print(iconv("UTF-8", "ISO-8859-15", $calendar_str));
} else {
print($calendar_str); // UTF-8 is good for other platforms
}
}
die;
}
$smarty->assign('iCal', $iCal);
// Display the template
$smarty->assign('mid', 'tiki-calendar_export_ical.tpl');
$smarty->display("tiki.tpl");