AJAX в UMI.CMS. Часть 2

Некоторое время назад я рассматривал яваскриптовый класс для ajax-отправки запросов в среде UMI.CMS. За прошедшее время пришел к мысли, что класс неплохо бы доработать...

Некоторое время назад я рассматривал яваскриптовый класс для ajax-отправки запросов в среде UMI.CMS. За прошедшее время пришел к мысли, что класс неплохо бы доработать...

Что хочется от яваскрипта:

  • задавать адрес обработчика
  • задавать параметры поштучно или массивом
  • по получении данных с ними, обычно, что-то требуется сделать. Будем передавать callback-функцию в наш класс

Пишем класс. Как всегда, я рассчитываю на использование фреймворка Mootools, в данном случае версии 1.2.5.1.  Версия 1.3 очень хороша, но напрочь лишена совместимости; посему пока воздерживаюсь от ее использования. Если вы фанат jquery, то рецепт здесь.

Это код для mootools 1.2

var umiRequest = new Class({
      Implements: [Events, Options],
     options: {
          url: '/content/get_ajax_content/',
          method: 'post',
         callback:  function(text){return text},
          params: new Hash,
         mode: 'update'  //update or result
     },
      initialize: function (){
         var  params = Array.link(arguments, {options: Object.type, elements: $defined});
          this.setOptions(params.options || null);
     },
      setValue: function(key, value){
          this.options.params.set(key,value);
     },
      setValues: function(values){//must be an object
          this.options.params.extend(values);
     },
      send: function (request){
          this.cook = document.cookie;//получаем все куки
          request.setHeader('Cookie', this.cook);
          request.send();
     },
    commit:  function(){
         if(!this.options.url)  alert('Не указан целевой адрес!');//здесь бы хорошо сделать более умную  обработку ошибки
         var _self =  this;
         var data =  this.options.params.toQueryString();
         
          var request = new Request({
              method: this.options.method,
              url: this.options.url,
              data: data,
              evalScripts: true,
              onComplete: function(text){
                  if(_self.options.mode == 'result') return text;
                  else _self.options.callback(text);
          }
         });
          this.send(request);
     }
 }); 

Это код для mootools 1.3

var umiRequest = new Class({
     Implements: [Events, Options],
     options: {
         url: '/content/get_ajax_content/',
         method: 'post',
         callback: function(text){return text},
         params: new Object({}),
         mode: 'update' //update or result
     },
     initialize: function (){
         var params = Array.link(arguments, {options: Object.type, elements: $defined});
         this.setOptions(params.options || null);
     },
     setValue: function(key, value){
         this.options.params[key] = value;
     },
     setValues: function(values){//must be an object
         this.options.params.append(values);
     },
     send: function (request){
         this.cook = document.cookie;//получаем все куки
         request.setHeader('Cookie', this.cook);
         request.send();
     },
     commit: function(){
         if(!this.options.url) alert('Не указан целевой адрес!');
         var _self = this;
         var data = Object.toQueryString(this.options.params);
 
         var request = new Request({
             method: this.options.method,
             url: this.options.url,
             data: data,
             evalScripts: true,
             onComplete: function(text){
                 if(_self.options.mode == 'result') return text;
                 else _self.options.callback(text);
             }
         });
         this.send(request);
     }
 });

Параметры:

  • url - адрес server-side обработчика
  • method - метод передачи данных
  • callback - функция обратного вызова
  • params - хеш параметров, из которых будет сформирована QUERY_STRING (объект Hash в терминологии Mootools)
  • mode - указывает, следует ли вернуть результат в чистом виде или что-то с ним сделать; предусмотрен был на этапе создания, но пока не использовался.

Методы:

  • setValue - задать пару ключ-значение, которые будут добавлены в QUERY_STRING.
  • setValues - то же, но передается Hash. Удобно использовать, когда данные берутся из формы
  • send - отправка формы. Только для совместимости с более ранними версиями
  • commit - отправка формы

 

Пример использования

Допустим, имеем форму

<div id="form_container">
     <form onsubmit="return  false;">
         <input type="text"  name="value1">
         <input type="text"  name="value2">
         <input type="submit"  name="submit" onclick="ajax_send(this)">
     </form>
 </div>

function ajax_send(el){
     var form =  $(el).getParent('form'); 
 
     var callback =  function(text){
          $('form_container').empty().set('html',text);
          //по получении ответа удалить код формы 
          //и полученный ответ вставить на ее место как html
     }
 
      var request = new umiRequest({
          url: '/content/query/',
          callback: callback
     });
      request.setValue('mode','mail');//задаем некий дополнительный параметр
 
      //получаем данные из формы; 
     //столь длинная запись -  чтобы получить на выходе корректный Hash. 
     //В идеале,  надо бы перенести это в класс. Доработайте;)
      request.setValues(form.toQueryString().parseQueryString());
 
      request.commit();
 }