web-dev-qa-db-ja.com

Ajaxフォームの送信後にページをリロードする方法

私はFAPI #ajaxを使用して、フォームをよりユーザーフレンドリーにします(検証時にインプレースで再読み込みします)。魅力のように機能します。ただし、フォームの送信後にページをリロードしたいと思います。どうやって?

明らかに、たとえばdrupal_goto(current_path())をサブミットハンドラー内で呼び出した場合、この関数はAJAX呼び出しを介して呼び出されるため、何も実行されません。ユーザーが実際に使用しているページは再ロードされません。 。

Drupal AJAX APIトリックは、AJAXフォーム送信後にページ全体をリロードできるようにするAPIトリックです。

1
SiliconMind

Ctoolsの依存関係を避けたいが、インラインjs-ingの落とし穴を避けたい場合...

送信ハンドラー

if (current_path() == 'system/ajax') {
  // This was an ajax submission.

  // Cause Drupal to rebuild the form
  $form_state['rebuild'] = TRUE;
  // Special flag, call it what you want.
  $form_state['ready_to_go'] = TRUE;
}

次に、ビルドフォーム関数で次のようなことを行います

if (!empty($form_state['ready_to_go'])) {

  // Add js to autosubmit, stored in an external js file.
  $form['#attached']['js'][] = drupal_get_path('module', 'mymod') 
    . '/my-bit-of-js.js';

}

次に、my-bit-of-js.jsファイルがフォームを見つけて、すぐに送信します。

これは何をしますか

フォームはajax対応です。必要に応じて、検証エラーが返されます。検証エラーがなくなると、フォームは送信されますが、非ajax送信を通じてフォームを送信するauto-submit-my-form jsが含まれていることを除いて、実際にはまったく同じように再構築されて返されます。必要なリダイレクトを発行します。

(インラインの例のように)jsにリダイレクトを行わせることもできますが、ajax以外の完全な送信を行う利点は、PHPを使用してwhereリダイレクト先。外部のjsファイルはフォームの値に基づいていないため、リダイレクトが必要になる可能性があります。この特定のケースでは、リロードしたいだけなので、このすべてを有益に意図されたものとして扱いますjus 'sayin':-)

余談:最後のページを除くマルチステップフォームajax

最終ページまでajaxになりたい複数ページのフォームがあるときに、これに遭遇しました(最終的な送信時にリダイレクトが必要だったため)。これを行う方法は、送信要素に#ajaxなしでフォームのlastページを作成したことです。 Drupalは、再構築されたフォームを探してコールバック(!)を見つけるため、フォームの最後のページを返すajaxコールバックを呼び出せなくなったためです。 「'#type' => 'hidden'」の「次へ」ボタンを非表示にして、#ajaxのものはそのままにして、#ajaxなしの別の送信ボタンを提供することがわかりました(別の#nameが必要です)。

0
artfulrobot

質問のために、ajaxの後にリダイレクトを行う簡単な方法は、ctoolsctools_ajax_command_redirectを使用することです。

// In your ajax form submit callback
ctools_include('ajax');
ctools_add_js('ajax-responder');
// Path to redirect to
$path = 'node/12';
$commands[] = ctools_ajax_command_redirect($path);
// you can also use ctools_ajax_command_reload() –  xurshid29
print ajax_render($commands);
drupal_exit();

これは、人気のあるcontribモジュールである ctools に依存していることに注意してください。

10
David Thomas

別の簡単な解決策は、モジュールのJSファイルでカスタムajaxコマンドを使用することです。

(function($) {
    // Custom AJAX commands
    if(typeof Drupal.ajax != "undefined") { // Ensure follwing code will not generate errors in administration pages
        Drupal.ajax.prototype.commands.reloadPage = function(ajax, rsp, status) {
            location.reload();
        };
    }
})(jQuery);

次に、ajaxコールバック関数でコマンドの配列を返すときにそれを呼び出します。

$commands = array();
...
$commands[] = array('command' => 'reloadPage');
...
return array('#type' => 'ajax', '#commands' => $commands);
3
ZalemCitizen