Note:

If you want to create a new page for developers, you should create it on the Moodle Developer Resource site.

AJAX

From MoodleDocs

AJAX (Asynchronous Javascript and XML) is a modern web design technique that allows for more interactivity by making webpages that fetch data in the background and alter themselves without reloading the entire page. This helps to make a page feel much more like an application than a web page. AJAX is a new way of working with existing technologies (including HTML, Javascript, CSS and the XMLHttpRequest object amongst others) rather than a new piece of technology in itself.

Although AJAX indicates that XML is used, the term really relates to the group of technologies and in Moodle we tend to favour use of JSON rather than XML as the syntax is lighter and leads to a smaller output. It is also easier to construct from php data structures.

Ajax in Moodle

Moodle 2.9


The preferred way to write new ajax interactions in Moodle is to use the javascript module "core/ajax" which can directly call existing web service functions.

Some benefits of this system are:

  1. No new ajax scripts need auditing for security vulnerabilities
  2. Multiple requests can be chained in a single http request
  3. Strict type checking for all parameters and return types
  4. New webservice functions benefit Ajax interfaces and web service clients

So the steps required to create an ajax interaction are:

  1. Write or find an existing web service function to handle the ajax interaction: See Web_services
  2. White list the web service for ajax. To do this, a new function needs to be added to the external service class "<methodname>_is_allowed_from_ajax() { return true; }". Only functions that are whitelisted using this mechanism will be available to the ajax script.
  3. Call the web service from javascript in response to a user action:

Example calling core_get_string: require(['core/ajax'], function(ajax) {

   var promises = ajax.call([
       { methodname: 'core_get_string', args: { component: 'mod_wiki', stringid: 'pluginname' } },
       { methodname: 'core_get_string', args: { component: 'mod_wiki', stringid: 'changerate' } }
   ]);
  promises[0].done(function(response) {
      console.log('mod_wiki/pluginname is' + response);
  }).fail(function(ex) {
      // do something with the exception
  });
  promises[1].done(function(response) {
      console.log('mod_wiki/changerate is' + response);
  }).fail(function(ex) {
      // do something with the exception
  });

});

Note: This example chains to separate calls to the core_get_string webservice in one http request

Note: Don't actually fetch strings like this, it is just an example, use the 'core/str' module instead.

To update parts of the UI in response to Ajax changes, consider using Templates

For information on writing AJAX scripts for Moodle before Moodle 2.9 see: AJAX pre 2.9

See also