mirror of
https://github.com/moodle/moodle.git
synced 2025-07-19 05:11:33 +02:00
MDL-49163 Webservices, AJAX: Add support for a new ajax webservice handler.
This is a new script that can call any function in the built-in AJAX webservice. This is a new system service that is added at install time (like the mobile webservice). It has no protocols added to it, but it accessible by a new ajax script /lib/ajax/service.php. Requests and responses to the script are required to be in json format, and multiple functions can be called in a single request.
This commit is contained in:
139
lib/amd/src/ajax.js
Normal file
139
lib/amd/src/ajax.js
Normal file
@@ -0,0 +1,139 @@
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Standard Ajax wrapper for Moodle. It calls the central Ajax script,
|
||||
* which can call any existing webservice using the current session.
|
||||
* In addition, it can batch multiple requests and return multiple responses.
|
||||
*
|
||||
* @module core/ajax
|
||||
* @package core
|
||||
* @copyright 2015 Damyon Wiese <damyon@moodle.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
define(['jquery', 'core/config'], function($, config) {
|
||||
|
||||
/**
|
||||
* Success handler. Called when the ajax call succeeds. Checks each response and
|
||||
* resolves or rejects the deferred from that request.
|
||||
*
|
||||
* @param {Object[]} responses Array of responses containing error, exception and data attributes.
|
||||
*/
|
||||
var requestSuccess = function(responses) {
|
||||
// Call each of the success handlers.
|
||||
var requests = this;
|
||||
var exception = null;
|
||||
var i = 0;
|
||||
var request;
|
||||
var response;
|
||||
|
||||
for (i = 0; i < requests.length; i++) {
|
||||
request = requests[i];
|
||||
|
||||
response = responses[i];
|
||||
// We may not have responses for all the requests.
|
||||
if (typeof response !== "undefined") {
|
||||
if (response.error === false) {
|
||||
// Call the done handler if it was provided.
|
||||
request.deferred.resolve(response.data);
|
||||
} else {
|
||||
exception = response.exception;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
// This is not an expected case.
|
||||
exception = new Error('missing response');
|
||||
break;
|
||||
}
|
||||
}
|
||||
// Something failed, reject the remaining promises.
|
||||
if (exception !== null) {
|
||||
for (; i < requests.length; i++) {
|
||||
request = requests[i];
|
||||
request.deferred.reject(exception);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Fail handler. Called when the ajax call fails. Rejects all deferreds.
|
||||
*
|
||||
* @param {jqXHR} jqXHR The ajax object.
|
||||
* @param {string} textStatus The status string.
|
||||
*/
|
||||
var requestFail = function(jqXHR, textStatus) {
|
||||
// Reject all the promises.
|
||||
var requests = this;
|
||||
|
||||
var i = 0;
|
||||
for (i = 0; i < requests.length; i++) {
|
||||
var request = requests[i];
|
||||
|
||||
if (typeof request.fail != "undefined") {
|
||||
request.deferred.reject(textStatus);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
return /** @alias module:core/ajax */ {
|
||||
// Public variables and functions.
|
||||
/**
|
||||
* Make a series of ajax requests and return all the responses.
|
||||
* @param {Object[]} Array of requests with each containing methodname and args properties.
|
||||
* done and fail callbacks can be set for each element in the array, or the
|
||||
* can be attached to the promises returned by this function.
|
||||
* @return {Promise{}} Array of promises that will be resolved when the ajax call returns.
|
||||
*/
|
||||
call: function(requests) {
|
||||
var ajaxRequestData = [],
|
||||
i,
|
||||
promises = [];
|
||||
for (i = 0; i < requests.length; i++) {
|
||||
var request = requests[i];
|
||||
ajaxRequestData.push({
|
||||
index: i,
|
||||
methodname: request.methodname,
|
||||
args: request.args
|
||||
});
|
||||
request.deferred = $.Deferred();
|
||||
promises.push(request.deferred.promise());
|
||||
// Allow setting done and fail handlers as arguments.
|
||||
// This is just a shortcut for the calling code.
|
||||
if (typeof request.done !== "undefined") {
|
||||
request.deferred.done(request.done);
|
||||
}
|
||||
if (typeof request.fail !== "undefined") {
|
||||
request.deferred.fail(request.fail);
|
||||
}
|
||||
request.index = i;
|
||||
}
|
||||
|
||||
ajaxRequestData = JSON.stringify(ajaxRequestData);
|
||||
var settings = {
|
||||
type: 'POST',
|
||||
data: ajaxRequestData,
|
||||
context: requests,
|
||||
dataType: 'json',
|
||||
processData: false
|
||||
};
|
||||
|
||||
$.ajax(config.wwwroot + '/lib/ajax/service.php', settings)
|
||||
.done(requestSuccess)
|
||||
.fail(requestFail);
|
||||
|
||||
return promises;
|
||||
}
|
||||
};
|
||||
});
|
Reference in New Issue
Block a user