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