web-dev-qa-db-ja.com

Ajaxコールバックはビュースタイルプラグイン内で機能しますか?

私のモジュールには、カスタムビュースタイルのプラグインがあります。スタイル設定フォームで、次のようなajaxコールバックを実装したいと思います。 https://www.drupal.org/docs/8/api/javascript-api/ajax-forms

しかし、私は運がありませんでした。スピニング効果は得られますが、その後は何も起こりません。これが私が試した例です:

use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\HtmlCommand;  

  public function TestCallback(array $form, FormStateInterface $form_state) {
    $ajax_response = new AjaxResponse();
    $text = 'Text to see if this is working';
    $ajax_response->addCommand(new HtmlCommand('#foo', $text));

    return $ajax_response;
  }

  /**
   * {@inheritdoc}
   */
  public function buildOptionsForm(&$form, FormStateInterface $form_state) {
    parent::buildOptionsForm($form, $form_state);

    $form['test'] = [
      '#title' => t('TEST!'),
      '#type' => 'select',
      '#options' => [
        '' => t('None'),
        'foo' => t('Bar'),
      ],
      '#ajax' => [
        'event' => 'change',
        'callback' => '::TestCallback',
    // having the line below uncommented seems to help        
    //'url' => views_ui_build_form_url($form_state),
      ],
      '#prefix' => '<div id="foo"></div>',
      '#default_value' => '',
    ];
  }

コメントされた「url」のコメントを外すと、次のエラーが発生します。

Uncaught TypeError: Cannot read property 'settings' of undefined
at resetSize (<anonymous>:34:32)
at later (debounce.js?v=8.6.3:20)

コメントし続けると、次のようになります。

Failed to load resource: the server responded with a status of 500 () 
/admin/structure/views/ajax/display/view_name/page_1/style_options? 
_wrapper_format=drupal_ajax&ajax_form=1&_wrapper_format=drupal_ajax:1
Uncaught Drupal.AjaxError
ajax.js?v=8.6.3:500

何が欠けているか、または間違っていますか?

2
andileco

AJAX docs を見て私が理解していることから、AjaxResponseオブジェクトを返すことは想定されていません。 Ajaxコールバックからレンダリング可能な配列を返すことになっています。

サンプルコード

public function buildOptionsForm(&$form, FormStateInterface $form_state) {
  parent::buildOptionsForm($form, $form_state);
  $form['test'] = [
    '#title' => t('TEST!'),
    '#type' => 'select',
    '#options' => [
      '' => t('None'),
      'foo' => t('Bar'),
    ],
    '#ajax' => [
      'event' => 'change',
      'wrapper' => 'ajax-output-container',
      // Since views style options forms are complex, they're built by
      // Drupal in a different way. To bypass this problem we need to
      // provide the full path to the Ajax callback.
      'callback' => __CLASS__ . '::testCallback',
    ],
    '#prefix' => '<div id="ajax-output-container"></div>',
    '#default_value' => '',
  ];
}

/**
 * This is the AJAX callback.
 *
 * It generates the output for the AJAX request. The output REPLACES
 * the "wrapper" you define in #ajax.
 */
public function testCallback(array $form, FormStateInterface $form_state) {
  // This element will replace the DIV#foo you have in your #prefix.
  $elem = [
    '#type' => 'markup',
    '#markup' => '<div id="ajax-output-container">Is it not working!></div>',
  ];
  return $elem;
}

デバッグ中

  • ページの読み込み時に、フィールドプレフィックスに正しいIDが含まれたdivを取得していることを確認してください。ページのロード時にそれを見ることができるように、いくつかのデフォルトのテキストをプレフィックスに入れることができますか?
  • 何らかの理由でHTMLタグが#prefixマークアップから削除されている場合は、#markupを使用してフォームに別のアイテムを挿入してみてください。
2
Jigarius

$ route_name = "views_ui.form _ {$ form_key}";問題かもしれません。

この結果をbuildOptionsForm関数の下のどこかに印刷して、それが問題かどうかを確認します。views_ui_build_form_url($ form_state)-> toString();

コメントを付けたままにすると、ajaxに必要なURLでも「#wrapper」でもないため、エラーが発生します。

ここで、このエラーをより深く調査できます: https://api.drupal.org/api/drupal/core%21modules%21views_ui%21admin.inc/function/views_ui_build_form_url/8.2.x

0
O-nur

これに関連する問題が発生していると思います Drupalコアの問題 。回避策の実装については、この 問題のコメント および これ を参照してください。

0
Jason