[SPIP Zone] CVT AJAX et redirection

Bonjour,

j'ai un formulaire CVT.
Il appelle une action.
Cette action créer ou éditer un objet.
S'il y a _request('redirect') ça redirige_par_entete() la page.

Mais si on met le formulaire entre class="ajax" alors ça plante.
Lorsque l'on valide, ça grise le formulaire, ça ajoute l'objet en base, et ça reste bloqué comme ça.
Si on valide une deuxième fois (c'est grisé mais toujours cliquable), alors ça redirige enfin vers la page demandé mais du coup ça a ajouté l'objet deux fois. La deuxième validation n'est pas ajax.

Si on ne met pas en ajax, tout marche.
Si on met en ajax, mais qu'on ne demande pas de redirection, ça marche aussi.

Est-ce qu'il y a quelque chose à faire de spécial pour que ça marche même quand on active ajax ?

--
RastaPopoulos

2009/4/9 RastaPopoulos <vincent@ldd.fr>:

j'ai un formulaire CVT.
Il appelle une action.
Cette action créer ou éditer un objet.
S'il y a _request('redirect') ça redirige_par_entete() la page.
Mais si on met le formulaire entre class="ajax" alors ça plante.

Oui il y a un truc pour ça, il faut "refuser l'ajax" au niveau de
verifier(), je crois bien...

cf. refuser_traiter_formulaire_ajax()

-- Fil

Le 9 avril 2009 21:09, Fil <fil@rezo.net> a écrit :

2009/4/9 RastaPopoulos <vincent@ldd.fr>:

j’ai un formulaire CVT.
Il appelle une action.
Cette action créer ou éditer un objet.
S’il y a _request(‹ redirect ›) ça redirige_par_entete() la page.
Mais si on met le formulaire entre class=« ajax » alors ça plante.

Oui il y a un truc pour ça, il faut « refuser l’ajax » au niveau de
verifier(), je crois bien…

normalement la redirection fonctionne meme en cas d’ajax, via un js

cf. refuser_traiter_formulaire_ajax()

c’est surtout utile si on ne veut pas de traitement ajax, mais quand meme beneficier de verifier() en ajax.

Cédric

– Fil


spip-zone@rezo.net - http://listes.rezo.net/mailman/listinfo/spip-zone

Le 09.04.2009 21:28, Cédric Morin a écrit :

normalement la redirection fonctionne meme en cas d'ajax, via un js

Effectivement je remarque maintenant que firebug me montre une erreur quand ça devient grisé et que ça reste bloqué.

"""""""""""""""""""""""""""""""""
jQuery._ACBajax is not a function
  return jQuery._ACBajax(type);
ajaxCallback.js (line 55)
"""""""""""""""""""""""""""""""""

Donc je suppute que ça doit être pour ça que la redirection de se lance pas.

J'ai essayé de lire le code de ce fichier. Mais ça ne me parle pas du tout.

--
RastaPopoulos

Elle est définie quelques lignes plus haut pourtant ... !
Cédric

Je sais bien, ça j'ai vu. Mais ça me fait cette erreur à chaque fois.

Et après test ça le fait aussi pour #FORMULAIRE_EDITER_ARTICLE. Exactement la même erreur.

Et après autre test, ça le fait sans AUCUN plugin. Et sur le squelette article de la dist.

Il suffit pour cela qu'il y ait un _request('redirect') existant, c'est-à-dire que la redirection se fait dans l'action et non pas avec le $retour['redirect'] de la fonction "traiter".

La redirection se fait bien quand c'est CVT qui la fait. Mais pas quand elle est dans l'action.

Alors bug ?

--
RastaPopoulos

RastaPopoulos a écrit :

Elle est définie quelques lignes plus haut pourtant ... !
Cédric

Je sais bien, ça j'ai vu. Mais ça me fait cette erreur à chaque fois.

Et après test ça le fait aussi pour #FORMULAIRE_EDITER_ARTICLE. Exactement la même erreur.

Et après autre test, ça le fait sans AUCUN plugin. Et sur le squelette article de la dist.

Il suffit pour cela qu'il y ait un _request('redirect') existant, c'est-à-dire que la redirection se fait dans l'action et non pas avec le $retour['redirect'] de la fonction "traiter".

La redirection se fait bien quand c'est CVT qui la fait. Mais pas quand elle est dans l'action.

Alors bug ?

Ah ben non, l'action elle est bete elle fait un redirige_par_entete qui ne fonctionne pas en ajax
On n'utilise pas sa redirection dans le core. Si elle reste supportée c'est pour des raisons de compat.

Mais il est vivement conseillé de faire passer l'url de redirection dans les parametres du cvt plutot qu'en chaine de get.
Cédric

Le 12/04/2009 22:32, cedric.morin@yterium.com a écrit :

Ah ben non, l'action elle est bete elle fait un redirige_par_entete qui
ne fonctionne pas en ajax
On n'utilise pas sa redirection dans le core. Si elle reste supportée
c'est pour des raisons de compat.

Mais il est vivement conseillé de faire passer l'url de redirection dans
les parametres du cvt plutot qu'en chaine de get.
Cédric

OK, je comprends.
Je préfère aussi utiliser le mécanisme CVT évidemment. Mais la redirection dans l'action c'était dans l'éventualité où on utiliserait l'action autrement que dans CVT (un lien direct par exemple).

Merci pour les infos.

--
RastaPopoulos

Le 12 avr. 09 à 22:46, RastaPopoulos a écrit :

Le 12/04/2009 22:32, cedric.morin@yterium.com a écrit :

Ah ben non, l'action elle est bete elle fait un redirige_par_entete qui
ne fonctionne pas en ajax
On n'utilise pas sa redirection dans le core. Si elle reste supportée
c'est pour des raisons de compat.

Mais il est vivement conseillé de faire passer l'url de redirection dans
les parametres du cvt plutot qu'en chaine de get.
Cédric

OK, je comprends.
Je préfère aussi utiliser le mécanisme CVT évidemment. Mais la redirection dans l'action c'était dans l'éventualité où on utiliserait l'action autrement que dans CVT (un lien direct par exemple).

C'est peut-être ça dont tu as besoin :

Une balise pour generer rapidement un bouton d'action en POST, ajaxable
a utiliser a la place des liens action_auteur, sous la forme
#BOUTON_ACTION{libelle,url}

ou
#BOUTON_ACTION{libelle,url,ajax}
pour que le bouton se comporte comme un lien class = 'ajax' (rechargement de l'inclusion ajax parente la plus proche)
Dans le cas d'un hit ajax, le cache des pages ajax est vide car on suppose avoir fait une action en base de donnee

exemple :
avant on pouvait avoir dans un squelette un lien action ajaxé sous la forme :

<a href='#URL_ACTION_AUTEUR{monaction,args,redirect}' class='ajax'>titre du lien</a>

Si cette action modifie la base de donnee les fichiers du serveur, il est *fortement conseillé* de le remplacer par
#BOUTON_ACTION{titre du lien,#URL_ACTION_AUTEUR{monaction,args,redirect},ajax}

En résumé :
pour de la navigation, utiliser un lien (eventuellement class='ajax')
pour une opération irréversible, utiliser un #BOUTON_ACTION (eventuellement avec le troisieme argument ajax)

Le 13/04/2009 00:55, Pierre Fiches a écrit :

Le 12 avr. 09 à 22:46, RastaPopoulos a écrit :

Le 12/04/2009 22:32, cedric.morin@yterium.com a écrit :

Ah ben non, l'action elle est bete elle fait un redirige_par_entete qui
ne fonctionne pas en ajax
On n'utilise pas sa redirection dans le core. Si elle reste supportée
c'est pour des raisons de compat.

Mais il est vivement conseillé de faire passer l'url de redirection dans
les parametres du cvt plutot qu'en chaine de get.
Cédric

OK, je comprends.
Je préfère aussi utiliser le mécanisme CVT évidemment. Mais la
redirection dans l'action c'était dans l'éventualité où on utiliserait
l'action autrement que dans CVT (un lien direct par exemple).

C'est peut-être ça dont tu as besoin :

Une balise pour generer rapidement un bouton d'action en POST, ajaxable
a utiliser a la place des liens action_auteur, sous la forme
#BOUTON_ACTION{libelle,url}

J'en ai besoin oui mais, ce n'est pas en rapport avec ma question. :slight_smile:
Mais merci quand même.

D'ailleurs je m'étais demandé la semaine dernière : est-ce que #BOUTON_ACTION est disponible sur la stable ? Ou c'est dans bonux ?

--
RastaPopoulos

Le 13 avr. 09 à 12:20, RastaPopoulos a écrit :

Le 13/04/2009 00:55, Pierre Fiches a écrit :

Le 12 avr. 09 à 22:46, RastaPopoulos a écrit :

Le 12/04/2009 22:32, cedric.morin@yterium.com a écrit :

Ah ben non, l'action elle est bete elle fait un redirige_par_entete qui
ne fonctionne pas en ajax
On n'utilise pas sa redirection dans le core. Si elle reste supportée
c'est pour des raisons de compat.

Mais il est vivement conseillé de faire passer l'url de redirection dans
les parametres du cvt plutot qu'en chaine de get.
Cédric

OK, je comprends.
Je préfère aussi utiliser le mécanisme CVT évidemment. Mais la
redirection dans l'action c'était dans l'éventualité où on utiliserait
l'action autrement que dans CVT (un lien direct par exemple).

C'est peut-être ça dont tu as besoin :

Une balise pour generer rapidement un bouton d'action en POST, ajaxable
a utiliser a la place des liens action_auteur, sous la forme
#BOUTON_ACTION{libelle,url}

J'en ai besoin oui mais, ce n'est pas en rapport avec ma question. :slight_smile:
Mais merci quand même.

D'ailleurs je m'étais demandé la semaine dernière : est-ce que #BOUTON_ACTION est disponible sur la stable ? Ou c'est dans bonux ?

bonux 26830

Salut Cédric,
Salut vincent,
El dom, 12-04-2009 a las 22:32 +0200, cedric.morin@yterium.com escribió:

RastaPopoulos a écrit :
> Il suffit pour cela qu'il y ait un _request('redirect') existant,
> c'est-à-dire que la redirection se fait dans l'action et non pas avec
> le $retour['redirect'] de la fonction "traiter".
>
> La redirection se fait bien quand c'est CVT qui la fait. Mais pas
> quand elle est dans l'action.
>
> Alors bug ?
Ah ben non, l'action elle est bete elle fait un redirige_par_entete qui
ne fonctionne pas en ajax
On n'utilise pas sa redirection dans le core. Si elle reste supportée
c'est pour des raisons de compat.

Mais il est vivement conseillé de faire passer l'url de redirection dans
les parametres du cvt plutot qu'en chaine de get.

Je faisais la même erreur d'utiliser redirige_par_entete() en ajax, et
je suivais votre échange... mais j'ai toujours pas réussi à faire une
redirection, autrement qu'avec refuser_traitement_ajax()

Si je suis dans un #FORMULAIRE_MACHIN en class=ajax, et que je veux
rediriger vers un #FORMULAIRE_TRUC une fois tout validé, j'appelle quoi
dans quelle fonction?

J'ai essapyé de regarder comment on fait dans #MENU_LANG et
#MENU_LANG_ECRIRE, mais elles sont encore en balise/menu_lang.php ...

Merci d'avance de vos lumières...

daniel

Le mardi 14 avril 2009 à 12:46 -0400, Daniel Viñar Ulriksen a écrit :

r d'utiliser redirige_par_entete() en ajax, et
je suivais votre échange... mais j'ai toujours pas réussi à faire une
redirection, autrement qu'avec refuser_traitement_ajax()

Si je suis dans un #FORMULAIRE_MACHIN en class=ajax, et que je veux
rediriger vers un #FORMULAIRE_TRUC une fois tout validé, j'appelle
quoi
dans quelle fonction?

J'ai essapyé de regarder comment on fait dans #MENU_LANG et
#MENU_LANG_ECRIRE, mais elles sont encore en balise/menu_lang.php ...

Merci d'avance de vos lumières...

daniel

Dans l'array de retour de la fonction traiter (imaginons que c'est
$message par exemple), si tu lui passe un :

$message['redirect'] = 'ton_url';

return $message;

il devrait faire une redirect ajax vers 'ton_url' normalement... si je
ne me trompes pas...

kent1 qui suit de loin en ce moment...

Merci pour ta réponse, Quentin,

> Si je suis dans un #FORMULAIRE_MACHIN en class=ajax, et que je veux
> rediriger vers un #FORMULAIRE_TRUC une fois tout validé, j'appelle
> quoi dans quelle fonction?
>
> J'ai essapyé de regarder comment on fait dans #MENU_LANG et
> #MENU_LANG_ECRIRE, mais elles sont encore en balise/menu_lang.php ...
>
> Merci d'avance de vos lumières...
>
> daniel

Dans l'array de retour de la fonction traiter (imaginons que c'est
$message par exemple), si tu lui passe un :

$message['redirect'] = 'ton_url';

return $message;

il devrait faire une redirect ajax vers 'ton_url' normalement... si je
ne me trompes pas...

Je viens d'essayer, mais, sauf erreur de ma part, ca n'a pas
marché :frowning: (même après maj à la 2.0.7)

J'ai aussi essayé mais de mettre un 'redirect' dans le post que fait le
formulaire (avec un <input type='hidden' name='redirect' ) et ca n'a pas
marché non plus...

kent1 qui suit de loin en ce moment...

t'es où? tu viens en AmSud un de ces jours?

amitiés,
daniel