Browse Source

Merge branch 'master' of ssh://gogs.karmas.fr/KarmaSolutions/KarmaFW

Max F 4 years ago
parent
commit
876bceecfc

+ 11 - 2
src/Http/Response.php

@@ -178,7 +178,7 @@ class Response
 		return $this->setBody($body);
 	}
 	
-	public function json($json, $download_file_name=null, $status=200, $content_type='application/json; charset=utf8')
+	public function json($json, $download_file_name=null, $status=200, $content_type='application/json; charset=utf8', $add_content_disposition=true)
 	{
 		if (! is_string($json) || ! in_array(substr($json, 0, 1), ['"', "'", '[', '{'])) {
 			$json = json_encode($json);
@@ -187,12 +187,16 @@ class Response
 		
 		$this->download_file_name = $download_file_name;
 
+		if ($add_content_disposition && !empty($this->download_file_name)) {
+			$this->headers['Content-disposition'] = 'attachment; filename="' . basename($this->download_file_name) . '"';
+		}
+
 		return $this->setBody($json)
 				->setContentType($content_type)
 				->setStatus($status);
 	}
 
-	public function csv(array $rows, $download_file_name=null, $status=200, $content_type='text/csv; charset=utf8')
+	public function csv(array $rows, $download_file_name=null, $status=200, $content_type='text/csv; charset=utf8', $add_content_disposition=true)
 	{
 		if (is_array($rows)) {
 			// transform array to csv
@@ -200,9 +204,14 @@ class Response
 		} else {
 			$body = "";
 		}
+		//return $this->download($json, $download_file_name, $status, $content_type);
 		
 		$this->download_file_name = $download_file_name;
 
+		if ($add_content_disposition && !empty($this->download_file_name)) {
+			$this->headers['Content-disposition'] = 'attachment; filename="' . basename($this->download_file_name) . '"';
+		}
+
 		return $this->setBody($body)
 				->setContentType($content_type)
 				->setStatus($status);

+ 28 - 22
src/Templates/LightweightTemplate.php

@@ -70,19 +70,15 @@ class LightweightTemplate {
 
 	public function display($tpl=null, $extra_vars=[], $layout=null, $options=[]) 
 	{
-		$use_cache = empty($options['no_cache']);
+		$allow_template_debug_traces = empty($options['deny_template_debug']);
 		$tpl_data = $this->data + $extra_vars;
-		self::view($tpl, $tpl_data, $use_cache);
+		self::view($tpl, $tpl_data, $allow_template_debug_traces);
 		return true;
 	}
 
 	
-	public static function view($file, $tpl_data = array(), $use_cache=true) {
-		if ($use_cache) {
-			$cached_file = self::cache($file);
-		} else {
-			$cached_file = $file;
-		}
+	public static function view($file, $tpl_data = array(), $allow_template_debug_traces=true) {
+		$cached_file = self::cache($file, $allow_template_debug_traces);
 		
 	    extract($tpl_data, EXTR_SKIP);
 
@@ -98,7 +94,7 @@ class LightweightTemplate {
 	}
 
 
-	protected static function cache($file) {
+	protected static function cache($file, $allow_template_debug_traces=true) {
 		if (!file_exists(self::$cache_path)) {
 		  	if (! @mkdir(self::$cache_path, 0744)) {
 		  		throw new \Exception("Cannot create templates cache dir " . self::$cache_path, 1);
@@ -111,30 +107,38 @@ class LightweightTemplate {
 	    if ($cached_file_exists) {
 		    $cached_file_updated = filemtime($cached_file);
 		    $file_path = strpos($file, '/') === 0 ? $file : (self::$tpl_path . '/' . $file);
-		    self::$tpl_last_updated = filemtime($file_path);
+			self::$tpl_last_updated = filemtime($file_path);
+			
 	    } else {
 	    	$cached_file_updated = null;
 	    }
 
 	    if (ENV == 'dev') {
 	    	// on force le parcours de tous les fichiers inclus pour avoir la vraie valeur de self::$tpl_last_updated
-	    	$code = self::includeFiles($file);
+	    	$code = self::includeFiles($file, 0, null, null, $allow_template_debug_traces);
 	    }
 
 	    if (!self::$cache_enabled || ! $cached_file_exists || $cached_file_updated < self::$tpl_last_updated) {
+			// (re)regenere le template
+
 	    	if (! isset($code)) {
-				$code = self::includeFiles($file);
-	    	}
-			$code = self::compileCode($code);
+				// si env != 'dev' (car pour env=dev on a déjà rempli la variable $code. voir quelques lignes au-dessus)
+				$code = self::includeFiles($file, 0, null, null, $allow_template_debug_traces);
+			}
+			
+			$code = self::compileCode($code); // compilation du template
+
 	        file_put_contents($cached_file, '<?php class_exists(\'' . __CLASS__ . '\') or exit; ?>' . PHP_EOL . $code);
 
-	    } else {
+	    } else if (ENV == 'dev') {
+			// affichage des infos du cached_template dans la debugbar
+
 	    	//header('X-Template: cached'); // TODO: $response->addHeader(...)
 
 			$debugbar = App::getData('debugbar');
 			if ($debugbar) {
 				if (isset($debugbar['templates'])) {
-					$debugbar_message_idx = $debugbar['templates']->addMessage([
+					$debugbar['templates']->addMessage([
 						'tpl' => $cached_file,
 						'content_length' => filesize($cached_file),
 						'content_length_str' => formatSize(filesize($cached_file)),
@@ -164,7 +168,7 @@ class LightweightTemplate {
 		return $code;
 	}
 
-	protected static function includeFiles($file, $level=0, $caller_file=null, $parent_file=null) {
+	protected static function includeFiles($file, $level=0, $caller_file=null, $parent_file=null, $allow_template_debug_traces=true) {
 		$file_path = strpos($file, '/') === 0 ? $file : (self::$tpl_path . '/' . $file);
 
 		if (! is_file($file_path)) {
@@ -220,10 +224,12 @@ class LightweightTemplate {
 				$tpl_infos .= ' with layout ' . $layout . '';
 			}
 
-			$begin = '<!-- [' . $level . '] BEGIN TEMPLATE #' . $tpl_idx . ' : ' . $file . ' (size: ' . formatSize(strlen($code)) . ' - ' . $tpl_infos . ') -->';
-			$end = '<!-- [' . $level . '] END TEMPLATE #' . $tpl_idx . ' : ' . $file . ' (size: ' . formatSize(strlen($code)) . ' - ' . $tpl_infos . ') -->';
+			if ($allow_template_debug_traces) {
+				$begin = '<!-- [' . $level . '] BEGIN TEMPLATE #' . $tpl_idx . ' : ' . $file . ' (size: ' . formatSize(strlen($code)) . ' - ' . $tpl_infos . ') -->';
+				$end = '<!-- [' . $level . '] END TEMPLATE #' . $tpl_idx . ' : ' . $file . ' (size: ' . formatSize(strlen($code)) . ' - ' . $tpl_infos . ') -->';
+				$code = PHP_EOL . $begin . PHP_EOL . $code . PHP_EOL . $end . PHP_EOL;
+			}
 
-			$code = PHP_EOL . $begin . PHP_EOL . $code . PHP_EOL . $end . PHP_EOL;
 		}
 
 		// Layout (2)
@@ -231,7 +237,7 @@ class LightweightTemplate {
 			$value = $layout_matches[0];
 			$layout = $value[1];
 
-			$layout_code = self::includeFiles($layout, $level-1, $file);
+			$layout_code = self::includeFiles($layout, $level-1, $file, null, $allow_template_debug_traces);
 			$code = str_replace($value[0], '', $code);
 			
 			$layout_code = str_replace('<' . '?=$child_content?' . '>', '{@content}', $layout_code);
@@ -244,7 +250,7 @@ class LightweightTemplate {
 		// includes
 		preg_match_all('/{include ?\'?(.*?)\'? ?}/i', $code, $matches, PREG_SET_ORDER);
 		foreach ($matches as $value) {
-			$included_code = self::includeFiles($value[1], $level+1, null, $file);
+			$included_code = self::includeFiles($value[1], $level+1, null, $file, $allow_template_debug_traces);
 			$code = str_replace($value[0], $included_code, $code);
 		}
 

+ 69 - 0
src/helpers/helpers_date.php

@@ -0,0 +1,69 @@
+<?php
+
+function isWorkingDay($timestamp) {
+
+    // Dimanche(0) ou Samedi(6)
+    $day = date('w', $timestamp);
+    if ($day == 0 || $day == 6) {
+        return false;
+    }
+
+    $jour = date('d', $timestamp);
+    $mois = date('m', $timestamp);
+    $annee = date('Y', $timestamp);
+
+    if ($jour == 1 && $mois == 1) {
+        return false;
+    } // 1er janvier
+
+    if ($jour == 1 && $mois == 5) {
+        return false;
+    } // 1er mai
+
+    if ($jour == 8 && $mois == 5) {
+        return false;
+    } // 8 mai
+
+    if ($jour == 14 && $mois == 7) {
+        return false;
+    } // 14 juillet
+
+    if ($jour == 15 && $mois == 8) {
+        return false;
+    } // 15 aout
+
+    if ($jour == 1 && $mois == 11) {
+        return false;
+    } // 1er novembre
+
+    if ($jour == 11 && $mois == 11) {
+        return false;
+    } // 11 novembre
+
+    if ($jour == 25 && $mois == 12) {
+        return false;
+    } // 25 décembre
+
+
+    // Pâques
+    $date_paques = easter_date($annee);
+    $jour_paques = date('d', $date_paques);
+    $mois_paques = date('m', $date_paques);
+    if ($jour_paques == $jour && $mois_paques == $mois) {
+        return false;
+    }
+
+    // Ascension
+    $date_ascension = mktime(date("H", $date_paques), date("i", $date_paques), date("s", $date_paques), date("m", $date_paques), date("d", $date_paques) + 39, date("Y", $date_paques));
+    if (date('d', $date_ascension) == $jour && date('m', $date_ascension) == $mois) {
+        return false;
+    }
+
+    // Pentecote
+    $date_pentecote = mktime(date("H", $date_paques), date("i", $date_paques), date("s", $date_paques), date("m", $date_paques), date("d", $date_paques) + 50, date("Y", $date_paques));
+    if (date('d', $date_pentecote) == $jour && date('m', $date_pentecote) == $mois) {
+        return false;
+    }
+
+    return true;
+}

+ 43 - 0
src/helpers/helpers_default.php

@@ -422,3 +422,46 @@ if (! function_exists('formatDuration')) {
 	    }
 	}
 }
+
+
+if (! function_exists('IPv6ToIPv4')) {
+	function IPv6ToIPv4($ip) {
+		// source: https://stackoverflow.com/questions/12435582/php-serverremote-addr-shows-ipv6
+
+		/*
+		Fonctionne uniquement pour les IPv4 encapsulées dans IPv6 :
+
+		::ffff:192.000.002.123
+		::ffff:192.0.2.123
+		0000:0000:0000:0000:0000:ffff:c000:027b
+		::ffff:c000:027b
+		::ffff:c000:27b
+		192.000.002.123
+		192.0.2.123
+		*/
+
+
+		// Known prefix
+		$v4mapped_prefix_hex = '00000000000000000000ffff';
+		//$v4mapped_prefix_bin = pack("H*", $v4mapped_prefix_hex); // PHP < 5.4
+		$v4mapped_prefix_bin = hex2bin($v4mapped_prefix_hex);  // PHP >= 5.4
+
+		// Parse
+		$addr_bin = inet_pton($ip);
+		if( $addr_bin === FALSE ) {
+			// Unparsable? How did they connect?!?
+			return null;
+		}
+
+		// Check prefix
+		if( substr($addr_bin, 0, strlen($v4mapped_prefix_bin)) == $v4mapped_prefix_bin) {
+			// Strip prefix
+			$addr_bin = substr($addr_bin, strlen($v4mapped_prefix_bin));
+		}
+
+		// Convert back to printable address in canonical form
+		$ip4 = inet_ntop($addr_bin);
+
+		return $ip4;
+	}
+}