it-swarm.com.de

Controller-Funktion mit Ajax verwenden

Ich habe einen Controller wie unten.

<?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;
  }
}

diese obige Funktion wird aufgerufen und rendert den HTML-Code in der Mitte der Seite im HTML-Format, wobei die Seiten-URL gemäß der Definition in der Routing-Datei ( http://siteurl.com/user-list ) aufgerufen wird. Ich möchte diese HTML-Ausgabe in einer Ajax-Anfrage verwenden, die dieselbe Funktion über Ajax anstelle der Seiten-URL aufruft.

<?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;
  }
}

F) Gibt es eine Möglichkeit, die Ausgabe von getList () im HTML-Format in einem Ajax-Rückruf abzurufen?

5
sandipshirsale

Nach langem Suchen bekam ich endlich die Lösung. Ich möchte dies teilen.

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);
        }
    });
})

Jetzt muss ich nur noch den Controller- und Funktionsnamen übergeben, um die Funktion mit Ajax aufzurufen.

Der Hauptzweck dieser Methode ist die Wiederverwendbarkeit von Steuerungsfunktionen.

7
sandipshirsale