2

問題:

Drupal 7 のフォーム API では、#AJAX を使用してフィールドを更新すると、ページ全体が更新されるまで検証からのエラー メッセージが表示されません。更新したフィールドがエラー状態で強調表示されているのがわかりますが、ユーザーには手遅れになるまで (ページをリロードするか、別のページに移動するまで) 関連するメッセージが表示されません。

Drupal.org -- 検証中に特定のエラーを除外する方法でエラー スタックを手動で処理し始めましたが、フォームが複雑で、このタスクを完了するための予算が限られています。すべてを手動で処理せずに、スタックを更新してユーザーにメッセージを表示する方法が必要です。

注:私はコールバックでマルチコマンドを使用しているので、これを利用することは私のオプションです。

  $commands[] = ajax_command_replace("#my_wrapper", render($form['test']['field_a']));
  $commands[] = ajax_command_replace("#another_wrapper", render($form['test']['field_b']));

  return array('#type' => 'ajax', '#commands' => $commands);

考え?

4

2 に答える 2

5

解決:

どうやら、マルチコールバック アプローチを使用すると、Drupal はメッセージを更新しません。これは、次のように手動で行うことができます。

  // Remove the old messages div, clearing existing messages.
  $commands[] = ajax_command_remove('#messages');
  // Append a new messages div with our latest errors and messages.
  $commands[] = ajax_command_after('#header-region', '<div id="messages">' . theme('status_messages') . '</div>');

これを任意の callback commands[] 配列に追加するだけで、準備完了です。

Drupal.orgのおかげで-- AJAX コマンドと Drupal Messagesが正しい方向性を示してくれました!

于 2013-05-16T16:40:48.760 に答える
3

ありがとうアトモス!まだマルチコマンドを使用していない人のためのより完全な例:

 $form['ld']['letterdrop_allocations_submit'] = array(
     '#type' => 'submit',
     '#value' => 'Letterdrop allocations update',
     //        '#name' => 'Letterdrop allocations update',
     '#name' => 'agc_letterdrop_submit',
     '#ajax' => array(
       'callback' => 'agc_ems_form_letterdrop_submit_ajax',
       ),
     );

 ...

function agc_ems_form_letterdrop_submit_ajax($form, &$form_state) { 
  drupal_set_message('here i am world', 'ok'); 
  $commands = array(); 
  $commands[] = ajax_command_replace('#messages', 
      '<div id="messages">' . theme('status_messages') . '</div>'); 
  $commands[] = ajax_command_alert('submitted via handler'); 
  return array( 
      '#type' => 'ajax', 
      '#commands' => $commands); 
} 

また、もう少し簡潔で、メッセージがヘッダー領域の下にあるという前提を取り除きます。

$commands[] = ajax_command_replace('#messages', '<div id="messages">' . theme('status_messages') . '</div>');
于 2013-10-24T04:30:00.890 に答える