diff --git a/htdocs/comm/action/class/ical.class.php b/htdocs/comm/action/class/ical.class.php
index badd5db5c98..26db2cd5e6e 100644
--- a/htdocs/comm/action/class/ical.class.php
+++ b/htdocs/comm/action/class/ical.class.php
@@ -54,8 +54,8 @@ class ICal
/**
* Read text file, icalender text file
*
- * @param string $file File
- * @return string
+ * @param string $file File
+ * @return string|null Content of remote file read or null if error
*/
public function read_file($file)
{
@@ -65,7 +65,7 @@ class ICal
$tmpresult = getURLContent($file, 'GET');
if ($tmpresult['http_code'] != 200) {
- $file_text = '';
+ $file_text = null;
$this->error = 'Error: '.$tmpresult['http_code'].' '.$tmpresult['content'];
} else {
$file_text = preg_replace("/[\r\n]{1,} /", "", $tmpresult['content']);
@@ -102,17 +102,40 @@ class ICal
/**
* Translate Calendar
*
- * @param string $uri Url
+ * @param string $uri Url
+ * @param string $usecachefile Full path of a cache file to use a cache file
+ * @param string $delaycache Delay in seconds for cache (by default 3600 secondes)
* @return array|string
*/
- public function parse($uri)
+ public function parse($uri, $usecachefile = '', $delaycache = 3600)
{
$this->cal = array(); // new empty array
$this->event_count = -1;
+ $this->file_text = null;
+
+ // Save file into a cache
+ if ($usecachefile) {
+ include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
+ $datefile = dol_filemtime($usecachefile);
+ $now = dol_now('gmt');
+ //print $datefile.' '.$now.' ...';
+ if ($datefile && $datefile > ($now - $delaycache)) {
+ // We reuse the cache file
+ $this->file_text = file_get_contents($usecachefile);
+ }
+ }
// read FILE text
- $this->file_text = $this->read_file($uri);
+ if (is_null($this->file_text)) {
+ $this->file_text = $this->read_file($uri);
+
+ if ($usecachefile && !is_null($this->file_text)) {
+ // Save the file content into cache file
+ file_put_contents($usecachefile, $this->file_text, LOCK_EX);
+ dolChmod($usecachefile);
+ }
+ }
$this->file_text = preg_split("[\n]", $this->file_text);
diff --git a/htdocs/comm/action/index.php b/htdocs/comm/action/index.php
index 3460355a803..b4e11125aee 100644
--- a/htdocs/comm/action/index.php
+++ b/htdocs/comm/action/index.php
@@ -49,6 +49,7 @@ if (empty($conf->global->AGENDA_EXT_NB)) {
$conf->global->AGENDA_EXT_NB = 5;
}
$MAXAGENDA = $conf->global->AGENDA_EXT_NB;
+$DELAYFORCACHE = 300; // 300 seconds
$disabledefaultvalues = GETPOST('disabledefaultvalues', 'int');
@@ -615,7 +616,7 @@ if (!empty($conf->use_javascript_ajax)) { // If javascript on
$default = '';
}
- $s .= '
';
+ $s .= '
';
}
}
@@ -1010,9 +1011,13 @@ if ($mode == 'show_day') {
// Request only leaves for the current selected day
$sql .= " AND '".$db->escape($year)."-".$db->escape($month)."-".$db->escape($day)."' BETWEEN x.date_debut AND x.date_fin"; // date_debut and date_fin are date without time
} elseif ($mode == 'show_week') {
- // TODO: Add filter to reduce database request
+ // Restrict on current month (we get more, but we will filter later)
+ $sql .= " AND date_debut < '".dol_get_last_day($year, $month)."'";
+ $sql .= " AND date_fin >= '".dol_get_first_day($year, $month)."'";
} elseif ($mode == 'show_month') {
- // TODO: Add filter to reduce database request
+ // Restrict on current month
+ $sql .= " AND date_debut <= '".dol_get_last_day($year, $month)."'";
+ $sql .= " AND date_fin >= '".dol_get_first_day($year, $month)."'";
}
$resql = $db->query($sql);
@@ -1083,8 +1088,11 @@ if (count($listofextcals)) {
$colorcal = $extcal['color'];
$buggedfile = $extcal['buggedfile'];
+ $pathforcachefile = dol_sanitizePathName($conf->user->dir_temp).'/'.dol_sanitizeFileName('extcal_'.$namecal.'_user'.$user->id).'.cache';
+ //var_dump($pathforcachefile);exit;
+
$ical = new ICal();
- $ical->parse($url);
+ $ical->parse($url, $pathforcachefile, $DELAYFORCACHE);
// After this $ical->cal['VEVENT'] contains array of events, $ical->cal['DAYLIGHT'] contains daylight info, $ical->cal['STANDARD'] contains non daylight info, ...
//var_dump($ical->cal); exit;
diff --git a/htdocs/core/lib/date.lib.php b/htdocs/core/lib/date.lib.php
index 03223a7b65a..773cb6a1a97 100644
--- a/htdocs/core/lib/date.lib.php
+++ b/htdocs/core/lib/date.lib.php
@@ -117,6 +117,7 @@ function getServerTimeZoneInt($refgmtdate = 'now')
* @param int $duration_unit Unit of added delay (d, m, y, w, h, i)
* @param int $ruleforendofmonth Change the behavior of PHP over data-interval, 0 or 1
* @return int New timestamp
+ * @see convertSecondToTime(), convertTimeToSeconds()
*/
function dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth = 0)
{
diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php
index ab96f650b6f..278f70507bb 100644
--- a/htdocs/core/lib/functions.lib.php
+++ b/htdocs/core/lib/functions.lib.php
@@ -6844,6 +6844,22 @@ function dol_mkdir($dir, $dataroot = '', $newmask = '')
}
+/**
+ * Change mod of a file
+ *
+ * @param string $filepath Full file path
+ * @return void
+ */
+function dolChmod($filepath)
+{
+ global $conf;
+
+ if (!empty($conf->global->MAIN_UMASK)) {
+ @chmod($filepath, octdec($conf->global->MAIN_UMASK));
+ }
+}
+
+
/**
* Return picto saying a field is required
*