From 1be7a814d445791e5dde87e817d1c86116778e6e Mon Sep 17 00:00:00 2001
From: "arno@rezo.net" <>
Date: Sun, 17 Oct 2010 08:06:30 +0000
Subject: [PATCH] =?UTF-8?q?Ajout=20d'une=20nouvelle=20methode:=20{ajaxload?=
 =?UTF-8?q?=3Dhtml}=20(la=20noisette=20ajax=20est=20alors=20un=20pur=20fic?=
 =?UTF-8?q?hier=20HTML=20statique,=20trait=C3=A9=20hors=20SPIP).?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 inclure-ajaxload.php           | 62 ++++++++++++++++++++++++++++++----
 javascript/inclure-ajaxload.js | 13 +++++++
 plugin.xml                     | 15 +++++---
 3 files changed, 78 insertions(+), 12 deletions(-)

diff --git a/inclure-ajaxload.php b/inclure-ajaxload.php
index 58bcc89..ec3a36f 100644
--- a/inclure-ajaxload.php
+++ b/inclure-ajaxload.php
@@ -2,6 +2,11 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
+// Par defaut, cache de 2 heures pour l'ajax statique
+// possibilité de forcer une duree avec le critere {ttl_ajaxload=60*60*24}
+if(!defined("_DUREE_CACHE_AJAXSTATIC")) define("_DUREE_CACHE_AJAXSTATIC", 7200);
+
+
 // Evolution de #INCLURE pour inclusions ajaxload
 // #INCLURE{fond=xxx,....ajax,ajaxload} le fait
 function balise_INCLURE($p) {
@@ -20,10 +25,6 @@ function recuperer_fond_ajax() {
 
 	$args[1]["fond"] = $args[0];
 
-	if (_request('var_no_ajax')
-	OR _request('var_mode') == 'inclure')
-		return call_user_func_array('recuperer_fond', $args);
-
 	$cle = md5(serialize($args));
 	$ajax = entites_html(encoder_contexte_ajax($args[1]));
 	
@@ -32,16 +33,54 @@ function recuperer_fond_ajax() {
 	$message = $args[1]['ajaxload'];
 	$searching = sinon($args[1]['ajaxsearching'],
 		"<img src='".find_in_path('images/searching.gif')."' alt='$alt' />");
-
 	// Le lien mène à l'action de pose du cookie no_js
 	$url = "spip.php?action=ia_nojs&amp;retour=".urlencode(parametre_url(self(),'no_js','oui'));
 
 	if (isset($args[2]['ajax']) AND $args[2]['ajax']=='1') 
 		$class_ajax = " ajaxbloc env-$ajax";
 
-	$ret =
-		"<div class='includeajax$class_ajax'><a href=\"$url\" rel=\"$ajax\">$searching</a></div>";
+	// Appliquer la methode: 
+	// - soit laisser les automatismes Ajax de SPIP,
+	// - soit sauvergarder "en dur" le resultat HTML
+	$methode = $args[1]["ajaxload"];
+	if ($methode == "html") {
+		
+		$fichier = sous_repertoire(_DIR_VAR, 'cache-ajaxload').$cle.".html";
+		
+		$ttl = _DUREE_CACHE_AJAXSTATIC;
+		if ($args[1]['ttl_ajaxload']) $ttl = valeur_numerique($args[1]['ttl_ajaxload']);
+		
+		// Test sur le fichier
+		if (!file_exists($fichier) || _request('var_mode') == "recalcul"
+				|| (file_exists($fichier) && date("U") - @filemtime($fichier) > $ttl)
+			){
+			//echo "RECALCULER";
+			$contenu = call_user_func_array('recuperer_fond', $args);
+			ecrire_fichier($fichier, $contenu);
+			// ecrire une version .gz pour content-negociation par apache, cf. [11539]
+			// ecrire_fichier("$fichier.gz",$contenu, true);
+
+		}
+		
+		if (_request('var_no_ajax')
+		OR _request('var_mode') == 'inclure')
+			return $contenu;
+
+		$ret =
+			"<div class='includestatic$class_ajax'><a href=\"$url\" rel=\"$fichier\">$searching</a></div>";
 		
+		
+		//print_r($contenu);
+	
+	} else {
+		if (_request('var_no_ajax')
+		OR _request('var_mode') == 'inclure')
+			return call_user_func_array('recuperer_fond', $args);
+	
+		$ret =
+			"<div class='includeajax$class_ajax'><a href=\"$url\" rel=\"$ajax\">$searching</a></div>";
+	}
+	
 	return $ret;
 }
 
@@ -55,6 +94,14 @@ function remettre_fond_ajax($matches) {
 	return $page;
 }
 
+function remettre_fond_ajax_static($matches) {
+	$url = $matches[3];
+	if (file_exists($url)) $page = join("", @file($url));
+	else $page = "";
+	
+	return $page;
+}
+
 function INCLUREAJAXLOAD_affichage_final($page) {
 
 	// Si le visiteur est un robot de moteur de recherche,
@@ -63,6 +110,7 @@ function INCLUREAJAXLOAD_affichage_final($page) {
 		include_spip("inc/filtres");
 		include_spip("public/assembler");
 		$page = preg_replace_callback(",(<div class='includeajax[^\']*'><a href=\"(.*)\" rel=\"(.*)\">.*</a></div>),msU", "remettre_fond_ajax", $page);
+		$page = preg_replace_callback(",(<div class='includestatic[^\']*'><a href=\"(.*)\" rel=\"(.*)\">.*</a></div>),msU", "remettre_fond_ajax_static", $page);
 	}
 
 	return $page;
diff --git a/javascript/inclure-ajaxload.js b/javascript/inclure-ajaxload.js
index bb62dc6..7c0c01b 100644
--- a/javascript/inclure-ajaxload.js
+++ b/javascript/inclure-ajaxload.js
@@ -13,4 +13,17 @@ $(document).ready(function() {
 			});
 		}
 	});
+	$('.includestatic').each(function() {
+		var me = $(this);
+		var env = $('a', this).attr('rel');
+		if (env) {
+			$('a', this).attr('href','#');
+			$.ajax({
+				url: env,
+				type: "GET",
+				cache: true,
+				success: function(c) { me.html(c); }
+			});
+		}
+	});
 });
\ No newline at end of file
diff --git a/plugin.xml b/plugin.xml
index d2c2bf9..b0bd6e2 100644
--- a/plugin.xml
+++ b/plugin.xml
@@ -1,18 +1,23 @@
 <plugin>
 	<nom>AjaxLoad pour #INCLURE</nom>
 	<auteur>
-	Fil &#169; 2009 - GNU/GPL
+	Fil &amp; ARNO* &#169; 2009 - GNU/GPL
 	</auteur>
 	<version>
-	0.65
+	0.7
 	</version>
 	<etat>
 	test
 	</etat>
 	<description>
-	Ajoute une option <code>{ajaxload}</code> &agrave; la balise <code>#INCLURE</code>
+	Ajoute une option <code>{ajaxload}</code> &agrave; la balise <code>#INCLURE</code>. 
+	La noisette n'est alors pas incluse, mais charg&eacute;e dynamiquement en Ajax au chargement de la page.
+
+	Autre m&eacute;thode: <code>{ajaxload=html}</code> fabrique une noisette statique (en HTML non dynamique) 
+	dans <code>/local/cache-ajaxload</code>, son appel se faisant ainsi hors SPIP. 
+	Le cache n'est donc plus g&eacute;r&eacute; par le <code>#CACHE</code> de SPIP; il est par d&eacute;faut de 2 heures, on peut le forcer
+	en ajoutant le crit&egrave;re <code>{ttl_ajaxload=60*60*24}</code>.
 
-	Ce qui permet de diff&eacute;rer le calcul du truc inclus sur un deuxi&egrave;me hit
 	</description>
 	<prefix>
 	INCLUREAJAXLOAD
@@ -25,6 +30,6 @@
 		<nom>insert_head</nom>
 	</pipeline>
 	<chemin dir='' />
-	<necessite id="SPIP" version="[2.0.0;]" />
+	<necessite id="SPIP" version="[2.1.0;]" />
 	<categorie>outil</categorie>
 </plugin>
-- 
GitLab