diff options
-rw-r--r-- | js/lib/ajax.js | 83 |
1 files changed, 45 insertions, 38 deletions
diff --git a/js/lib/ajax.js b/js/lib/ajax.js index 3ea4377a4..36f76b2c3 100644 --- a/js/lib/ajax.js +++ b/js/lib/ajax.js @@ -9,16 +9,16 @@ elgg.provide('elgg.ajax'); /** * Wrapper function for jQuery.ajax which ensures that the url being called * is relative to the elgg site root. - * + * * You would most likely use elgg.get or elgg.post, rather than this function - * + * * @param {string} url Optionally specify the url as the first argument * @param {Object} options Optional. {@see jQuery#ajax} * @return {XmlHttpRequest} */ elgg.ajax = function(url, options) { options = elgg.ajax.handleOptions(url, options); - + options.url = elgg.normalize_url(options.url); return $.ajax(options); }; @@ -34,7 +34,7 @@ elgg.ajax.ERROR = -1; /** * Handle optional arguments and return the resulting options object - * + * * @param url * @param options * @return {Object} @@ -44,23 +44,23 @@ elgg.ajax.handleOptions = function(url, options) { var data_only = true, data, member; - + //elgg.ajax('example/file.php', {...}); if (elgg.isString(url)) { options = options || {}; - + //elgg.ajax({...}); } else { options = url || {}; url = options.url; } - + //elgg.ajax('example/file.php', function() {...}); if (elgg.isFunction(options)) { data_only = false; options = {success: options}; } - + //elgg.ajax('example/file.php', {data:{...}}); if (options.data) { data_only = false; @@ -78,75 +78,75 @@ elgg.ajax.handleOptions = function(url, options) { data = options; options = {data: data}; } - + if (url) { options.url = url; } - + return options; }; /** * Wrapper function for elgg.ajax which forces the request type to 'get.' - * + * * @param {string} url Optionally specify the url as the first argument * @param {Object} options {@see jQuery#ajax} * @return {XmlHttpRequest} */ elgg.get = function(url, options) { options = elgg.ajax.handleOptions(url, options); - + options.type = 'get'; return elgg.ajax(options); }; /** * Wrapper function for elgg.get which forces the dataType to 'json.' - * + * * @param {string} url Optionally specify the url as the first argument * @param {Object} options {@see jQuery#ajax} * @return {XmlHttpRequest} */ elgg.getJSON = function(url, options) { options = elgg.ajax.handleOptions(url, options); - + options.dataType = 'json'; return elgg.get(options); }; /** * Wrapper function for elgg.ajax which forces the request type to 'post.' - * + * * @param {string} url Optionally specify the url as the first argument * @param {Object} options {@see jQuery#ajax} * @return {XmlHttpRequest} */ elgg.post = function(url, options) { options = elgg.ajax.handleOptions(url, options); - + options.type = 'post'; return elgg.ajax(options); }; /** * Perform an action via ajax - * + * * @example Usage 1: * At its simplest, only the action name is required (and anything more than the * action name will be invalid). * <pre> * elgg.action('name/of/action'); * </pre> - * Note that it will *not* love you if you specify the full url as the action - * (i.e. elgg.yoursite.com/action/name/of/action), but why would you want to do - * that anyway, when you can just specify the action name? - * + * + * The action can be relative to the current site ('name/of/action') or + * the full URL of the action ('http://elgg.org/action/name/of/action'). + * * @example Usage 2: * If you want to pass some data along with it, use the second parameter * <pre> * elgg.action('friend/add', { friend: some_guid }); * </pre> - * + * * @example Usage 3: * Of course, you will have no control over what happens when the request * completes if you do it like that, so there's also the most verbose method @@ -161,28 +161,35 @@ elgg.post = function(url, options) { * } * </pre> * You can pass any of your favorite $.ajax arguments into this second parameter. - * + * * @note If you intend to use the second field in the "verbose" way, you must * specify a callback method or the data parameter. If you do not, elgg.action * will think you mean to send the second parameter as data. - * + * * @note You do not have to add security tokens to this request. Elgg does that * for you automatically. - * + * * @see jQuery.ajax - * + * * @param {String} action The action to call. * @param {Object} options * @return {XMLHttpRequest} */ elgg.action = function(action, options) { elgg.assertTypeOf('string', action); - - options = elgg.ajax.handleOptions('action/' + action, options); - + + // support shortcut and full URLs + // this will mangle URLs that aren't elgg actions. + // Use post, get, or ajax for those. + if (action.indexOf('action/') < 0) { + action = 'action/' + action; + } + + options = elgg.ajax.handleOptions(action, options); + options.data = elgg.security.addToken(options.data); options.dataType = 'json'; - + //Always display system messages after actions var custom_success = options.success || elgg.nullFunction; options.success = function(json, two, three, four) { @@ -190,16 +197,16 @@ elgg.action = function(action, options) { elgg.register_error(json.system_messages.errors); elgg.system_message(json.system_messages.success); } - + custom_success(json, two, three, four); }; - + return elgg.post(options); }; /** * Make an API call - * + * * @example Usage: * <pre> * elgg.api('system.api.list', { @@ -208,24 +215,24 @@ elgg.action = function(action, options) { * } * }); * </pre> - * + * * @param {String} method The API method to be called * @param {Object} options {@see jQuery#ajax} * @return {XmlHttpRequest} */ elgg.api = function (method, options) { elgg.assertTypeOf('string', method); - + var defaults = { dataType: 'json', data: {} }; - + options = elgg.ajax.handleOptions(method, options); options = $.extend(defaults, options); - + options.url = 'services/api/rest/' + options.dataType + '/'; options.data.method = method; - + return elgg.ajax(options); }; |