diff --git a/inclure-ajaxload.php b/inclure-ajaxload.php index 58bcc892832fe202b1b1afb9b89864f8a797ab04..ec3a36f9db21a325dcdd6a381e2846909c6dae74 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&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 bb62dc6544c92d983c866e0acea8638e3697fb3e..7c0c01b8b24aeb75e3a263c878b35bf93fd0a622 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 d2c2bf97653c61710ad1a22a666438d72aa36f36..b0bd6e27c536de4cd7202b76077f1193c1d945ef 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,18 +1,23 @@ <plugin> <nom>AjaxLoad pour #INCLURE</nom> <auteur> - Fil © 2009 - GNU/GPL + Fil & ARNO* © 2009 - GNU/GPL </auteur> <version> - 0.65 + 0.7 </version> <etat> test </etat> <description> - Ajoute une option <code>{ajaxload}</code> à la balise <code>#INCLURE</code> + Ajoute une option <code>{ajaxload}</code> à la balise <code>#INCLURE</code>. + La noisette n'est alors pas incluse, mais chargée dynamiquement en Ajax au chargement de la page. + + Autre mé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éré par le <code>#CACHE</code> de SPIP; il est par défaut de 2 heures, on peut le forcer + en ajoutant le critère <code>{ttl_ajaxload=60*60*24}</code>. - Ce qui permet de différer le calcul du truc inclus sur un deuxiè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>