Comment récupérer le retour d'une fonction d'action sur la page depuis laquelle le #BOUTON_ACTION est cliqué ?

Bonjour,

Je cherche à afficher sur une page du privé un texte retourné par une action spip avec un bouton d’action :

#SET{url_action_afficher_texte,#URL_ACTION_AUTEUR{afficher_texte,"",#SELF}}

#BOUTON_ACTION{
	afficher le texte,
	#GET{url_action_afficher_texte},
	ajax
}

Et pour la fonction de mon action :

function action_afficher_texte_dist() {
	
	// Je fais mes traitements en base, puis ma fonction renvoie des choses que je veux afficher dans le squelette appelant
	return ajax_retour("texte","le texte à afficher");
	
}

Bien sur ici, ça ne fait rien, mais il me semble qu’avec l’argument de callback sur le bouton d’action, je pourrais arriver à mes fins…

Auriez-vous un exemple très simple ou un plugin à me recommander pour voir comment cela fonctionne ?

Merci pour votre aide !

Tu parles du « callback » de ajax_retour() ? De ce que je lis ici spip/actions.php at 6700655604d2ad9110759068cf0673f9e72165c7 - spip - SPIP on GIT le premier argument est le texte à renvoyer et le second le type de contenu.

Oui, c’est bien de cela dont je parle !

Si j’ai ajax_retour($contenu); par exemple dans le retour de ma fonction d’action, comment le récupérer dans le squelette appelant (celui ou le bouton d’action a été cliqué) ?

Le callback peut-il d’une manière ou d’une autre permettre de récupérer le return de l’action ?

As tu réussi ?
Si tu as trouvé, ça m’intéresse bien de savoir comment tu fais avec ajax_retour() ou autre « callback ».

Mais sinon, je t’invite à regarder du côté de l’argument redirect de la balise #URL_ACTION_AUTEUR elle même argument de ton #BOUTON_ACTION. À cette url utilisée comme redirect, ne peux-tu passer un argument valant le « texte retourné par l’action spip » que tu veux afficher ? Ainsi la page destination peut afficher ensuite cet argument de la manière qui convient.

Hello @JLuc, malheureusement non.

Pourtant ce besoin semble assez évident, je suis étonné que cela ne soit pas prévu/explicite.

C’est intéressant ce que tu dis, mais pour pouvoir passer en argument du redirect la valeur retournée par l’action, il faudrait appeler l’action une deuxième fois (d’une autre manière, style via un filtre personnalisé).

Dans mon cas, l’action fait un appel à une API externe qui me renvoie une valeur. Je ne vois pas comment gérer cela sauf s’il était possible de (re)définir la page de redirect directement dans la fonction d’action.

Pas besoin de l’appeler une 2eme fois, car dans l’action tu peux modifier le redirect et l’enrichir avec le résultat de tes calculs :

set_request(
    'redirect', 
    parametre_url(_request('redirect'), 'untruqenplus', $letruqissudetonAPI)
);

Si tu ne veux pas passer le détail de la valeur entière dans l’url, tu peux, dans l’action, la ranger dans une globale persistante, et aller l’y chercher ensuite dans le squelette de redirect.
Par exemple en utilisant un casier (ou un sous-casier) de config SPIP ce qui donnerait genre :

$cle = uniqid('moncalcul_', true);
ecrire_config($cle, $moncalculdetruqapi);
set_request(
    'redirect', 
    parametre_url(_request('redirect'), 'ma_cle', $cle)
);

Et dans le squelette appelé tu accèdes la valeur avec #CONFIG{#MA_CLE}
puis tu vides ce casier devenu inutile.

1 « J'aime »

Si je ne me trompe pas, il n’est pas possible de récupérer une valeur de retour dans un #BOUTON_ACTION.
Quand j’ai besoin de le faire, j’utilise l’url que me donne : #URL_ACTION_AUTEUR que je joue en ajax. comme cela, je peux récupérer en retour la valeur.
Attention, dans ce cas, il faut bien penser à minima, à vérifier les autorisations.

Sinon, l’autre solution, est de passer par un formulaire CVT.

Hello @tofulm,

Tu veux dire que tu utilises un lien ajax classique avec
<a href="#URL_ACTION_AUTEUR" class="ajax"></a>
?

L’idée de faire un CVT est aussi bien intéressante. Au final, en jouant un peu avec le style, j’imagine qu’on peut assez simplement afficher un équivalent du bouton d’action + une zone pour le retour après le traitement.

je veux dire en utilisant du javascript :

<script type="text/javascript">

	// solution 1
	let url = window.location.protocol + '//' + window.location.hostname + '/spip.php?action=mon_fichier';
	// solution 2
	let url = "[(#VAL{mon_}|generer_url_action{"", 1})]";

	$.ajax({
		url: url,
	}).done(function(mon_retour){
		console.log('r : ', mon_retour);
	});

</script>
1 « J'aime »

Super la méthode avec le lien ajax direct.

As tu pu tirer parti de ces réponses et peux tu dire un peu comment ?

Je trouve que ça ferait un bon apport pour la gazette.

je ne pense pas que cela soit une bonne chose de décrire cette méthode dans la gazette. Elle n’est pas très conventionnelle. Je pense qu’elle a plus sa place dans ce forum.

JS n’est pas très exotique tout de même… alors rangé dans le carnet : Astuces Actions et Boutons

@Pierre_Jean

Tu peux regarder du côté du plugin notifbox, ça pourrait simplifier l’usage des retours pour #URL_AUTEUR.

1 « J'aime »