[Résolu] Message de confirmation après action

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

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 !

Forum : 
Version de Drupal : 

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 situation, j'utilise la fonction l() pour rappeler mon menu et en pied de fonction je rempli un variable $output comme ça:

<?php
$output
.=drupal_get_form('mon_formulaire',$id);
$output .=theme('table', $header, $rows);
return
$output;
?>

Si cela te semble trop court comme explication je détaillerai...

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 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 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 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']);
}