Создание "серийного" запуска с помощью битриксового аякса
 
Создание "серийного" запуска с помощью битриксового аякса
08.07.2015 23:56:02
Битрикс
191
Всвязи с большими объемами сделок (счетов,товаров) на сайтах, всё чаще возникает необходимость "серийного" (пошагового) запуска тех или иных обработчиков.
Всвязи с большими объемами сделок (счетов,товаров) на сайтах, всё чаще возникает необходимость "серийного" (пошагового) запуска тех или иных обработчиков.

Общая идея метода в следующем:

Имеем аякс-клиент,который с заданной периодичностью инициирует на сервере скрипт, обрабатывающий очередную порцию данных.

Принципиальное новшество метода,описанного в данной статье, в том, что клиентская часть реализована при помощи битриксовых аякс-функций.

Итак, задача реализуется при помощи трех страниц.

На первой - необходимые настроечные параметры запуска: ID инфоблока (указание CRM сущности - и т п - с чем собираемся работать),другие необходимые в контексте параметры плюс - шаг обработки данных. Страница представляет из себя форму, по кнопке сабмит сохраняем все введенные параметры в сессию и переходим к странице 2.

Вот примерный код:

				 if ($y = $_POST['id кнопки Сабмит']){    &nbsnbsp;  $_SESSION["имя переменной сессии"] = $_POST[имя параметра];       ..............................            ............................       $_SESSION["..."] = $_POST["..."];       require($_SERVER["DOCUMENT_ROOT"]."/адрес страницы 2 от корня сайта");      else             {       ?>          
				                       
			
Вторая страница - аяксовая часть.

На ней не должно быть ничего лишнего, только именованный див (для вывода сообщений аякс-скрипта и результата) и собственно аякс-функция

Вот примерный код

				
некое сообщение наподобие "подождите,идет обработка..."
   function repeat_export() {       BX.ajax({       url: 'адрес страницы с кодом собственно обработчика',            data: {здесь могут быть параметры,в нашем случае их нет,т к сохранены в сессии},            method: 'POST',            dataType: 'html',            timeout: 500000, // пауза между запусками скрипта            async: false,            processData: true,            scriptsRunFirst: true,            emulateOnload: true,            start: true,            cache: false,            onsuccess: function(data){                     if (parseInt(data)>0) // Проверка - не дошли ли до конца процесса.У нас обрабатываются последовательно элементы инфоблока,                                    //скрипт в ответе присылает ID последнего обработанного,его же сохраняет в сессию.                                    // Если ни одного элемента обработано не было (закончились)- в ответе придет "The end"                                  // таким образом - если ответ - целое число,отличное от нуля - процесс продолжаем.                                  //Иначе - выводим сообщение об окончании (уже на русском) {                BX("имя тега,где выводим сообщения и результаты").innerHTML =некое промежуточное сообщение наподобие   "обрабатывается элемент №"+data;
				               setTimeout(repeat_export, 1000); // циклический вызов скрипта                             }             else {                BX("step5-progress-bar").innerHTML = '';             }            },            onfailure: function(){            }       });    }        BX.ready(function (){          setTimeout(repeat_export, 10);    });    
			
И третья страница - собственно,скрипт-обработчик
				         
			

Загрузка...