Использование ajax модуля Обмен данными для выполнения определенных операций

Материал из Umicms
Перейти к:навигация, поиск

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

Итак, что же необходимо сделать, для использования готового функционала модуля "Обмен данными". Аналогично данной статье Добавление нового формата экспорта данных добавляем новый тип импорта данных, указываем идентификатор ajax.

Файл ajaxSplitter.php, следующего содержания:

<?php
  class ajaxSplitter extends umiImportSplitter {
  
    protected function readDataBlock() {
      // xml-пустышка
      $doc = new DOMDocument("1.0", "utf-8");
      $doc->formatOutput = XML_FORMAT_OUTPUT;
      $rootNode = $doc->createElement("umidump");
      $doc->appendChild($rootNode);
      $rootNode->setAttribute('version', '2.0');
      // текущее смещение
      $index = ($this->offset) ? $this->offset : 0;
      //Какие-то действия, в зависимости от текущего смещения
      
      
      //тестовый лог
      //file_put_contents(CURRENT_WORKING_DIR .'/traceajax.txt', $index.';', FILE_APPEND);
      
      $this->offset = $index + 1;
      // условие для остановки цикла, которое необходимо настроить
      if($this->offset > 100) $this->complete = true;    
      return $doc;
    }
    
    public function translate(DomDocument $doc) {
      return $doc->saveXML();
    }
  
  }
?>

необходимо скопировать в папку: \classes\system\subsystems\import\splitters\

Потом, в модуле "Обмен данными" необходимо создать сценарий импорта, указать наш новый тип импорта, и также необходимо указать любой файл на сервере. В методе readDataBlock необходимо прописать php-код для выполнения и настроить условие остановки ajax-цикла. После настройки метода readDataBlock можно запустить сценарий импорта стандартным способом.