From cbfcd1c7e86aa3d5b87d05a9092287fec4e250c8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 27 Apr 2008 20:31:15 +0000 Subject: [PATCH] Add rss export in agenda module --- htdocs/actioncomm.class.php | 12 +- htdocs/admin/agenda_xcal.php | 3 + htdocs/comm/action/agendaexport.php | 120 +++-- htdocs/lib/xcal.lib.php | 704 ++++++++++++++++------------ 4 files changed, 503 insertions(+), 336 deletions(-) diff --git a/htdocs/actioncomm.class.php b/htdocs/actioncomm.class.php index 999fa6ef5a3..ba9d7e29eae 100644 --- a/htdocs/actioncomm.class.php +++ b/htdocs/actioncomm.class.php @@ -545,13 +545,13 @@ class ActionComm \param filters Array of filters \return int <0 if error, nb of events in new file if ok */ - function build_calfile($format,$type,$cachedelay,$filename,$filters) + function build_exportfile($format,$type,$cachedelay,$filename,$filters) { global $conf,$langs,$dolibarr_main_url_root; require_once (DOL_DOCUMENT_ROOT ."/lib/xcal.lib.php"); - dolibarr_syslog("ActionComm::build_calfile Build cal file format=".$format.", type=".$type.", cachedelay=".$cachedelay.", filename=".$filename.", filters size=".sizeof($filters), LOG_DEBUG); + dolibarr_syslog("ActionComm::build_exportfile Build export file format=".$format.", type=".$type.", cachedelay=".$cachedelay.", filename=".$filename.", filters size=".sizeof($filters), LOG_DEBUG); // Check parameters if (empty($format)) return -1; @@ -602,7 +602,7 @@ class ActionComm } $sql.= " ORDER by datec"; - dolibarr_syslog("ActionComm::build_vcal select events sql=".$sql); + dolibarr_syslog("ActionComm::build_exportfile select events sql=".$sql); $resql=$this->db->query($sql); if ($resql) { @@ -641,14 +641,16 @@ class ActionComm else { $this->error=$this->db->lasterror(); - dolibarr_syslog("ActionComm::build_calfile ".$this->db->lasterror(), LOG_ERR); + dolibarr_syslog("ActionComm::build_exportfile ".$this->db->lasterror(), LOG_ERR); return -1; } // Write file $title='Dolibarr actions'; $desc='List of actions - built by Dolibarr'; - $result=build_calfile($format,$title,$desc,$eventarray,$outputfile); + if ($format == 'ical') $result=build_calfile($format,$title,$desc,$eventarray,$outputfile); + if ($format == 'vcal') $result=build_calfile($format,$title,$desc,$eventarray,$outputfile); + if ($format == 'rss') $result=build_rssfile($format,$title,$desc,$eventarray,$outputfile); } return $result; diff --git a/htdocs/admin/agenda_xcal.php b/htdocs/admin/agenda_xcal.php index e091fd2762d..4a19849b964 100644 --- a/htdocs/admin/agenda_xcal.php +++ b/htdocs/admin/agenda_xcal.php @@ -118,6 +118,9 @@ $message.=$langs->trans("WebCalUrlForVCalExport",'vcal',$urlvcal); $message.='
'; $urlical=''.$urlwithouturlroot.DOL_URL_ROOT.'/comm/action/agendaexport.php?format=ical&type=event&exportkey='.($conf->global->MAIN_AGENDA_XCAL_EXPORTKEY?urlencode($conf->global->MAIN_AGENDA_XCAL_EXPORTKEY):'KEYNOTDEFINED').''; $message.=$langs->trans("WebCalUrlForVCalExport",'ical',$urlical); +$message.='
'; +$urlrss=''.$urlwithouturlroot.DOL_URL_ROOT.'/comm/action/agendaexport.php?format=rss&exportkey='.($conf->global->MAIN_AGENDA_XCAL_EXPORTKEY?urlencode($conf->global->MAIN_AGENDA_XCAL_EXPORTKEY):'KEYNOTDEFINED').''; +$message.=$langs->trans("WebCalUrlForVCalExport",'rss',$urlrss); print info_admin($message); $db->close(); diff --git a/htdocs/comm/action/agendaexport.php b/htdocs/comm/action/agendaexport.php index 1e019490509..3152f628c60 100644 --- a/htdocs/comm/action/agendaexport.php +++ b/htdocs/comm/action/agendaexport.php @@ -29,6 +29,18 @@ require("../../master.inc.php"); require_once(DOL_DOCUMENT_ROOT.'/actioncomm.class.php'); +$mainmenu=isset($_GET["mainmenu"])?$_GET["mainmenu"]:""; +$leftmenu=isset($_GET["leftmenu"])?$_GET["leftmenu"]:""; + +// Define format, type and filter +$format='ical'; +$type='event'; +if (! empty($_GET["format"])) $format=$_GET["format"]; +if (! empty($_GET["type"])) $type=$_GET["type"]; +$filters=array(); +if (! empty($_GET["year"])) $filters['year']=$_GET["year"]; +if (! empty($_GET["idaction"])) $filters['idaction']=$_GET["idaction"]; + // C'est un wrapper, donc header vierge function llxHeader() { print 'Export agenda cal'; } function llxFooter() { print ''; } @@ -37,29 +49,34 @@ function llxFooter() { print ''; } if (! $conf->agenda->enabled) accessforbidden(); + // Check config if (empty($conf->global->MAIN_AGENDA_XCAL_EXPORTKEY)) { $user->getrights(); - + llxHeader(); print '
Module Agenda was not configured properly.
'; llxFooter('$Date$ - $Revision$'); exit; } +// Check exportkey +if (empty($_GET["exportkey"]) || $conf->global->MAIN_AGENDA_XCAL_EXPORTKEY != $_GET["exportkey"]) +{ + $user->getrights(); + + llxHeader(); + print '
Bad value for key.
'; + llxFooter('$Date$ - $Revision$'); + exit; +} -$mainmenu=isset($_GET["mainmenu"])?$_GET["mainmenu"]:""; -$leftmenu=isset($_GET["leftmenu"])?$_GET["leftmenu"]:""; - -// Define format, type, filename and filter -$format='ical'; -$type='event'; +// Define filename $filename=''; -if (! empty($_GET["format"])) $format=$_GET["format"]; if ($format == 'vcal') $filename='dolibarrcalendar.vcs'; if ($format == 'ical') $filename='dolibarrcalendar.ics'; -if (! empty($_GET["type"])) $type=$_GET["type"]; +if ($format == 'rss') $filename='dolibarrcalendar.rss'; // Check filename if (! $filename) { @@ -70,41 +87,70 @@ if (! $filename) llxFooter('$Date$ - $Revision$'); exit; } -// Check exportkey -// \TODO -$filters=array(); -if (! empty($_GET["year"])) $filters['year']=$_GET["year"]; -if (! empty($_GET["idaction"])) $filters['idaction']=$_GET["idaction"]; + $agenda=new ActionComm($db); // Build file -$result=$agenda->build_calfile($format,$type,0,$filename,$filters); -if ($result >= 0) -{ - $encoding='UTF-8'; - $attachment = true; - $type='text/calendar'; - //$type='text/plain'; // OK - //$attachment = false; // OK +if ($format == 'ical' || $format == 'vcal') +{ + $result=$agenda->build_exportfile($format,$type,0,$filename,$filters); + if ($result >= 0) + { + $encoding='UTF-8'; + $attachment = true; + $type='text/calendar'; + //$type='text/plain'; // OK + //$attachment = false; // OK + + if ($encoding) header('Content-Encoding: '.$encoding); + if ($type) header('Content-Type: '.$type); + if ($attachment) header('Content-Disposition: attachment; filename="'.$filename.'"'); + + // Ajout directives pour resoudre bug IE + //header('Cache-Control: Public, must-revalidate'); + //header('Pragma: public'); + + // Clean parameters + $outputfile=$conf->agenda->dir_temp.'/'.$filename; + $result=readfile($outputfile); + if (! $result) print 'File '.$outputfile.' was empty.'; - if ($encoding) header('Content-Encoding: '.$encoding); - if ($type) header('Content-Type: '.$type); - if ($attachment) header('Content-Disposition: attachment; filename="'.$filename.'"'); - - // Ajout directives pour resoudre bug IE - //header('Cache-Control: Public, must-revalidate'); - //header('Pragma: public'); - - // Clean parameters - $outputfile=$conf->agenda->dir_temp.'/'.$filename; - $result=readfile($outputfile); - if (! $result) print 'File '.$outputfile.' was empty.'; - -// header("Location: ".DOL_URL_ROOT.'/document.php?modulepart=agenda&file='.urlencode($filename)); - exit; + // header("Location: ".DOL_URL_ROOT.'/document.php?modulepart=agenda&file='.urlencode($filename)); + exit; + } } +if ($format == 'rss') +{ + $result=$agenda->build_exportfile($format,$type,0,$filename,$filters); + if ($result >= 0) + { + $encoding='iso-8859-1'; + $attachment = false; + $type='application/rss+xml'; + //$type='text/plain'; // OK + //$attachment = false; // OK + + if ($encoding) header('Content-Encoding: '.$encoding); + if ($type) header('Content-Type: '.$type); + if ($attachment) header('Content-Disposition: attachment; filename="'.$filename.'"'); + + // Ajout directives pour resoudre bug IE + //header('Cache-Control: Public, must-revalidate'); + //header('Pragma: public'); + + // Clean parameters + $outputfile=$conf->agenda->dir_temp.'/'.$filename; + $result=readfile($outputfile); + if (! $result) print 'File '.$outputfile.' was empty.'; + + // header("Location: ".DOL_URL_ROOT.'/document.php?modulepart=agenda&file='.urlencode($filename)); + exit; + } +} + + llxHeader(); print '
'.$agenda->error.'
'; llxFooter('$Date$ - $Revision$'); diff --git a/htdocs/lib/xcal.lib.php b/htdocs/lib/xcal.lib.php index b2117b5e8cc..a4d1f821827 100644 --- a/htdocs/lib/xcal.lib.php +++ b/htdocs/lib/xcal.lib.php @@ -1,295 +1,411 @@ - - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - - -/** - \file htdocs/lib/xcal.lib.php - \brief Function to manage calendar files (vcal/ical/...) - \version $Id$ -*/ - -/** - \brief Build a file from an array of events - \param format 'vcal' or 'ical' - \param title Title of export - \param desc Description of export - \param events_array Array of events ('eid','startdate','duration','enddate','title','summary','category','email','url','desc','author') - \param outputfile Output file - \param filter Filter - \return int <0 if ko, Nb of events in file if ok -*/ -function build_calfile($format='vcal',$title,$desc,$events_array,$outputfile,$filter='') -{ - dolibarr_syslog("xcal.lib.php::build_cal_file Build cal file ".$outputfile." to format ".$format); - - if (empty($outputfile)) return -1; - - $calfileh=fopen($outputfile,'w'); - if ($calfileh) - { - $now=mktime(); - - // Print header - fwrite($calfileh,"BEGIN:VCALENDAR\n"); - fwrite($calfileh,"VERSION:2.0\n"); - fwrite($calfileh,"METHOD:PUBLISH\n"); - fwrite($calfileh,"PRODID:-//DOLIBARR ".DOL_VERSION."//EN\n"); - fwrite($calfileh,"CALSCALE:GREGORIAN\n"); - fwrite($calfileh,"X-WR-CALNAME:".utf8_encode($title)."\n"); - fwrite($calfileh,"X-WR-CALDESC:".utf8_encode($desc)."\n"); - //fwrite($calfileh,"X-WR-TIMEZONE:Europe/Paris\n"); - - foreach ($events_array as $date => $event) - { - $eventqualified=true; - if ($filter) - { - // \TODO Add a filter - - $eventqualified=false; - } - - if ($eventqualified) - { - // See http://fr.wikipedia.org/wiki/ICalendar for format - //$uid = dolibarr_print_date($now,'dayhourxcard').'-'.$event['uid']."-export@".$_SERVER["SERVER_NAME"]; - $uid = $event['uid']; - $type = $event['type']; - $startdate = $event['startdate']; - $duration = $event['duration']; - $enddate = $event['enddate']; - $summary = $event['summary']; - $category = $event['category']; - $location = $event['location']; - $email = $event['email']; - $url = $event['url']; - $transparency = $event['transparency']; - $description=eregi_replace('',"\n",$event['desc']); - $description=clean_html($description,0); // Remove html tags - - // Uncomment for tests - //$summary="Resume"; - //$description="Description"; - //$description="MemberValidatedInDolibarr gd gdf gd gdff\nNom: tgdf g dfgdf gfd r ter\nType: gdfgfdf dfg fd gfd gd gdf gdf gfd gdfg dfg ddf\nAuteur: AD01fg dgdgdfg df gdf gd"; - - // Format - $summary=format_cal($format,$summary); - $description=format_cal($format,$description); - - $encoding=''; - if ($format == 'vcal') $encoding='ENCODING=QUOTED-PRINTABLE:'; - - // Output the vCard/iCal VEVENT object - if ($type == 'event') - { - fwrite($calfileh,"BEGIN:VEVENT\n"); - fwrite($calfileh,"UID:".$uid."\n"); - if (! empty($email)) - { - fwrite($calfileh,"ORGANIZER:MAILTO:".$email."\n"); - fwrite($calfileh,"CONTACT:MAILTO:".$email."\n"); - } - if (! empty($url)) - { - fwrite($calfileh,"URL:".$url."\n"); - }; - - fwrite($calfileh,"SUMMARY:".$encoding.$summary."\n"); - fwrite($calfileh,"DESCRIPTION:".$encoding.$description."\n"); - //fwrite($calfileh,'STATUS:CONFIRMED'."\n"); - /* - statvalue = "TENTATIVE" ;Indicates event is - ;tentative. - / "CONFIRMED" ;Indicates event is - ;definite. - / "CANCELLED" ;Indicates event was - ;cancelled. - ;Status values for a "VEVENT" - - statvalue =/ "NEEDS-ACTION" ;Indicates to-do needs action. - / "COMPLETED" ;Indicates to-do completed. - / "IN-PROCESS" ;Indicates to-do in process of - / "CANCELLED" ;Indicates to-do was cancelled. - ;Status values for "VTODO". - - statvalue =/ "DRAFT" ;Indicates journal is draft. - / "FINAL" ;Indicates journal is final. - / "CANCELLED" ;Indicates journal is removed. - ;Status values for "VJOURNAL". - */ - if (! empty($category)) fwrite($calfileh,"CATEGORIES:".$category."\n"); - if (! empty($location)) fwrite($calfileh,"LOCATION:".$location."\n"); - //fwrite($calfileh,"TRANSP:".$transparency."\n"); - //fwrite($calfileh,"CLASS:PUBLIC\n"); // PUBLIC, PRIVATE, CONFIDENTIAL - fwrite($calfileh,"DTSTAMP:".dolibarr_print_date($now,'dayhourxcard')."\n"); - $startdatef = dolibarr_print_date($startdate,'dayhourxcard'); - fwrite($calfileh,"DTSTART:".$startdatef."\n"); - if (empty($enddate)) $enddate=$startdate+$duration; - $enddatef = dolibarr_print_date($enddate,'dayhourxcard'); - fwrite($calfileh,"DTEND:".$enddatef."\n"); - fwrite($calfileh,"END:VEVENT\n"); - } - - // Output the vCard/iCal VTODO object - // ... - //PERCENT-COMPLETE:39 - - // Output the vCard/iCal VJOURNAL object - if ($type == 'journal') - { - fwrite($calfileh,"BEGIN:VJOURNAL\n"); - fwrite($calfileh,"UID:".$uid."\n"); - if (! empty($email)) - { - fwrite($calfileh,"ORGANIZER:MAILTO:".$email."\n"); - fwrite($calfileh,"CONTACT:MAILTO:".$email."\n"); - } - if (! empty($url)) - { - fwrite($calfileh,"URL:".$url."\n"); - }; - - fwrite($calfileh,"SUMMARY:".$encoding.$summary."\n"); - fwrite($calfileh,"DESCRIPTION:".$encoding.$description."\n"); - fwrite($calfileh,'STATUS:CONFIRMED'."\n"); - fwrite($calfileh,"CATEGORIES:".$category."\n"); - fwrite($calfileh,"LOCATION:".$location."\n"); - fwrite($calfileh,"TRANSP:OPAQUE\n"); - fwrite($calfileh,"CLASS:CONFIDENTIAL\n"); - fwrite($calfileh,"DTSTAMP:".dolibarr_print_date($startdatef,'dayhourxcard')."\n"); - - fwrite($calfileh,"END:VJOURNAL\n"); - } - - - // Put other info in comment - /* - $comment=array(); - $comment ['eid'] = $eid; - $comment ['url'] = $linktoevent; - $comment ['date'] = dolibarr_mktime($evttime,"Ymd"); - $comment ['duration'] = $duration; - $comment ['startdate'] = $startdate; - $comment ['enddate'] = $enddate; - fwrite($calfileh,"COMMENT:" . serialize ($comment) . "\n"); - */ - - } - } - - // Footer - fwrite($calfileh,"END:VCALENDAR"); - - fclose($calfileh); - } - else - { - dolibarr_syslog("xcal.lib.php::build_cal_file Failed to open file ".$outputfile." for writing"); - return -2; - } -} - - -function format_cal($format,$string) -{ - $newstring=$string; - - if ($format == 'vcal') - { - $newstring=QPEncode($newstring); - } - if ($format == 'ical') - { - // Replace new lines chars by '\n' - $newstring=eregi_replace("\r\n","\n",$newstring); - $newstring=eregi_replace("\n\r","\n",$newstring); - $newstring=eregi_replace("\n",'\n',$newstring); - // Must not exceed 75 char. Cut with "\r\n"+Space - $newstring=CalEncode($newstring); - } - - return $newstring; -} - -/** - \brief Cut string after 75 chars. Add CRLF+Space. - \param string String to convert - \return string String converted -*/ -function CalEncode($line) -{ - $out = ''; - - $newpara = ''; - - for ($j = 0; $j <= strlen($line) - 1; $j++) - { - $char = substr ( $line, $j, 1 ); - - if ( ( strlen ( $newpara ) + strlen ( $char ) ) >= 75 ) - { - $out .= $newpara . "\r\n "; // CRLF + Space for cal - $newpara = ''; - } - $newpara .= $char; - } - $out .= $newpara; - - return utf8_encode(trim($out)); -} - - -function QPEncode($str,$forcal=0) -{ - $lines = preg_split("/\r\n/", $str); - $out = ''; - - foreach ($lines as $line) - { - $newpara = ''; - - for ($j = 0; $j <= strlen($line) - 1; $j++) - { - $char = substr ( $line, $j, 1 ); - $ascii = ord ( $char ); - - if ( $ascii < 32 || $ascii == 61 || $ascii > 126 ) - $char = '=' . strtoupper ( sprintf("%02X", $ascii ) ); - - if ( ( strlen ( $newpara ) + strlen ( $char ) ) >= 76 ) - { - $out .= $newpara . '=' . "\r\n"; // CRLF - if ($forcal) $out .= " "; // + Space for cal - $newpara = ''; - } - $newpara .= $char; - } - $out .= $newpara; - } - return trim ( $out ); -} - -function QPDecode( $str ) -{ - $out = preg_replace('/=\r?\n/', '', $str); - $out = preg_replace('/=([A-F0-9]{2})/e', chr( hexdec ('\\1' ) ), $out); - - return trim($out); -} - + + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + + +/** + \file htdocs/lib/xcal.lib.php + \brief Function to manage calendar files (vcal/ical/...) + \version $Id$ +*/ + +/** + \brief Build a file from an array of events + \param format 'vcal' or 'ical' + \param title Title of export + \param desc Description of export + \param events_array Array of events ('eid','startdate','duration','enddate','title','summary','category','email','url','desc','author') + \param outputfile Output file + \param filter Filter + \return int <0 if ko, Nb of events in file if ok +*/ +function build_calfile($format='vcal',$title,$desc,$events_array,$outputfile,$filter='') +{ + dolibarr_syslog("xcal.lib.php::build_calfile Build cal file ".$outputfile." to format ".$format); + + if (empty($outputfile)) return -1; + + $calfileh=fopen($outputfile,'w'); + if ($calfileh) + { + $now=mktime(); + + // Print header + fwrite($calfileh,"BEGIN:VCALENDAR\n"); + fwrite($calfileh,"VERSION:2.0\n"); + fwrite($calfileh,"METHOD:PUBLISH\n"); + fwrite($calfileh,"PRODID:-//DOLIBARR ".DOL_VERSION."//EN\n"); + fwrite($calfileh,"CALSCALE:GREGORIAN\n"); + fwrite($calfileh,"X-WR-CALNAME:".utf8_encode($title)."\n"); + fwrite($calfileh,"X-WR-CALDESC:".utf8_encode($desc)."\n"); + //fwrite($calfileh,"X-WR-TIMEZONE:Europe/Paris\n"); + + foreach ($events_array as $date => $event) + { + $eventqualified=true; + if ($filter) + { + // \TODO Add a filter + + $eventqualified=false; + } + + if ($eventqualified) + { + // See http://fr.wikipedia.org/wiki/ICalendar for format + //$uid = dolibarr_print_date($now,'dayhourxcard').'-'.$event['uid']."-export@".$_SERVER["SERVER_NAME"]; + $uid = $event['uid']; + $type = $event['type']; + $startdate = $event['startdate']; + $duration = $event['duration']; + $enddate = $event['enddate']; + $summary = $event['summary']; + $category = $event['category']; + $location = $event['location']; + $email = $event['email']; + $url = $event['url']; + $transparency = $event['transparency']; + $description=eregi_replace('',"\n",$event['desc']); + $description=clean_html($description,0); // Remove html tags + + // Uncomment for tests + //$summary="Resume"; + //$description="Description"; + //$description="MemberValidatedInDolibarr gd gdf gd gdff\nNom: tgdf g dfgdf gfd r ter\nType: gdfgfdf dfg fd gfd gd gdf gdf gfd gdfg dfg ddf\nAuteur: AD01fg dgdgdfg df gdf gd"; + + // Format + $summary=format_cal($format,$summary); + $description=format_cal($format,$description); + + $encoding=''; + if ($format == 'vcal') $encoding='ENCODING=QUOTED-PRINTABLE:'; + + // Output the vCard/iCal VEVENT object + if ($type == 'event') + { + fwrite($calfileh,"BEGIN:VEVENT\n"); + fwrite($calfileh,"UID:".$uid."\n"); + if (! empty($email)) + { + fwrite($calfileh,"ORGANIZER:MAILTO:".$email."\n"); + fwrite($calfileh,"CONTACT:MAILTO:".$email."\n"); + } + if (! empty($url)) + { + fwrite($calfileh,"URL:".$url."\n"); + }; + + fwrite($calfileh,"SUMMARY:".$encoding.$summary."\n"); + fwrite($calfileh,"DESCRIPTION:".$encoding.$description."\n"); + //fwrite($calfileh,'STATUS:CONFIRMED'."\n"); + /* + statvalue = "TENTATIVE" ;Indicates event is + ;tentative. + / "CONFIRMED" ;Indicates event is + ;definite. + / "CANCELLED" ;Indicates event was + ;cancelled. + ;Status values for a "VEVENT" + + statvalue =/ "NEEDS-ACTION" ;Indicates to-do needs action. + / "COMPLETED" ;Indicates to-do completed. + / "IN-PROCESS" ;Indicates to-do in process of + / "CANCELLED" ;Indicates to-do was cancelled. + ;Status values for "VTODO". + + statvalue =/ "DRAFT" ;Indicates journal is draft. + / "FINAL" ;Indicates journal is final. + / "CANCELLED" ;Indicates journal is removed. + ;Status values for "VJOURNAL". + */ + if (! empty($category)) fwrite($calfileh,"CATEGORIES:".$category."\n"); + if (! empty($location)) fwrite($calfileh,"LOCATION:".$location."\n"); + //fwrite($calfileh,"TRANSP:".$transparency."\n"); + //fwrite($calfileh,"CLASS:PUBLIC\n"); // PUBLIC, PRIVATE, CONFIDENTIAL + fwrite($calfileh,"DTSTAMP:".dolibarr_print_date($now,'dayhourxcard')."\n"); + $startdatef = dolibarr_print_date($startdate,'dayhourxcard'); + fwrite($calfileh,"DTSTART:".$startdatef."\n"); + if (empty($enddate)) $enddate=$startdate+$duration; + $enddatef = dolibarr_print_date($enddate,'dayhourxcard'); + fwrite($calfileh,"DTEND:".$enddatef."\n"); + fwrite($calfileh,"END:VEVENT\n"); + } + + // Output the vCard/iCal VTODO object + // ... + //PERCENT-COMPLETE:39 + + // Output the vCard/iCal VJOURNAL object + if ($type == 'journal') + { + fwrite($calfileh,"BEGIN:VJOURNAL\n"); + fwrite($calfileh,"UID:".$uid."\n"); + if (! empty($email)) + { + fwrite($calfileh,"ORGANIZER:MAILTO:".$email."\n"); + fwrite($calfileh,"CONTACT:MAILTO:".$email."\n"); + } + if (! empty($url)) + { + fwrite($calfileh,"URL:".$url."\n"); + }; + + fwrite($calfileh,"SUMMARY:".$encoding.$summary."\n"); + fwrite($calfileh,"DESCRIPTION:".$encoding.$description."\n"); + fwrite($calfileh,'STATUS:CONFIRMED'."\n"); + fwrite($calfileh,"CATEGORIES:".$category."\n"); + fwrite($calfileh,"LOCATION:".$location."\n"); + fwrite($calfileh,"TRANSP:OPAQUE\n"); + fwrite($calfileh,"CLASS:CONFIDENTIAL\n"); + fwrite($calfileh,"DTSTAMP:".dolibarr_print_date($startdatef,'dayhourxcard')."\n"); + + fwrite($calfileh,"END:VJOURNAL\n"); + } + + + // Put other info in comment + /* + $comment=array(); + $comment ['eid'] = $eid; + $comment ['url'] = $linktoevent; + $comment ['date'] = dolibarr_mktime($evttime,"Ymd"); + $comment ['duration'] = $duration; + $comment ['startdate'] = $startdate; + $comment ['enddate'] = $enddate; + fwrite($calfileh,"COMMENT:" . serialize ($comment) . "\n"); + */ + + } + } + + // Footer + fwrite($calfileh,"END:VCALENDAR"); + + fclose($calfileh); + } + else + { + dolibarr_syslog("xcal.lib.php::build_cal_file Failed to open file ".$outputfile." for writing"); + return -2; + } +} + +/** + \brief Build a file from an array of events + \param format 'rss' + \param title Title of export + \param desc Description of export + \param events_array Array of events ('eid','startdate','duration','enddate','title','summary','category','email','url','desc','author') + \param outputfile Output file + \param filter Filter + \return int <0 if ko, Nb of events in file if ok +*/ +function build_rssfile($format='rss',$title,$desc,$events_array,$outputfile,$filter='') +{ + dolibarr_syslog("xcal.lib.php::build_rssfile Build rss file ".$outputfile." to format ".$format); + + if (empty($outputfile)) return -1; + + $fichier=fopen($outputfile,'w'); + if ($fichier) + { + $now=mktime(); + $date=date("r"); + + // Print header + $html=''; + fwrite($fichier, $html); + fwrite($fichier, "\n"); + $html=''; + fwrite($fichier, $html); + fwrite($fichier, "\n"); + + $html="". + "\n". + "".$title.""; + fwrite($fichier, $html); + fwrite($fichier, "\n"); + + $html=''. +// 'fr'. + 'Dolibarr'. + ''.$date.''. + 'Dolibarr'. + ''; +// ''. +// ''. +// '<![CDATA[Dolibarr events]]>'. +// ''. +// '144'. +// '36'. +// ''."\n"; + + #print $html; + fwrite($fichier, $html); + + + foreach ($events_array as $date => $event) + { + $eventqualified=true; + if ($filter) + { + // \TODO Add a filter + + $eventqualified=false; + } + + if ($eventqualified) + { + //$uid = dolibarr_print_date($now,'dayhourxcard').'-'.$event['uid']."-export@".$_SERVER["SERVER_NAME"]; + $uid = $event['uid']; + $type = $event['type']; + $startdate = $event['startdate']; + $duration = $event['duration']; + $enddate = $event['enddate']; + $summary = $event['summary']; + $category = $event['category']; + $location = $event['location']; + $email = $event['email']; + $url = $event['url']; + $transparency = $event['transparency']; + $description=eregi_replace('',"\n",$event['desc']); + $description=clean_html($description,0); // Remove html tags + + + fwrite ($fichier, ""); + fwrite ($fichier, "\n"); + fwrite ($fichier, "<![CDATA[".$summary."]]>"); + fwrite ($fichier, "\n"); + fwrite ($fichier, ""); + fwrite ($fichier, "\n"); + fwrite ($fichier, ""); + fwrite ($fichier, "\n"); + fwrite ($fichier, "".date("r", $startdate).""); + fwrite ($fichier, "\n"); + fwrite ($fichier, ''); + fwrite ($fichier, "\n"); + fwrite ($fichier, ""); + fwrite ($fichier, "\n"); + + //chmod($fichierout, 0664); + } + } + + fwrite($fichier, ''); + fwrite ($fichier, "\n"); + fwrite($fichier, ''); + + fclose($fichier); + } +} + + + +function format_cal($format,$string) +{ + $newstring=$string; + + if ($format == 'vcal') + { + $newstring=QPEncode($newstring); + } + if ($format == 'ical') + { + // Replace new lines chars by '\n' + $newstring=eregi_replace("\r\n","\n",$newstring); + $newstring=eregi_replace("\n\r","\n",$newstring); + $newstring=eregi_replace("\n",'\n',$newstring); + // Must not exceed 75 char. Cut with "\r\n"+Space + $newstring=CalEncode($newstring); + } + + return $newstring; +} + +/** + \brief Cut string after 75 chars. Add CRLF+Space. + \param string String to convert + \return string String converted +*/ +function CalEncode($line) +{ + $out = ''; + + $newpara = ''; + + for ($j = 0; $j <= strlen($line) - 1; $j++) + { + $char = substr ( $line, $j, 1 ); + + if ( ( strlen ( $newpara ) + strlen ( $char ) ) >= 75 ) + { + $out .= $newpara . "\r\n "; // CRLF + Space for cal + $newpara = ''; + } + $newpara .= $char; + } + $out .= $newpara; + + return utf8_encode(trim($out)); +} + + +function QPEncode($str,$forcal=0) +{ + $lines = preg_split("/\r\n/", $str); + $out = ''; + + foreach ($lines as $line) + { + $newpara = ''; + + for ($j = 0; $j <= strlen($line) - 1; $j++) + { + $char = substr ( $line, $j, 1 ); + $ascii = ord ( $char ); + + if ( $ascii < 32 || $ascii == 61 || $ascii > 126 ) + $char = '=' . strtoupper ( sprintf("%02X", $ascii ) ); + + if ( ( strlen ( $newpara ) + strlen ( $char ) ) >= 76 ) + { + $out .= $newpara . '=' . "\r\n"; // CRLF + if ($forcal) $out .= " "; // + Space for cal + $newpara = ''; + } + $newpara .= $char; + } + $out .= $newpara; + } + return trim ( $out ); +} + +function QPDecode( $str ) +{ + $out = preg_replace('/=\r?\n/', '', $str); + $out = preg_replace('/=([A-F0-9]{2})/e', chr( hexdec ('\\1' ) ), $out); + + return trim($out); +} + ?> \ No newline at end of file