私はFAPI #ajaxを使用して、フォームをよりユーザーフレンドリーにします(検証時にインプレースで再読み込みします)。魅力のように機能します。ただし、フォームの送信後にページをリロードしたいと思います。どうやって?
明らかに、たとえばdrupal_goto(current_path())
をサブミットハンドラー内で呼び出した場合、この関数はAJAX呼び出しを介して呼び出されるため、何も実行されません。ユーザーが実際に使用しているページは再ロードされません。 。
Drupal AJAX APIトリックは、AJAXフォーム送信後にページ全体をリロードできるようにするAPIトリックです。
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
なしでフォームのlastページを作成したことです。 Drupalは、再構築されたフォームを探してコールバック(!)を見つけるため、フォームの最後のページを返すajaxコールバックを呼び出せなくなったためです。 「'#type' => 'hidden'
」の「次へ」ボタンを非表示にして、#ajax
のものはそのままにして、#ajax
なしの別の送信ボタンを提供することがわかりました(別の#name
が必要です)。
質問のために、ajaxの後にリダイレクトを行う簡単な方法は、ctools
とctools_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 に依存していることに注意してください。
別の簡単な解決策は、モジュールの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);