From 0bec3664dc2e6ec71f9df49f4d4ecedf7e94f73b Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Wed, 12 Mar 2008 17:11:06 +0000
Subject: [PATCH] Noisettes AJAX :
 <INCLURE{fond=fond/ajax}{fond_ajax=mon_fond}{id_truc=xx}..> inclut la
 noisette en ajaxant automatiquement tous les liens cibles par la variable js
 ajaxbloc_selecteur par defaut celle ci cible les '.pagination a,a.ajax' le
 hit ajax relance automatiquement le calcul de la noisette en restaurant son
 #ENV, et en y ajoutant les parametre en url Attention, la noisette est inclue
 dans un div !! le bloc recharge passe en opacite 50% et a la class loading
 pendant le chargement

homogeneisation avec les formulaires dynamiques ajax
---
 dist/formulaires/formulaire_.html | 10 ++---
 dist/javascript/ajaxCallback.js   | 64 +++++++++++++++++++++++++++++++
 dist/javascript/layer.js          | 24 ------------
 ecrire/public/assembler.php       | 24 +++++++++++-
 4 files changed, 91 insertions(+), 31 deletions(-)

diff --git a/dist/formulaires/formulaire_.html b/dist/formulaires/formulaire_.html
index 57259f6357..d935a22fb8 100644
--- a/dist/formulaires/formulaire_.html
+++ b/dist/formulaires/formulaire_.html
@@ -1,10 +1,8 @@
 <div id='#ENV{ajaxid}'>
 <INCLURE{fond=formulaires/#ENV{form}}{env}>
 </div>
-<script type='text/javascript' src='#CHEMIN{javascript/layer.js}'></script>
-<script type='text/javascript'>if (window.jQuery){
-jQuery('document').ready(function(){
-	jQuery('div#[(#ENV{ajaxid})] form').formulaire_dyn_ajax('#ENV{ajaxid}');
-});
-}
+<script type='text/javascript'>
+var ajaxform_#ENV{ajaxid} = function() {if (window.jQuery) jQuery('div#[(#ENV{ajaxid})] form',this).formulaire_dyn_ajax('#ENV{ajaxid}');}
+jQuery('document').ready(ajaxform_#ENV{ajaxid});
+onAjaxLoad(ajaxform_#ENV{ajaxid});
 </script>
\ No newline at end of file
diff --git a/dist/javascript/ajaxCallback.js b/dist/javascript/ajaxCallback.js
index 775ed3e1be..7c110c2abf 100644
--- a/dist/javascript/ajaxCallback.js
+++ b/dist/javascript/ajaxCallback.js
@@ -55,3 +55,67 @@ if(!jQuery.load_handlers) {
 	};
 
 }
+
+// animation du bloc cible pour faire patienter
+jQuery.fn.animeajax = function(end) {
+	this.children().css('opacity', 0.5);
+	if (typeof ajax_image_searching != 'undefined')
+		this.prepend(ajax_image_searching);
+	return this; // don't break the chain
+}
+
+// rechargement ajax d'un formulaire dynamique implemente par formulaires/forumlaire_.html
+jQuery.fn.formulaire_dyn_ajax = function(target) {
+	this
+	.not('.noajax')
+	.prepend("<"+"input type='hidden' name='var_ajax' value='1' /"+">")
+	.ajaxForm({"target":'#'+target,
+			"beforeSubmit":
+			function(){
+				$('#'+target).animeajax().addClass('loading');
+			},
+			"success":
+			function(){
+				$('#'+target).removeClass('loading');
+			}
+	})
+	.addClass('.noajax');	// previent qu'on n'ajaxera pas deux fois le meme formulaire en cas de ajaxload
+	return this; // don't break the chain
+}
+
+// rechargement ajax d'une noisette implementee par fond/ajax.html
+// avec mise en cache des url
+var preloaded_urls = {};
+var ajaxbloc_selecteur;
+jQuery.fn.ajaxbloc = function() {
+		var blocfrag = this;
+		var ajax_env = $('input[@name=var_ajax_env]',this).eq(0).attr('value');
+		if (!ajax_env || ajax_env==undefined) return;
+		var ajax_cle = $('input[@name=var_ajax_cle]',this).eq(0).attr('value');
+		if (!ajax_cle || ajax_cle==undefined) return;
+		if (ajaxbloc_selecteur==undefined)
+			ajaxbloc_selecteur = '.pagination a,a.ajax';
+		$(ajaxbloc_selecteur,this).not('.noajax').each(function(){
+			var url = this.href.split('#');
+			url[0] += (url[0].indexOf("?")>0 ? '&':'?')+'var_ajax=1&var_ajax_env='+ajax_env+'&var_ajax_cle='+ajax_cle;
+			if ($(this).is('.preload') && !preloaded_urls[url[0]]) {
+				$.ajax({"url":url[0],"success":function(r){preloaded_urls[url[0]]=r;}});
+			}
+			$(this).click(function(){
+				$(blocfrag).animeajax().addClass('loading');
+				var on_pagination = function(contenu) {
+					preloaded_urls[url[0]] = contenu;
+					$(blocfrag).html(preloaded_urls[url[0]]);
+					$(blocfrag).removeClass('loading');
+					window.location.hash = url[1];
+				}
+				if(preloaded_urls[url[0]]) {
+					on_pagination(preloaded_urls[url[0]]);
+					triggerAjaxLoad(blocfrag);
+				} else {
+					$.ajax({"url":url[0],"success":on_pagination});
+				}
+				return false;
+			});
+		}).addClass('.noajax'); // previent qu'on ajax pas deux fois le meme lien
+};
\ No newline at end of file
diff --git a/dist/javascript/layer.js b/dist/javascript/layer.js
index bfeb23b5ef..01be340042 100644
--- a/dist/javascript/layer.js
+++ b/dist/javascript/layer.js
@@ -269,30 +269,6 @@ function verifForm(racine) {
 	});
 }
 
-
-// animation de la cible pour faire patienter
-jQuery.fn.animeajax = function(end) {
-	this.children().css('opacity', 0.5);
-	if (typeof ajax_image_searching != 'undefined')
-		this.prepend(ajax_image_searching);
-}
-
-jQuery.fn.formulaire_dyn_ajax = function(target) {
-	this
-	.not('.noajax')
-	.prepend("<"+"input type='hidden' name='var_ajax' value='1' /"+">")
-	.ajaxForm({"target":'#'+target,
-			"success":
-			function(){
-				$('#'+target+' form').formulaire_dyn_ajax(target);
-			},
-			"beforeSubmit":
-			function(){
-				$('#'+target).animeajax();
-			}
-	});	
-}
-
 // Si Ajax est disponible, cette fonction l'utilise pour envoyer la requete.
 // Si le premier argument n'est pas une url, ce doit etre un formulaire.
 // Le deuxieme argument doit etre l'ID d'un noeud qu'on animera pendant Ajax.
diff --git a/ecrire/public/assembler.php b/ecrire/public/assembler.php
index 18661cec77..14607e78c6 100644
--- a/ecrire/public/assembler.php
+++ b/ecrire/public/assembler.php
@@ -123,7 +123,29 @@ function public_assembler_dist($fond, $connect='') {
 			}
 		}
 	}
-
+	
+	// traiter les appels de bloc ajax
+	if (_request('var_ajax')
+	 AND ($args = _request('var_ajax_env'))
+	 AND ($cle = _request('var_ajax_cle')) ){ 
+		 if ((include_spip('inc/securiser_action'))
+		 AND ($cle == calculer_cle_action($args))) {
+			$args = unserialize(base64_decode($args));
+			if ($fond = $args['fond_ajax']){
+				include_spip('public/parametrer');
+				$contexte = calculer_contexte();
+				$contexte = array_merge($contexte,$args);
+				$page = evaluer_fond($fond,$contexte);
+				include_spip('inc/actions');
+				ajax_retour($page['texte']);
+				exit();
+			}
+		}
+		include_spip('inc/actions');
+		ajax_retour('signature ajax incorrecte');
+		exit();
+	}
+	
 	// si signature de petition, l'enregistrer avant d'afficher la page
 	// afin que celle-ci contienne la signature
 	if (isset($_GET['var_confirm'])) {
-- 
GitLab