web-dev-qa-db-ja.com

ユーザーをページにリダイレクトし、管理オーバーレイにメッセージを表示する方法(drupal_set_messageおよびdrupal_gotoを使用)

ユーザーを宛先にリダイレクトし、確認/エラーメッセージを表示する必要があります。どうやってやるの?これは私のコードです:

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

このコードはリダイレクトしますが、メッセージは表示されません。リンク先ページで特別なアクションが必要ですか?

編集-問題は、管理ページにリダイレクトしていて、メッセージがメインテーマに表示されていることです。オーバーレイテーマに表示する必要があります。私がやっていることをもう少し詳しく説明します(これは完全に間違っている可能性があります)。

ユーザーがWebフォーム(Webフォームモジュール)から入力された送信を表示しているときにクリックできるリンクを追加しました。このようにそのリンクのメニュー音声を定義しました(コールバックだけではなく、ページは表示されません)。

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

次に、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
}

「設定が保存されました」というメッセージが表示されますが、それはメインテーマにあり、管理オーバーレイに使用しているテーマ(7)ではありません。メッセージがオーバーレイに表示されるように、特別なパラメーターを設定する必要がありますか?

5

これは現在のメッセージシステムでは不可能だと思います。とにかく機能させるには、いくつかのクレイジーな回避策が必要になります。

問題は、drupal_set_message()を使用すると、メッセージがセッション変数に格納され、可能な限り表示されることです。オーバーレイのあるページにリダイレクトすると、2つのことが起こります。

  1. メインページがレンダリングされ、表示されます。
  2. オーバーレイページがレンダリングされ、表示されます(iframeを使用)。

つまり、設定したメッセージは常にメインページに表示されます。

あなたができることは、メッセージを抽出してそれらを再設定して削除することです。これはあなたのテーマのどこかで発生する可能性があります。問題は、常にこれを行うとすべてのメッセージを効果的に非表示にするため、いつこれを行うべきかを判断するのがおそらく非常に難しいことです。もう1つの副作用は、常にメッセージがどんどん取得され、場合によっては致命的なメモリエラーが発生することです。

2
googletorp

@googletorpの書き込み:

これは現在のメッセージシステムでは不可能だと思います。とにかく機能させるには、いくつかのクレイジーな回避策が必要になります。

問題は、drupal_set_message()を使用すると、メッセージがセッション変数に格納され、可能な限り表示されることです。オーバーレイのあるページにリダイレクトすると、2つのことが起こります。

メインページがレンダリングされて表示されます。オーバーレイページがレンダリングされ、表示されます(iframeを使用)。つまり、設定したメッセージは常にメインページに表示されます。

あなたができることは、メッセージを抽出してそれらを再設定して削除することです。これはあなたのテーマのどこかで発生する可能性があります。

これは主にhook_init()で解決しました。私のシナリオは、私のマウドルの.installがいくつかのdrupal_set_messages()を作成し、ユーザーがadmin/modulesにリダイレクトされたときにオーバーレイによって隠されるというものでした。

私の.installでは、hook_install実装の最後の行は次のとおりです。

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

私の.moduleには:

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

これで、メッセージがオーバーレイに表示されます。

(Drupal 8からのオーバーレイの削除をお祝いしましょう!)

1
Brian Wood