web-dev-qa-db-fra.com

Comment rediriger l'utilisateur sur une page et afficher un message sur la superposition de l'administrateur (à l'aide de DRUPAL_SET_MESSAGE et DRUPAL_GOTO)

J'ai besoin de rediriger l'utilisateur à une destination et d'afficher un message de confirmation/d'erreur. Comment puis je faire ça? Ceci est mon code:

watchdog('webform', 'The user @user has been successfully created', array('@user'=> $mail));
drupal_set_message(t('Settings saved.', array()));
drupal_goto(drupal_get_destination());

Ce code redirige, mais le message n'est pas affiché. Ai-je besoin d'une action spéciale dans la page de destination?

Modifier - Le problème est que je redirige dans une page administrative et que le message s'affiche dans le thème principal, je souhaite qu'il affiche sur le thème de la superposition. Je vais expliquer un peu plus en profondeur ce que je fais (cela pourrait être totalement faux).

J'ai ajouté un lien que l'utilisateur peut cliquer sur lorsqu'il affiche une soumission saisie via un formulaire Web (module WebForm). J'ai défini une voix de menu pour ce lien de cette manière (je n'ai qu'un rappel, aucune page n'est affichée):

$items ['createuser/%'] = array (
                                    'title' => 'Create users', 
                                    'access callback' => TRUE, 
                                    'page callback' => 'provintegra_createuser', 
                                    'page arguments' => array (
                                                            1 ), 
                                    'type' => MENU_CALLBACK );

Ensuite, j'ai défini Provintegra_CreateUser

function provintegra_createuser($sid) {
        //save user
    watchdog ( 'webform', 'L\'utente @utente è stato creato cons successo', array (
                                                                                    '@utente' => $mail ) );
    drupal_set_message(t('Settings saved.', array()));
    drupal_goto(drupal_get_destination());//This redirects you to the page of the webform submission in the overlay
}

Je suis le message "Réglage enregistré" mais c'est dans le thème principal, pas dans le thème (sept) que j'utilise pour la superposition administrative. Dois-je définir un paramètre spécial de manière à ce que le message soit affiché dans la superposition?

5
Nicola Peluchetti

Je ne pense pas que cela soit possible avec le système de messages actuel, il faudrait que certaines solutions de contournement folle le font fonctionner de toute façon.

Le problème est que lorsque vous utilisez drupal_set_message(), le message est stocké dans la variable de session et affichée chaque fois que possible. Lorsque vous redirigez vers une page avec une superposition deux choses se produit.

  1. La page principale est rendue et affichée.
  2. La page de superposition est rendue et affichée (avec un iframe).

Cela signifie que quel que soit le message que vous définis, serait toujours affiché sur la page principale.

Ce que vous pouviez faire, c'est que lorsque les messages ont été extraits pour les libérer et les supprimer. Cela pourrait arriver dans votre thème quelque part. Le problème est qu'il est probablement très difficile de déterminer quand vous devriez le faire, car vous cacheriez efficacement tous les messages si vous l'avez toujours fait. Un autre effet secondaire serait que vous obtiendriez constamment de plus en plus de messages, ce qui conduirait éventuellement à une erreur de mémoire fatale en pire.

2
googletorp

@googletorp écrit:

Je ne pense pas que cela soit possible avec le système de messages actuel, il faudrait que certaines solutions de contournement folle le font fonctionner de toute façon.

Le problème est que lorsque vous utilisez drupal_set_message (), le message est stocké dans la variable de session et affichée chaque fois que possible. Lorsque vous redirigez vers une page avec une superposition deux choses se produit.

La page principale est rendue et affichée. La page de superposition est rendue et affichée (avec une iframe). Cela signifie que quel que soit le message que vous définis, serait toujours affiché sur la page principale.

Ce que vous pouviez faire, c'est que lorsque les messages ont été extraits pour les libérer et les supprimer. Cela pourrait arriver dans votre thème quelque part.

J'ai résolu cela principalement dans Hook_init (). Mon scénario était que ma moule est créée de certains drupal_set_messages () qui seraient ensuite obscurcis par la superposition lorsque l'utilisateur a été redirigé vers Admin/Modules.

Dans mon .Installez la dernière ligne de ma mise en œuvre Hook_Install est la suivante:

// Set a flag so that we know installation has just completed.  Process the flag in ucberkeley_cas_init()
$_SESSION['ucberkeley_cas_installed'] = TRUE;

Dans mon .Module j'ai:

/**
 * Implementation of hook_init()
 * If overlay.module is enabled, make sure that our hook_install messages are displayed
 */
function ucberkeley_cas_init() {
  if (!module_exists('overlay') || (!is_array($_SESSION))) {
    return;
  }
  if ((array_key_exists('ucberkeley_cas_install_messages', $_SESSION)) && (!array_key_exists('messages', $_SESSION))) {
    foreach ($_SESSION['ucberkeley_cas_install_messages']['status'] as $msg) {
      drupal_set_message($msg);
    }
    unset($_SESSION['ucberkeley_cas_install_messages']);
  }
  elseif ((is_array($_SESSION['messages'])) && (array_key_exists('ucberkeley_cas_installed', $_SESSION))) {
    $_SESSION['ucberkeley_cas_install_messages'] = $_SESSION['messages'];
    unset($_SESSION['ucberkeley_cas_installed']);
  }
}

Maintenant, les messages apparaissent dans la superposition.

(Célébrons tous la suppression de la superposition de Drupal 8!)

1
Brian Wood