Positionner l'ancre d'un bloc ajax

Bonjour

Quand un bloc ajax est rechargé, l’ancre est positionnée en début de bloc. Y a-t-il un moyen de placer l’ancre à un endroit spécifique ?

Je précise mon exemple (je suis peut-être dans un cas particulier):

je charge un formulaire avec #FORMULAIRE_BATIMENT
Le code appelé par formulaires/batiment.html est ainsi

<div class="ajax">

[(#INCLURE{fond=inc-batiment,env,ajax=modifier_batiment})]

<form>
... classique CVT
</form>

</div>

Quand je valide mon formulaire, le bloc du formulaire est rechargé, ainsi que le bloc inclus (normal). Mais la vue est positionnée en haut du bloc ajax. Je voudrais que l’ancre de positionnement de mon bloc soit entre le #INCLURE et le <form>. Un peu à la manière de #ANCRE_PAGINATION

Je pourrais mettre mon #INCLURE en dehors de mon bloc ajax, mais il ne serait pas rechargé à la validation du formulaire.

J’ai vu dans des sujets la variable var_ajax_ancre qui semblerait faire ce que je veux, mais je n’arrive pas à comprendre comment l’employer.

Merci pour vos idées
Florence

1 J'aime

As tu vu le commit forcer le scroll pour avoir l'ancre tout en haut de la page · 5108fb09af - agenda - SPIP on GIT ?

Il utilise var_ajax_ancre en argument de ajaxReload donc tu pourrais essayer d’INCLURE la noisette ajaxée avec cet argument : <INCLURE{fond=...,ajax,env,var_ajax_ancre=nomdelancre}>

1 J'aime

Merci pour le lien.

J’ai réussi à faire marcher la fonction ajaxReload avec l’argument var_ajax_ancre, mais cet argument ne semble pas pris en compte lors de l’inclusion avec #INCLURE.

J’ai même tenté un #FORMULAIRE_BATIMENT{var_ajax_ancre=monancre}, mais sans succès.

Question connexe : que faudrait-il que je fasse pour que suite au traitement de mon formulaire, mon bloc ajax soit rechargé, dans une configuration de code ainsi :


[(#INCLURE{fond=inc-batiment,env,ajax=modifier_batiment})]

 #FORMULAIRE_BATIMENT

Tel quel, seul le bloc du formulaire est rechargé, pas le bloc ajax modifier_batiment

Le 28/09/2021 à 10:06, Florence HENRY via Discuter de SPIP a écrit :

[Florence_HENRY] Florence HENRY https://discuter.spip.net/u/florence_henry
Septembre 28

Question connexe : que faudrait-il que je fasse pour que suite au traitement de mon formulaire, mon bloc ajax soit
rechargé, dans une configuration de code ainsi :

|[(#INCLURE{fond=inc-batiment,env,ajax=modifier_batiment})] #FORMULAIRE_BATIMENT |

Tel quel, seul le bloc du formulaire est rechargé, pas le bloc ajax |modifier_batiment|

|C’est exactement à ça que servent ajax : à pas tout reloader,
|||et ajaxReload|||: reloader un autre bloc que celui ajaxé.|

|Il faut donc

  • déclarer cet autre bloc ajax : c’est le rôle de l’argument ajax=autrebloc dans un INCLURE
  • appeler ajaxReload en javascript, quelque part et au bon moment, avec cet argument ‹ autrebloc ›|

|Pour appeler ajaxReload, une recherche sur le source des différents plugins ramène plein d’exemples
et au moins 2 manières de faire :
|

|- en incluant le javascript dans le HTML du formulaire… ou de la noisette qui l’appelle.
Par exemple pour la config du plugin reservation_evenement il y a quelque chose qui y ressemble
dans
https://git.spip.net/spip-contrib-extensions/reservation_evenement/src/branch/master/prive/squelettes/contenu/configurer_reservation_evenement.html

|

$(function() {
$(« body »).on(‹ submit ›, ‹ .formulaire_configurer_reservation_evenement form ›, function(event) {
ajaxReload(‹ configurer_re_menu ›); ajaxReload(‹ navigation ›); }); });
||

|- en incluant le javascript dans le message de reponse_ok de ton formulaire.||
C’est ce qui est fait par exemple dans le plugin-dist medias||
https://git.spip.net/spip/medias/src/branch/master/formulaires/editer_document.php#L250
if ($res[‹ message_ok ›]) {
$res[‹ message_ok ›] .= ‹  ›;
}
|||

|JLuc|

J’ai réussi à faire marcher la fonction |ajaxReload| avec l’argument |var_ajax_ancre|, mais cet argument ne semble pas
pris en compte lors de l’inclusion avec |#INCLURE|.

J’ai même tenté un |#FORMULAIRE_BATIMENT{var_ajax_ancre=monancre}|, mais sans succès.

[JLuc] JLuc https://discuter.spip.net/u/jluc
Septembre 23

As tu vu le commit forcer le scroll pour avoir l’ancre tout en haut de la page · 5108fb09af - agenda - SPIP on GIT
https://git.spip.net/spip-contrib-extensions/agenda/commit/5108fb09afff37379acdc9f2ff42c02421c8c475 ?

Il utilise |var_ajax_ancre| en argument de ajaxReload donc tu pourrais essayer d’INCLURE la noisette ajaxée avec cet
argument : |<INCLURE{fond=…,ajax,env,var_ajax_ancre=nomdelancre}>|

Super ! Les 2 façons fonctionnent nickel.

Je n’aurais pas pensé qu’un submit sur un body se combinerait ainsi avec le submit d’un form, notamment sur l’ordre dans lequel les événements sont traités.

Merci en tout cas.

La recherche dans les sources existants est une alliée précieuse. Pour tes recherches, tu peux faire une copie locale de git.spip avec mirror.php (pour pas faire de mal au serveur lors des mises à jour) :

···

Le 28/09/2021 à 14:35, Florence HENRY via Discuter de SPIP a écrit :

Florence HENRY
Septembre 28

Super ! Les 2 façons fonctionnent nickel.

Fantastique !

Alors c’est dans la doc maintenant :

Je n’aurais pas pensé qu’un submit sur un body se combinerait ainsi avec le submit d’un form, notamment sur l’ordre dans lequel les événements sont traités.

https://git.spip.net/spip-contrib-outils/gitea_mirror/src/branch/master/mirror.php

JL

https://programmer.spip.net/Blocs-ajax-et-ajaxReload