Мой сайт активно использует ajax для таких вещей, как редактирование пользовательских данных. Я хочу создать режим администратора, чтобы администратор мог редактировать данные пользователя, не входя под ним (и, следовательно, не узнавая их пароль).
Я планирую, чтобы все страницы сведений о пользователе на моем сайте принимали параметр id
. Если посетитель страницы вошел в систему как администратор, я хочу, чтобы этот идентификатор был добавлен к данным всех отправленных запросов ajax. Поэтому, если пользователь вошел в систему как администратор, после загрузки библиотеки mootools я добавлю некоторый JavaScript на страницу, что заставит метод Request всегда переносить этот идентификатор при выполнении запросов.
Как мне это реализовать?
Это метод отправки для класса запроса:
send: function(options){
if (!this.check(options)) return this;
this.options.isSuccess = this.options.isSuccess || this.isSuccess;
this.running = true;
var type = typeOf(options);
if (type == 'string' || type == 'element') options = {data: options};
var old = this.options;
options = Object.append({data: old.data, url: old.url, method: old.method}, options);
var data = options.data, url = String(options.url), method = options.method.toLowerCase();
switch (typeOf(data)){
case 'element': data = document.id(data).toQueryString(); break;
case 'object': case 'hash': data = Object.toQueryString(data);
}
//---------
//LOOK HERE
//---------
if (this.options.format){
var format = 'format=' + this.options.format;
data = (data) ? format + '&' + data : format;
}
if (this.options.emulation && !['get', 'post'].contains(method)){
var _method = '_method=' + method;
data = (data) ? _method + '&' + data : _method;
method = 'post';
}
if (this.options.urlEncoded && ['post', 'put'].contains(method)){
var encoding = (this.options.encoding) ? '; charset=' + this.options.encoding : '';
this.headers['Content-type'] = 'application/x-www-form-urlencoded' + encoding;
}
if (!url) url = document.location.pathname;
var trimPosition = url.lastIndexOf('/');
if (trimPosition > -1 && (trimPosition = url.indexOf('#')) > -1) url = url.substr(0, trimPosition);
if (this.options.noCache)
url += (url.contains('?') ? '&' : '?') + String.uniqueID();
if (data && method == 'get'){
url += (url.contains('?') ? '&' : '?') + data;
data = null;
}
var xhr = this.xhr;
if (progressSupport){
xhr.onloadstart = this.loadstart.bind(this);
xhr.onprogress = this.progress.bind(this);
}
xhr.open(method.toUpperCase(), url, this.options.async, this.options.user, this.options.password);
if (this.options.user && 'withCredentials' in xhr) xhr.withCredentials = true;
xhr.onreadystatechange = this.onStateChange.bind(this);
Object.each(this.headers, function(value, key){
try {
xhr.setRequestHeader(key, value);
} catch (e){
this.fireEvent('exception', [key, value]);
}
}, this);
this.fireEvent('request');
xhr.send(data);
if (!this.options.async) this.onStateChange();
if (this.options.timeout) this.timer = this.timeout.delay(this.options.timeout, this);
return this;
}
В отмеченном мною месте метод добавляет дополнительные данные к запросам. Я думал, что это будет хорошим местом для добавления моего кода. Я мог бы переписать метод, чтобы включить что-то вроде этого:
if (_USER_ID_TO_EDIT){
var id= 'userIdToEdit=' + _USER_ID_TO_EDIT;
data = (data) ? id+ '&' + data : id;
}
Однако это не очень удачное решение, потому что это означает, что если в библиотеке есть какие-либо изменения в функции send (), мой код станет не синхронизированным (мне нравится использовать последнюю версию библиотеки.)
Есть ли лучший способ сделать это (и сработает ли мой метод здесь)? Как добавить содержимое ко всем запросам, отправленным классом Request
, не изменяя ~ 20 файлов .js и ~ 100 вариантов использования этого класса в других местах на моем сайте?