Центр документации
Карта сайта


Новая документация

Настройка платежных систем
Настройка способа оплаты КупиВкредит
Настройка способа оплаты Acquiro
Настройка способа оплаты AvisoSMS

Обновленная документация 

Разработчикам (API)
Руководство пользователя

Импорт данных

Общая информация

Amiro.CMS предоставляет систему импорта из разнообразных источников по заданному расписанию.
В базовой комплектации системы поставляются два драйвера - драйвер импорта из RSS-лент (поддерживаются форматы RSS 1.0, RSS 2.0 и Atom 2.0), и драйвер импорта данных из CSV файлов.

Так же, возможно как расширение функционала уже созданных драйверов импорта, так и написание своих драйверов импорта на основе абстрактных классов AMI_Http_DataImportDriver и AMI_File_DataImportDriver.


Создание собственного драйвера импорта

Каждый драйвер импорта должен быть унаследован от одного из двух абстрактных классов:

  • AMI_Http_DataImportDriver предоставляет API для соединения с источником по протоколу HTTP, используя один из следующих методов: библиотека cURL, функция file_get_contents (при включенной директиве allow_url_open), либо через сокеты.
  • AMI_File_DataImportDriver предоставляет базовое API для импорта данных из пользовательских файлов (файл должен находится в директории _mod_files/_upload)
Драйвер импорта должен реализовывать интерфейс AMI_iDataImportDriver. В частности, при создании собственного драйвера импорта, необходимо реализовать метод doImport() (остальные необходимые методы уже реализованы в базовых классах, однако, при необходимости, вы можете их перегрузить), в котором будет описана логика разбора данных после получения их из источника.

Каждый драйвер может иметь набор настроек, которые добавляются на форму, отображаемую при создании задачи в модуле импорта. Например, для драйвера RSS это может быть опция принудительного  удаления html-тегов из импортируемого текста, а для драйвера CSV - разделитель полей файла.

Драйвер должен иметь имя файла как AmiClean_DataImport_YourNameImport, совпадающее с именем класса. Для того, чтобы система подгружала Ваш драйвер, необходимо добавить строку вида
'import_driver/your_name'     => 'AmiClean_DataImport_YourNameImport',
в файл _shared/code/classes/60/resourceMapping.60.php в секцию DataImport, а после этого задекларировать и включить драйвер в файле _local/data_import_drivers.php.

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

Ниже показано, как Вы можете добавить свои настройки для драйвера:
$this->aDriverSettings = array(
            array('name' => 'rss_type', 'type' => 'select', 'data' => $this->getRssTypes()),
            array('name' => 'strip_tags', 'type' => 'checkbox'),
        );
 
Поля настроек драйвера, отображаемые на форме создания задачи, ничем не отличаются от других полей, добавляемых на форму. Формат добавляемых полей подробно описан здесь: Форма - возможности

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

В списке полей импорта, помимо названия полей, можно так же указывать имя метода, который будет выполняться при заполнении соответствующего поля таблицы. Имя поля должно заканчиваться круглыми скобками (например, myOperation()), а имя метода, описанного в классе должно состоять из field + myOperation() (см. ниже.)

Предположим, вы импортируете RSS-ленту, но помимо данных из RSS вы хотите указать текущее время в формате Y-m-d H:i:s
Укажем конечную таблицу news (имя таблицу указывается БЕЗ префикса. 

Имена полей будут header, body, date.
Имена импортируемые полей будут title, text, myOperation(). Здесь мы хотим помещать в date значение, возвращаемое функцией fieldMyOperation.
Теперь опишем эту функцию в нашем драйвере:
В нее передается объект oEntry, который является текущей строкой импортируемых данных. Однако, сейчас он нам не нужен - нам достаточно просто возвращать время в определенном формате.
 

 

public function fieldMyOperation($oEntry){
        return date('Y-m-d H:i:s', time());
    }

Теперь, в поле date будет возвращаться текущая дата.

 

Вы можете изменять поведение импорта, используя события, которые вызываются при инициализации драйвера, подключении к источнику, чтению данных, и т.п.
Список событий описан ниже:

Название событияКогда вызывается
ami_data_import_driver_before_save_itemВ методе save(), , после импорта данных, перед сохранением модели в БД
ami_data_import_driver_handle_fieldВ методе handleField(), после обработки каждого поля (если используется параметр handleAs)
ami_data_import_after_importВ драйвере RSS \ CSV, в методе doImport, после импорта всех данных, перед сохранением в БД

 

В минимуме, драйвер должен должен описывать методы doImport() и isImportResourceAvailable(). Ниже представлен пример абстрактного драйвера, который получает некие html данные по протоколу http, и затем парсит их при помощи парсера html.

 

class AmiClean_DataImport_HtmlPagesImport extends AMI_Http_DataImportDriver{
    /**
     * Driver name
     *
     * @var string
     */
    protected $driverName = 'html_pages';
    /**
     * Html parser class
     *
     * @var string
     */
    protected $oHtmlParser;
    /**
     * Class contructor - initialize html parser
     */
    public function __construct(){
        require_once('htmlparser.php');
        $this->oHtmlParser = new CHtmlParser;
    }
    /**
     * Parse the imported html and put it to array
     *
     * @return bool|mixed
     */
    public function doImport(){
        // parse the data and put it to array
        foreach($this->oHtmlParser->parseAsRow($this->rawData) as $aImportedRow){
            $i = 0;
            $aData = array();
            foreach($this->aFields as $fieldName => $fieldData){
                $fieldName = trim($fieldName);
                // field is method?
                if(substr($fieldName, -2, 2) == '()'){
                    $methodName = 'field' . ucfirst(substr($fieldName, 0, strlen($fieldName) - 2));
                    if(method_exists($this, $methodName)){
                        // call driver method to parse the field
                        call_user_func_array(array($this, $methodName), array($aImportedRow));
                    }else{
                        $fieldValue = '';
                    }
                }else{
                    $fieldValue = $aImportedRow[$i];
                }
                $aData[$fieldName] = $fieldValue;
                $i++;
            }
        }
        // add event after import the data
        $aEvent = array('aImportedData' => $aData);
        AMI_Event::fire('ami_data_import_after_import', $aEvent, $this->modId);
        $aImportedData = $aEvent['aImportedData'];
        $this->bIsImported = true;
        $this->rawData = null;
        $this->aImportedData = $aImportedData;
        return true;
    }
     
    /**
     * Is import resource available?
     *
     * @return bool
     */
    public function isImportResourceAvailable(){
        return !empty($this->rawData);
    }
Установка и настройка Руководство пользователя Интеграция дизайна Разработчикам (API) Документация для скачивания
 2000 – 2011 © Amiro.CMS Все права защищены.