Drupal Messages で AJAX 機能をテキスト化するために、現在カスタム モジュールを用意しています。モジュールには次のコードがあります (test_error.module):
<?php
function test_error_user_view_alter(&$build) {
//_assassinations_player_profile($build);
}
function test_error_form_alter(&$form, &$form_state, $form_id) {
$form['test_error'] = array(
'#type' => 'button',
'#name' => 'Error',
'#value' => t('Error'),
'#ajax' => array(
'callback' => 'test_error_error',
'wrapper' => 'the-wrapper-div-field',
),
);
$form['test_warning'] = array(
'#type' => 'button',
'#name' => 'Error',
'#value' => t('Error'),
'#ajax' => array(
'callback' => 'test_error_warning',
'wrapper' => 'the-wrapper-div-field',
),
);
return $form;
}
function test_error_error() {
drupal_set_message("Header error", 'error');
}
function test_error_warning() {
drupal_set_message("Header warning", 'warning');
}
次に、page.tpl.php で $messages を出力するために次のように記述します。
<div id="messages-wrap"><?php print $messages; ?></div>
AJAX 関数は、ボタンがクリックされたときに発生し、メッセージを設定しますが、メッセージはページのリロード後にのみ表示されます。次のように、リターン AJAX 呼び出しをハックしようとしました。
jQuery(document).ready( function(){
jQuery('.ajax-processed').each( function(){
jQuery(this).unbind();
});
jQuery('#edit-test-warning, #edit-test-error').click( function() {
var the_form = jQuery(this).closest('form');
var form_action = the_form.attr('action');
var details = the_form.serialize();
jQuery.ajax({
type: "POST",
url: form_action,
data: details
}).done( function(){
jQuery('#messages-wrap').load("/ #messages-wrap");
});
});
});
#edit-test-x ボタンでのクリック イベントのバインドは、Drupal のネイティブ ajax.js が ajax-x クラスを追加することで防止しているため、発生しません。
目標が非常に単純なものであるのに、この問題が非常に永続的で解決するのが非常に難しいことに、私は頭がおかしくなりました。私は何が欠けていますか?Google 検索と StackOverflow ブラウジングは、驚くほど実りのないものになりました。
ありがとう!