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

Создай визитку сам!


Самоучитель по интеграции дизайна и настройке Amiro.CMS на примере демонстрационной версии пакета Визитка »


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

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

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 – 2021 © Amiro.CMS Все права защищены.