$ messagesの更新が1ページ遅れるのはなぜですか?


10

私は非常にシンプルなテンプレートのページを持っています:

<!DOCTYPE html>
<html>
<head><title>TEST REGISTRATION PAGE</title></head>
<body>
    <?php 
        print drupal_get_form('user_register');
        print $messages;
        print $closure;
        print $main_content;
    ?>
</body></html>

基本的には、登録フォームのみを表示します。

  1. フォームにいくつかの不正なデータを入力しました—既に使用されているユーザー名(admin)で、電子メールアドレスはありません。
  2. 「新規アカウント作成」をクリックします。
  3. ページが送信されて再読み込みされたようですが、何も起こりません。エラーメッセージは表示されていません。
  4. ページを更新します(F5)。
  5. Firefoxは「このページを表示するには、Firefoxは以前に実行されたアクションを繰り返す情報を送信する必要があります」と表示するため、POSTが以前に実行されたことがわかります。
  6. そのダイアログウィンドウで[再送信]をクリックします。
  7. エラーメッセージが表示されます—「電子メールアドレスフィールドは必須です」、「名前adminは既に使用されています」。

これは、登録フォームだけでなく、これまでにテストしたすべてのフォームで発生します

なぜこうなった?エラーメッセージが初めて表示されるように修正するにはどうすればよいですか?

これをデバッグするために必要なことは何でもできて嬉しいですが、調べ始めるにはいくつかの指示が必要です。:)

回答:


4

最も可能性の高い問題は、メッセージが既に作成されているときにフォームを呼び出すことです。そのため、メッセージは表示されません。drupal_get_messagesを使用して、ページの作成プロセスの早い段階でフォームを呼び出すか、メッセージを取得する必要があります。

あなたが本当にやるべきことは、あなたがテーマでこれを行う代わりに、この機能をモジュールで作成し、代わりにページをテーマにすることです。このような多くの問題が発生する可能性があります。


はい、ようやくこれを修正したかもしれません。私は何もなく、リターンしません「my_register_form」と呼ばれるモジュール書いたdrupal_get_form('user_register')中に$block['content']。コンテキストを介してそのモジュールを含めると、送信後に登録エラーメッセージが正しく表示されます。非常に複雑に見えますが、機能し、ログイン/登録フォームを希望どおりに含めることができます。ご協力ありがとうございます。
ジョージ

3

フォーム検証の問題(メッセージのレンダリング後にフォーム検証が行われ、次のリクエストで表示される)を解決しました。

hook_node_viewでフォーム検証を強制する

/**
 * This is a fix for a bug where the validation error messages lag a 
 * full request behind form submissions
 */
function your_module_node_view($node, $view_mode){
  // check that form id is the form you want
  if ( !isset( $_POST['form_id'] ) || $_POST['form_id'] != 'your_form_id' ){
    return;
  }
  // this forces validation of the form 
  drupal_get_form('your_form_id');
}

2

私もこの問題に苦しみました。@googletorpの答えは私がそれを解決するのに役立ちました。

ページtplの先頭。フォームのレンダリングされたコンテンツを取得する、つまり私の場合:

$register_form = drupal_get_form('user_register_form');
$register_form_content = render($register_form);

$form_user_pass = drupal_get_form('user_pass');
$form_user_pass_content = drupal_render($form_user_pass);

$login_form = drupal_get_form('user_login_block');
$login_form_content = render($login_form);

次に、メッセージ印刷セクションで、tplページのdrupal_get_messages()を呼び出すメッセージを取得します。$ messagesは、ページを更新しなければメッセージを取得できません。

<?php 
    $messages = drupal_get_messages('error');
    if(is_array($messages['error']) && count($messages['error'])) {
?>
    <div id="messages">
        <div class="section clearfix">
            <div class="messages error">
                <ul>
                    <?php 
                    foreach($messages['error'] as $item) {
                        echo '<li>'.$item.'</li>';
                    }
                    ?>
                </ul>
            </div>
        </div>
    </div>
<?php
    }
?>

次に、レンダリングされたフォームのコンテンツを適切なセクションに印刷し、解決します:)。


1

直接尋ねられた質問の解決策ではありませんが、同じ問題が発生したときにこれに遭遇しました:

フォームブロックがtpl.phpファイルから直接呼び出された場合(おそらくレイアウト上の理由から)、遅延メッセージが表示されます。

つまり、テンプレートファイルに次のコードを含むブロックをロードしていました。

$vars['contact_details'] = module_invoke('viewusercontact', 'block_view', 0);

そして、それを私のtpl.phpファイルにレンダリングします。

<?php print render $contact_details ?>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.