Browse Source

Gestion d'erreur sur le post ajax des formulaires :

en cas d'erreur ajax, ou si le retour est vide ou ne contient pas la chaine "ajax-form-is-ok" on affiche un message d'erreur en tete du formulaire et on invite à le soumettre à nouveau en POST normal, sans ajax (cela permet aussi de copier/coller son contenu si necessaire, au cas ou).
On teste aussi le cas du retour "noajax" en tolerant espace devant/derriere (cas des fichiers PHP mal formés)
Le message d'erreur type est inséré dans le head du privé, il faudra peut etre aussi l'inserer dans le public
+ timestamp sur les js et css inseres dans le head
spip-3.1-stable
Cerdic 10 years ago
parent
commit
7624e77db7
  1. 4
      ecrire/inc/pipelines_ecrire.php
  2. 1
      ecrire/lang/spip_fr.php
  3. 3
      ecrire/public/aiguiller.php
  4. 14
      prive/javascript/ajaxCallback.js
  5. 17
      prive/squelettes/inclure/head.html

4
ecrire/inc/pipelines_ecrire.php

@ -47,8 +47,10 @@ function f_jQuery_prive ($texte) {
'prive/javascript/spip_barre.js',
));
foreach (array_unique($jquery_plugins) as $script)
if ($script = find_in_path($script))
if ($script = find_in_path($script)){
$script = timestamp($script);
$x .= "\n<script src=\"$script\" type=\"text/javascript\"></script>\n";
}
// inserer avant le premier script externe ou a la fin
if (preg_match(",<script[^><]*src=,",$texte,$match)
AND $p = strpos($texte,$match[0])){

1
ecrire/lang/spip_fr.php

@ -233,6 +233,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'erreur_balise_non_fermee' => 'dernière balise non refermée :',
'erreur_technique_enregistrement_champs' => 'Une erreur technique a empêché l\'enregistrement correct du champ @champs@.',
'erreur_technique_enregistrement_impossible' => 'Une erreur technique a empêché l\'enregistrement.',
'erreur_technique_ajaxform' => 'Ooops. Une erreur innatendue a empêché de soumettre le formulaire. Vous pouvez essayer à nouveau.',
'erreur_texte' => 'erreur(s)',
'etape' => 'Étape',

3
ecrire/public/aiguiller.php

@ -245,7 +245,8 @@ function traiter_formulaires_dynamiques($get=false){
$retour .= inclure_balise_dynamique(call_user_func_array('balise_formulaire__dyn',$args),false);
// on ajoute un br en display none en tete du retour ajax pour regler un bug dans IE6/7
// sans cela le formulaire n'est pas actif apres le hit ajax
$retour = "<br class='bugajaxie' style='display:none;'/>".$retour;
// la classe ajax-form-is-ok sert a s'assurer que le retour ajax s'est bien passe
$retour = "<br class='bugajaxie ajax-form-is-ok' style='display:none;'/>".$retour;
ajax_retour($retour,false);
return true; // on a fini le hit
}

14
prive/javascript/ajaxCallback.js

@ -207,6 +207,13 @@ jQuery.fn.formulaire_dyn_ajax = function(target) {
jQuery('form:not(.noajax):not(.bouton_action_post)', this).each(function(){
var leform = this;
var leclk,leclk_x,leclk_y;
var onError = function(xhr, status, error, $form){
jQuery(leform).ajaxFormUnbind().find('input[name="var_ajax"]').remove();
var msg = "Erreur";
if (typeof(error_on_ajaxform)!=="undefined") msg = error_on_ajaxform;
jQuery(leform).prepend("<p class='error ajax-error none'>"+msg+"</p>").find('.ajax-error').show('fast');
jQuery(cible).closest('.ariaformprop').endLoading(true);
}
jQuery(this).prepend("<input type='hidden' name='var_ajax' value='form' />")
.ajaxForm({
beforeSubmit: function(){
@ -225,8 +232,9 @@ jQuery.fn.formulaire_dyn_ajax = function(target) {
if (scrollwhensubmit)
jQuery(cible).positionner(false,false);
},
success: function(c){
if (c=='noajax'){
error: onError,
success: function(c, status, xhr , $form){
if (c.match(/\s*noajax\s*/)){
// le serveur ne veut pas traiter ce formulaire en ajax
// on resubmit sans ajax
jQuery("input[name=var_ajax]",leform).remove();
@ -246,6 +254,8 @@ jQuery.fn.formulaire_dyn_ajax = function(target) {
jQuery(leform).ajaxFormUnbind().submit();
}
else {
if (!c.length || c.indexOf("ajax-form-is-ok")==-1)
return onError.apply(this,[status, xhr , $form]);
// commencons par vider le cache des urls, si jamais un js au retour
// essaye tout de suite de suivre un lien en cache
// dans le doute sur la validite du cache il vaut mieux l'invalider

17
prive/squelettes/inclure/head.html

@ -13,23 +13,24 @@ function test_accepte_ajax(){jQuery.ajax({"url":"[(#URL_ECRIRE{test_ajax,js=1}|r
]var ajax_image_searching = '<img src="#CHEMIN_IMAGE{searching.gif}" alt="" />';
var stat = [(#CONFIG{activer_statistiques}|=={non}|?{0,1})];
var confirm_changer_statut = '<:confirm_changer_statut|html2unicode|addslashes|unicode_to_javascript:>';
var error_on_ajaxform='<:erreur_technique_ajaxform|html2unicode|addslashes|unicode_to_javascript:>';
/*]]>*/</script>
<meta name="viewport" content="width=device-width" />
[<link rel="stylesheet" type="text/css" href="(#VAL{reset.css}|find_in_theme|url_absolue)" id="csspriveereset" />]
[<link rel="stylesheet" type="text/css" href="(#VAL{reset.css}|find_in_theme|timestamp|url_absolue)" id="csspriveereset" />]
#PIPELINE{header_prive_css,''}
[<!--
(#REM) CSS de secours en cas de non fonct de la suivante
-->][<link rel="stylesheet" type="text/css" href="(#VAL{style_prive_defaut.css}|find_in_theme|url_absolue)" id="csspriveedef" />]
-->][<link rel="stylesheet" type="text/css" href="(#VAL{style_prive_defaut.css}|find_in_theme|timestamp|url_absolue)" id="csspriveedef" />]
[<!--
(#REM) spip-admin pour le debug
-->][<link rel="stylesheet" type="text/css" href="(#CHEMIN{spip_admin.css}|url_absolue)"/>]
-->][<link rel="stylesheet" type="text/css" href="(#CHEMIN{spip_admin.css}|timestamp|url_absolue)"/>]
[<!--
(#REM) CSS espace prive : la vraie
-->]<link rel="stylesheet" type="text/css" href="#URL_PAGE{style_prive.css,#ENV{paramcss}}" />
[<!--
(#REM) CSS optionelle minipres
-->][(#ENV{minipres,''}|oui)
[<link rel="stylesheet" type="text/css" href="(#CHEMIN{minipres.css}|url_absolue)" />]
[<link rel="stylesheet" type="text/css" href="(#CHEMIN{minipres.css}|timestamp|url_absolue)" />]
][<!--
(#REM) Favicon
-->][<link rel="shortcut icon" href="(#CHEMIN{spip.ico}|url_absolue)" type="image/x-icon" />]
@ -40,7 +41,7 @@ var confirm_changer_statut = '<:confirm_changer_statut|html2unicode|addslashes|u
<link rel="alternate" type="application/rss+xml" title="<:info_breves_03|attribut_html:>" href="#URL_PAGE{backend-breves}" />
]
[<script type="text/javascript" src="(#CHEMIN{prive/javascript/layer_old.js})"></script>]
[<script type="text/javascript" src="(#CHEMIN{prive/javascript/layer.js})"></script>]
[<script type="text/javascript" src="(#CHEMIN{prive/javascript/presentation.js})"></script>]
[<script type="text/javascript" src="(#CHEMIN{prive/javascript/gadgets.js})"></script>]
[<script type="text/javascript" src="(#CHEMIN{prive/javascript/layer_old.js}|timestamp)"></script>]
[<script type="text/javascript" src="(#CHEMIN{prive/javascript/layer.js}|timestamp)"></script>]
[<script type="text/javascript" src="(#CHEMIN{prive/javascript/presentation.js}|timestamp)"></script>]
[<script type="text/javascript" src="(#CHEMIN{prive/javascript/gadgets.js}|timestamp)"></script>]

Loading…
Cancel
Save