私のモジュールには、カスタムビュースタイルのプラグインがあります。スタイル設定フォームで、次のような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
何が欠けているか、または間違っていますか?
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;
}
#prefix
マークアップから削除されている場合は、#markup
を使用してフォームに別のアイテムを挿入してみてください。$ 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
これに関連する問題が発生していると思います Drupalコアの問題 。回避策の実装については、この 問題のコメント および これ を参照してください。