Submitted by Artusamak on
Bonjour à tous, je viens vers vous à propos d'une question sur les actions "transparentes".
Je m'explique, j'aimerais que lorsque mon utilisateur clique sur "Ajouter au panier", une fonction de mon module soit appelée pour ajouter à la session de l'utilisateur l'id du produit que je veux stocker et que lorsque l'utilisateur clique la page se recharge et que le message de confirmation "L'élément a bien été ajouté au panier" s'affiche.
Ma question est donc la suivante, comment faire pour qu'un traitement soit effectué en rechargeant la page et en affiche un message de confirmation.
Actuellement j'ai utilisé le hook menu pour effectuer l'action lorsque l'utilisateur charge la page monpanier/add/%
$items["monpanier/add/%"] = array(
'title' => 'Ajouter au panier',
'page callback' => 'monpanier_add',
'page arguments' => array(2),
'access arguments' => array('access monpanier content'),
'type' => MENU_CALLBACK,
);
Auriez-vous une idée ?
Merci !
Là je comprend rien du
Permalien Soumis par Yoran le 29 Juin, 2009 - 20:19
Là je comprend rien du tout... C'est quoi une action "transparente" ? ce que tu décries me semble à moi une action "normale" (Click => requête => action sur le serveur => page de réponse).
PS: pour afficher un message c'est la fonction
drupal_set_message("ton message")
Salut, Dans ce genre de
Permalien Soumis par guitarman le 30 Juin, 2009 - 09:33
Salut,
Dans ce genre de situation, j'utilise la fonction l() pour rappeler mon menu et en pied de fonction je rempli un variable $output comme ça:
Si cela te semble trop court comme explication je détaillerai...
Je vous détaille un peu
Permalien Soumis par Artusamak le 30 Juin, 2009 - 10:29
Je vous détaille un peu plus.
Je suis sur une vue qui liste mes nodes, à chaque node j'ai ajouté un lien "Ajouter au panier".
Lorsque mon utilisateur clique sur le lien "Ajouter au panier" je veux pouvoir exécuter ma fonction de traitement (qui ajoute au panier) mais sans rediriger l'utilisateur vers une page particulière, je veux qu'il reste sur la page sur laquelle il était mais que le message de confirmation de l'action lui soit affiché (avec drupal_set_message oui).
Est ce je suis plus clair ? ;)
Merci.
En somme tu veux faire appel
Permalien Soumis par Yoran le 30 Juin, 2009 - 11:09
En somme tu veux faire appel en AJAX à ton hook_menu. Là in n'y a à ma connaissance rien en standard dans Drupal pour cela. Ce qui serait sans doute le mieux serait de faire d'abord de manière "traditionnel" avec ton bouton "ajouter" lié sur ton hook_menu avec un message via drupal_set_message. Une fois que cela fonctionne, tu peux ajouter une couche de comportement javascript via jQuery qui va, une fois la page chargé, et si les scripts sont activés, modifier l'ancre de ton lien "ajouter" pour remplacer l'appel statique par un appel à une fonction Javascript. Dans cette fonction tu peux faire appel à un second hook_menu qui ne fera que l'ajout et renverra en retour (JSON ou autre) le message. Avec ce message, la fonction JS va aller changer le contenu de #message (cela implique que tu modifies un peu ton thème pour que ce div soit inséré même lorsqu'il n'y a pas de message.
En procédant de la sorte, tu fonctionnes aussi bien avec que sans javascript. Pour les détails, regarde la doc de JQuery et surtout la doc Javascript pour Drupal qui regroupe les bonnes pratiques pour ajouter ce genre de chose proprement (http://api.drupal.org/api/file/developer/topics/javascript_startup_guide...).
Je ne crois qu'il soit
Permalien Soumis par Artusamak le 30 Juin, 2009 - 11:13
Je ne crois qu'il soit nécessaire d'utiliser le JS en fait, quand tu utilises Devel et que tu veux vider le cache, il recharge la page et un message de confirmation apparait.
Sauf erreur de ma part ce n'est pas du JS il me semble.
C'est ce mécanisme que j'essaie de reproduire.
Merci.
Bouh mais attend, c'est pas
Permalien Soumis par Yoran le 30 Juin, 2009 - 11:27
Bouh mais attend, c'est pas très clair ton histoire :) Lorsqu'avec Devel tu fais un vidage de cache, il fait aussi un rechargement complet de la page. Sa seule astuce c'est que ce rechargement se fait sur le referer de la page qui appelle le vidage de cache. Si c'est ça que tu cherches à faire c'est tout con. Il suffit que ta callback de hook_menu ressemble à ça :
function mon_module_ajouer($id) {
// Ton ajout
// retour à l'envoyeur
drupal_set_message("Le bidule $id a été ajouté");
drupal_goto($_SERVER['HTTP_REFERER']);
}
J'osais pas le goto,
Permalien Soumis par Artusamak le 30 Juin, 2009 - 16:59
J'osais pas le goto, j'aurais du.
Parfait ça fait ce que je veux.
Merci Yoran.