0

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 ブラウジングは、驚くほど実りのないものになりました。

ありがとう!

4

1 に答える 1

3

最初に、いくつかの説明を示します
。 1. drupal メッセージをフォームの一部としてレンダリングしようとすると、drupal メッセージを手動でレンダリングする必要があります。
2. 「#ajax」キーを使用すると、追加の (カスタム) JS は必要ありません。
3. ボタンをクリックすると、フォームが再構築されるため、フォーム ロジック内にメッセージ レンダリング コードを配置するだけです。

単純なケースのコード例:

function test_error_form(&$form, &$form_state) {
  $form['test_error'] = array(
    '#type' => 'button',
    '#value' => t('Error'),
    '#ajax'  => array(
      'callback' => 'test_error_error',
      'wrapper'  => 'the-error-container',
    ),
  );
  $form['test_warning'] = array(
    '#type' => 'button',
    '#value' => t('Error'),
    '#ajax'  => array(
      'callback' => 'test_error_warning',
      'wrapper'  => 'the-error-container',
    ),
  );

  return $form;
}

function test_error_error($form) {
  drupal_set_message("Header error", 'error');
  return array(
    '#type' => 'markup',
    '#markup' => theme('status_messages'),
  );
}
function test_error_warning($form) {
  drupal_set_message("Header warning", 'warning');
  return array(
    '#type' => 'markup',
    '#markup' => theme('status_messages'),
  );
}

ページに id="the-error-container" を含む div が必要であることに注意してください。

新しい drupal メッセージを標準の場所に表示したい場合は、次のように ajax コマンドを使用してみてください。

$commands = array();
$commands[] = ajax_command_replace($selector, theme('status_messages'));
return array(
  '#type' => 'ajax',
  '#commands' => $commands,
);

$selector - メッセージ領域の css/jquery セレクターです。

不明な点があれば質問してください。

于 2013-11-14T11:02:22.850 に答える