calendarexporter: TODO: write new list module, ics creation improvements

This commit is contained in:
Christoph Haas 2012-12-06 23:10:23 +00:00
parent 76c2f9192a
commit 8f9248aaff
5 changed files with 153 additions and 11 deletions

View File

@ -22,6 +22,15 @@ Zarafa.plugins.calendarimporter.data.ResponseHandler = Ext.extend(Zarafa.core.da
this.successCallback(response); this.successCallback(response);
}, },
/**
* Call the successCallback callback function.
* @param {Object} response Object contained the response data.
*/
doList : function(response)
{
this.successCallback(response);
},
/** /**
* In case exception happened on server, server will return * In case exception happened on server, server will return
* exception response with the code of exception. * exception response with the code of exception.

View File

@ -395,11 +395,18 @@ Zarafa.plugins.calendarimporter.dialogs.ImportPanel = Ext.extend(Ext.form.FormPa
}); });
container.getRequest().singleRequest( container.getRequest().singleRequest(
'calendarexportermodule', 'appointmentlistmodule',
'export', 'list',
{ {
calFolder : calValue, groupDir: "ASC",
calIndex : selIndex, restriction: {
startdate: 0,
duedate: 2145826800 // 2037... highest unix timestamp
},
sort: [{
"field": "startdate",
"direction": "DESC"
}],
store_entryid : calendarFolder.data.store_entryid, store_entryid : calendarFolder.data.store_entryid,
entryid : calendarFolder.data.entryid entryid : calendarFolder.data.entryid
}, },
@ -415,14 +422,42 @@ Zarafa.plugins.calendarimporter.dialogs.ImportPanel = Ext.extend(Ext.form.FormPa
*/ */
exportDone : function(response) exportDone : function(response)
{ {
if(response.status === true) { if(response.item.length > 0) {
container.getNotifier().notify('info', 'Exported', 'Exported ' + response.entries + ' entries'); // call export function here!
var responseHandler = new Zarafa.plugins.calendarimporter.data.ResponseHandler({
successCallback: this.downLoadICS.createDelegate(this)
});
container.getRequest().singleRequest(
'calendarexportermodule',
'export',
{
data: response,
calendar: this.calendarselector.value
},
responseHandler
);
container.getNotifier().notify('info', 'Exported', 'Exported ' + response.item.length + ' entries');
} else { } else {
container.getNotifier().notify('error', 'Export Failed', 'Failed to export your calendar'); container.getNotifier().notify('info', 'Export Failed', 'There were no items to export!');
} }
this.dialog.close(); this.dialog.close();
}, },
/**
* download ics file =)
* @param {Object} response
* @private
*/
downLoadICS : function(response)
{
if(response.status === true) {
document.location.href = 'plugins/calendarimporter/php/download.php?fileid='+response.fileid+'&basedir='+response.basedir+'&secid='+response.secid+'&realname='+response.realname;
} else {
container.getNotifier().notify('error', 'Export Failed', 'ICal File creation failed!');
}
},
importCheckedEvents: function () { importCheckedEvents: function () {
//receive existing calendar store //receive existing calendar store
var selIndex = this.calendarselector.selectedIndex; var selIndex = this.calendarselector.selectedIndex;

23
php/download.php Normal file
View File

@ -0,0 +1,23 @@
<?php
$basedir = $_GET["basedir"];
$secid = $_GET["secid"];
$fileid = $_GET["fileid"];
$realname = $_GET["realname"];
$secfile = $basedir . "/secid." . $secid;
$icsfile = $basedir . "/" . $fileid . "." . $secid;
// if the secid file exists -> download!
if(file_exists($secfile)) {
@header("Last-Modified: " . @gmdate("D, d M Y H:i:s",time()) . " GMT");
@header("Content-type: text/calendar");
header("Content-Length: " . filesize($icsfile));
header("Content-Disposition: attachment; filename=" . $realname . ".ics");
//write ics
readfile($icsfile);
unlink($secfile);
unlink($icsfile);
}
?>

View File

@ -76,11 +76,86 @@ class CalendarexporterModule extends Module {
return $result; return $result;
} }
private function randomstring($length = 6) {
// $chars - all allowed charakters
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
srand((double)microtime()*1000000);
$i = 0;
while ($i < $length) {
$num = rand() % strlen($chars);
$tmp = substr($chars, $num, 1);
$pass = $pass . $tmp;
$i++;
}
return $pass;
}
private function createSecIDFile($secid) {
$lockFile = TMP_PATH . "/secid." . $secid;
$fh = fopen($lockFile, 'w') or die("can't open secid file");
$stringData = date(DATE_RFC822);
fwrite($fh, $stringData);
fclose($fh);
}
private function writeICSHead($fh, $calname) {
$icshead = "BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:-//Zarafa Webapp//Zarafa Calendar Exporter//DE\nMETHOD:PUBLISH\nX-WR-CALNAME:" . $calname. "\n";
fwrite($fh, $icshead);
}
private function writeICSEnd($fh) {
$icsend = "END:VCALENDAR";
fwrite($fh, $icsend);
}
private function writeEvent($fh, $event) {
$head = "BEGIN:VEVENT\n";
$end = "END:VEVENT\n";
$fields = array(
"DTSTART" => $event["startdate"],
"DTEND" => $event["duedate"],
"DTSTAMP" => $event["creation_time"],
"DESCRIPTION" => "nothing...",
"LOCATION" => $event["location"],
"SUMMARY" => $event["subject"]
);
fwrite($fh, $head);
// event fields:
foreach ($fields as $key => $value) {
fwrite($fh, $key . ": " . $value . "\n");
}
unset($fields);
fwrite($fh, $end);
}
private function exportCalendar($actionType, $actionData) { private function exportCalendar($actionType, $actionData) {
/* look up functionality in class.appointmentlistmodule.php (webapp/server/modules)*/ $secid = $this->randomstring();
$this->createSecIDFile($secid);
$tmpname = stripslashes($actionData["calendar"] . ".ics." . $this->randomstring(8));
$filename = TMP_PATH . "/" . $tmpname . "." . $secid;
// create ics file....
$fh = fopen($filename, 'w') or die("can't open ics file");
$this->writeICSHead($fh, $actionData["calendar"]);
foreach($actionData["data"]["item"] as $event) {
$this->writeEvent($fh, $event["props"]);
}
$this->writeICSEnd($fh);
fclose($fh);
$response['status'] = true; $response['status'] = true;
$response['entries'] = "1002"; // number of entries that will be exported $response['fileid'] = $tmpname; // number of entries that will be exported
$response['basedir'] = TMP_PATH;
$response['secid'] = $secid;
$response['realname'] = $actionData["calendar"];
$this->addActionData($actionType, $response); $this->addActionData($actionType, $response);
$GLOBALS["bus"]->addData($this->getResponseData()); $GLOBALS["bus"]->addData($this->getResponseData());