【Drupal】AjaxでControllerに定義されたコールバック関数を利用する

こちらのサイトではDRUPAL10に関連する記事を掲載しています。

本記事は以下のページをを翻訳しました。

controller function use with ajax
I have one controller like as below . <?php namespace Drupal\users\Controller; use Drupal\Core\Controller\ControllerBase; class UsersController extends Co...

以下のようなコントローラーが1つあります。

<?php
namespace Drupal\users\Controller;

use Drupal\Core\Controller\ControllerBase;


class UsersController extends ControllerBase {


  public function getList() {
    $time = time();
    $data = array();
    $response = $data = $result = null;

      // add all the data in one multiple dim. array
      $data['title'] = 'Example to consume REST API of User List';
      $data['users'] = $result->list;
      $data['form_data'] = $result->form_data;

      // display the content in the middle section of the page
      $build = array(
        '#theme' => 'users_list', // assign the theme [users-list.html.twig]
        '#title' => 'Example to consume REST API', 
        '#pagehtml' => 'API URL : api/users/list ',
        '#data' => $data
      ); 
    }


    return $build;
  }
}

で定義されているようにページ URL が呼び出される HTML 形式でページの中央に HTML がレンダリングされます 上記の関数が呼び出され、ルーティング ファイル ( http://siteurl.com/user-list ) 。 ページ URL の代わりに ajax 経由で同じ関数を呼び出す ajax リクエストでこの HTML 出力を使用したいと考えています。

<?php
namespace Drupal\ajax\Controller;

use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\HttpFoundation\JsonResponse;

class AjaxController extends ControllerBase {

  public function call_ajax(){

      //  my target is like as below
       $op = Drupal\Core\Controller\UsersController()->getList();
       return $op;
  }
}

Q) ajax コールバックで getList() の出力を HTML 形式で取得する方法はありますか?

1 件の回答

最終的に解決策を見つけました。 これを共有したいと思います。

AjaxController.php

namespace Drupal\ajax\Controller;

use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\HttpFoundation\JsonResponse;

class AjaxController extends ControllerBase {

  public function call_ajax($controller,$function){
    $args = func_get_args();
    $r = array();
    $r['html'] = null;

    $class = "\\Drupal\\".$controller."\\Controller\\".ucfirst($controller)."Controller";

    $obj = new $class();

    if(method_exists($obj,$function)){
      $r['html'] = render($obj->$function());
    }
    return new JsonResponse($r);
  }

}

ajax.routing.yml

ajax.call:
  path: '/call/ajax/{controller}/{function}'
  defaults:
    _controller: '\Drupal\ajax\Controller\AjaxController::call_ajax'
    _title: 'Get List'
  methods:  [GET]
  requirements:
    _permission: 'access content'

ajax.js

jQuery(document).ready(function($a){
    $a.ajax({
        url: "call/ajax/users/getList", 
        method :'GET',
        dataType: "json", 
        success: function(result){
          $a(".region-content").html(result.html);
        }
    });
})

ここで、ajax を使用して関数を呼び出すには、コントローラーと関数名を渡すだけです。

この方法を使用する主な目的は、コントローラーの機能を再利用できるようにすることです。

このサイトに関するご意見・ご質問はこちらまで

この記事またはDrupalに関するご質問がございましたら、お気軽にお問い合わせください。

タイトルとURLをコピーしました