こちらのサイトでは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に関するご質問がございましたら、お気軽にお問い合わせください。