web-dev-qa-db-ja.com

JavaScriptでカスタムコールバック関数を呼び出す方法

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モジュールのデフォルトハンドラーをオーバーライドできることは知っていますが、より良い方法を探しています。

5
HelloMufecayo

非常に基本的なコマンドの場合、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をオーバーライドする必要はありません。

6
Kevin