Bonjour
Une page ouverte dans une modalbox lity et qui contient un formulaire editer_article_public.
<a href="#GET{adresse}" class="mediabox" data-box-ajaxreload-on-close= "#ID_ARTICLE">
Le premier submit est ok, la page est rechargée dans la modalbox. C’est le comportement attendu via message_ok et editable=true
Au second submit, le contexte ajax est perdu : seul le formulaire est rechargé.
Il y a dans la même page d’autres formulaires (ajout de documents, événements) et seul celui d’édition editer_article_public a ce comportement.
Je tourne en BOUCLE
depuis deux jours…
la seule piste trouvée est dans « aiguiller.php »:
// au 1er appel, traite les formulaires dynamiques charger/verifier/traiter
// au 2e se sachant 2e, retourne les messages et erreurs stockes au 1er
// Le 1er renvoie True si il faut faire exit a la sortie
function traiter_formulaires_dynamiques($get = false) {
Je ne trouve pas comment contourner ce comportement…
Merci de vos conseils!
Niveau environnement, la seule différence avant/après premier submit est la valeur de ‹ je_suis_poste ›
avant submit:
[formulaire_fond][je_suis_poste]=
après submit:
[formulaire_fond][je_suis_poste]=1
Par contre, le html change beaucoup. Voici les différences constatées
| AVANT submit |
APRES submit |
rem |
<div class=ajax-form-container> |
<div class=ajax-form-container aria-busy=false> |
ajout de aria-busy=false |
<div class=ajax> |
– |
div disparue |
<div id=form_editer_article class=formulaire_spip formulaire_editer formulaire_editer_article formulaire_editer_article-2264> |
<div id=form_editer_article class=formulaire_spip formulaire_editer formulaire_editer_article formulaire_editer_article-2264> |
inchangé |
<form method=post action=spip.php?page=editer_articles_public class=noajax hasajax verifformok> |
<form method=post action=spip.php?page=editer_articles_public class=verifformok> |
ajout par SPIP de class=noajax hasajax sur le form avant submit |
Une solution finalement trouvée, en court-circuitant le fonctionnement ajax.
Il faut appeler le formulaire en ajax :
<div id="editerArticle"class="ajax">
#FORMULAIRE_EDITER_ARTICLE_PUBLIC{#ENV{id_article,new}, #ENV{id_rubrique}}
</div>
Dans la fonction traiter , refuser le traitement ajax au tout début de la fonction :
refuser_traiter_formulaire_ajax();
Puis faire un retour avec un reloadAjax :
$res['editable'] = true;
$res['message_ok'] = 'Les modifications ont été enregistrées';
$res['message_ok'] .= '<script type=text/javascript>if (window.jQuery) ajaxReload(editerArticle);</script>';
return $res;
Je trouve le code incohérent (appel ajax mais refuser ajax pour finalement faire ajax), mais ça fonctionne. 
A noter que cela n’est valable que pour une ouverture en mediabox, donc iframe. Le mécanisme reste bloqué pour une lity appelée en ‹ popin › . On est donc obligé de recharger les scripts et styles avec #INSERT_HEAD , plus les styles et scripts personnels. Ça fait beaucoup de trafic inutile
. Je reste donc preneur de toute autre solution.
Je te confirme qu’il doit exister une solution bien plus simple que toutes ces circonvolutions.
La première chose à faire est de s’assurer que ta modale est bien déclenchée en mode ajax et non iframe (inspecte l’attribut data-box-type de ton lien, et si la détection automatique est erronée, force la manuellement depuis le squelette).
Ensuite, comme tu l’as déjà fait, ton squelette cible doit contenir un formulaire inclus dans un conteneur .ajax
<div class="ajax">
#FORMULAIRE_EDITER_ARTICLE_PUBLIC{#ENV{id_article,new},#ENV{id_rubrique}}
</div>
Et là, c’est déjà sensé être suffisant.
L’attribut data-box-ajaxreload-on-close doit cibler un élément à l’extérieur de la popin, qui sera rechargé après la fermeture de cette dernière.
Donc pour un comportement optimal, la seule chose qui manque est de déclencher une fermeture de la modale après un retour sans erreur du POST du formulaire :
Quelque chose comme ceci à la fin de la partie _traiter :
if ($res['message_ok'] && defined('_AJAX')) {
$res['message_ok'] .= "\n" . '<script>$.modalboxclose();</script>' . "\n";
}
return $res;
Merci de ta réponse.
Oui, tout cela fonctionne très bien
. C’est même le comportement natif de Spip, mais ne correspond pas à mon besoin.
Le souci vient de la validation à multiple reprise du formulaire. Je n’ai pas testé en dehors de lity, mais je pense que le comportement doit être identique.
dans aiguiller.php, traiter_formulaires_dynamiques pose un flag pour indiquer que le formulaire a déjà été posté et change le comportement de retour en fonction de ce flag.
/prive/formulaires/editer_article.html ne fait pas autre chose, puisqu’il renvoie le contenu modifié et ferme le formulaire dans l’espace privé.
D’où mon souci, puisque je voudrais pouvoir effectuer plusieurs enregistrements sans fermer le formulaire. 
Le code proposé est pleinement fonctionnel, et le plus simple que j’aie trouvé. Mais je reste preneur…
Tu as bien vérifié la présence de data-box-type="ajax" sur ton lien au départ ?
(Si tu as iframe comme valeur, alors ça ne peut pas marcher correctement).