AJAX応答でコールバックを呼び出すだけです。
現在、私は次の応答を持っています。
private function responseWithSuccess($message, $status_code = 200)
{
$ajax_response = new AjaxResponse();
$ajax_response->setStatusCode($status_code);
$response =
[
'status' => 'success',
'message' => $message
];
$ajax_response->setContent(\GuzzleHttp\json_encode($response));
return $ajax_response;
}
指定された形式の応答を返しますが、この場合は応答テキストを聞くことができますか?
通信に使用されるDrupalコマンドクラスを使用する必要があることがわかりました。
だから私はカスタムコマンドを作成しました、ここにコードがあります
class CustomCallbackCommand implements CommandInterface, CommandWithAttachedAssetsInterface
{
use CommandWithAttachedAssetsTrait;
/**
* The content for the dialog.
*/
protected $message;
/**
* Constructs a \Drupal\mymodule\Ajax\BootstrapModalCommand object.
*/
public function __construct($message)
{
$this->message = $message;
}
/**
* {@inheritdoc}
*/
public function render()
{
return array(
'command' => 'onCustomCallback',
'message' => $this->message,
);
}
}
そして、それをそのような応答に追加します
private function responseWithSuccess($message, $status_code = 200)
{
$ajax_response = new AjaxResponse();
$ajax_response->setStatusCode($status_code);
$response =
[
'status' => 'success',
'message' => $message
];
$ajax_response->addCommand(new CustomCallbackCommand($response));
//$ajax_response->setContent(\GuzzleHttp\json_encode($response));
return $ajax_response;
}
しかし、リクエストを送信しようとすると、エラーが表示されます。
致命的なエラー:48行目の/public_html/core/lib/Drupal/Core/Ajax/AjaxResponse.phpのnullでメンバー関数getLibraries()を呼び出す
私のコードの何が問題になっていますか?
したがって、基本的に主要な問題は、応答が返されたときに特定のコールバックを呼び出す方法です。
追伸.
Drupal JSモジュールのデフォルトハンドラーをオーバーライドできることは知っていますが、より良い方法を探しています。
非常に基本的なコマンドの場合、CommandWithAttachedAssetsInterface
またはCommandWithAttachedAssetsTrait
を実装する必要はないでしょう。
カスタムコマンドの優れたブログ投稿チュートリアルは次のとおりです。 https://www.mike-miles.com/blog/creating-ajax-callback-commands-drupal-8
次に別の例を示します。 https://www.mediacurrent.com/blog/loading-and-rendering-modal-forms-drupal-8
例として、コマンドを実装するいくつかのモジュールを次に示します。
上記のように独自のプラグインを追加してプラグインまたはサードパーティのプラグインと通信するのは簡単なので、コアDrupal JSをオーバーライドする必要はありません。