Не нашли ответы на свои вопросы в наших публикациях? Задайте вопрос в службу техподдержки!
Модуль "Универсальный импорт" позволяет разрабатывать собственные интеграции и подключать их к базовому функционалу модуля. Вам будут доступны все возможности модуля: интерфейс сопоставления импортируемых данных с данными инфоболока, механизм импорта ваших данных в инфоблок и др. Таким образом, у вас не будет необходимости создавать собственное программное окружение и вы сможете сосредоточиться исключительно на обработке того источника данных, который вы желаете подключить к сайту.
В данной статье размещён пример пользовательского класса, реализующего импорт данных из сервиса ads-api.ru. В нём отражены основные программные элементы, необходимые для подключения класса к функционалу модуля импорта.
Правильно созданный класс будет отображаться в меню выбора форматов при создании нового профиля. Также там будут доступны необходимые опции для подключения вашего источника. А на втором шаге появятся заданные вами дополнительные поля.
<?php
/**
* Пример дополнительной интеграции для модуля "Универсальный импорт" (acrit.import)
* Помещается в директорию /local (или в любую поддиректорию данной директории)
* Подключается в файле /bitrix/init.php или /local/init.php
* Пример подключения:
* include_once($_SERVER['DOCUMENT_ROOT'].'/local/lib/import_example.php') ;
* ---
* Интеграция с сервисом ads-api.ru
*/
namespace Acrit\Import;
\Bitrix\Main\Loader::includeModule('acrit.import');
class ImportRestAdsapiru extends Import
{
private $source_login;
private $source_token;
/**
* Заполнение полей класса авторизационными данными из профиля
* (вспомогательная функция данного класса)
*/
public function fillAuthData() {
if (!$this->arProfile['SOURCE_LOGIN'] || !$this->arProfile['SOURCE_KEY']) {
throw new \Exception('Не указаны данные источника');
}
$this->source_login = $this->arProfile['SOURCE_LOGIN'];
$this->source_token = $this->arProfile['SOURCE_KEY'];
}
/**
* Получение субпараметров ads-api.ru
* (обязательная функция модуля)
*/
public function fieldsPreParams() {
$arFieldsParams = array(
'title' => 'Параметры выборки'
);
$arFieldsParams['fields']['section'] = array(
'DB_FIELD' => 'PARAM_1',
'TYPE' => 'number',
'DEFAULT' => '0',
'LABEL' => 'Категория из ads-api.ru',
'PLACEHOLDER' => '',
'HINT' => '',
);
$arFieldsParams['fields']['limit'] = array(
'DB_FIELD' => 'PARAM_2',
'TYPE' => 'number',
'DEFAULT' => '0',
'LABEL' => 'Количество загружаемых позиций',
'PLACEHOLDER' => '',
'HINT' => '',
);
return $arFieldsParams;
}
/**
*
* (вспомогательная функция данного класса)
*/
protected function fieldsGetParams($obParams, $arFieldsPath, &$arSourceFields) {
$l = count($arFieldsPath);
foreach ($obParams as $obParam) {
$arFieldsPath[$l] = array(
'key' => $obParam->param,
'title' => $obParam->title
);
// Добавляем значение в массив полей профиля
$arTitles = array();
foreach ($arFieldsPath as $arLevel) {
$arTitles[] = $arLevel['title'];
}
$k = $arFieldsPath[$l]['key'];
$arSourceFields[$k] = array(
'ID' => $k,
'NAME' => implode('. ', $arTitles),
'EXAMPLE' => '',
);
// Обходим все субпараметры
foreach ($obParam->values as $obValue) {
if ($obValue->subparams) {
$this->fieldsGetParams($obValue->subparams, $arFieldsPath, $arSourceFields);
}
}
}
return $arFieldsPath;
}
/**
* Получение списка полей для второго шага в профиле импорта
* (обязательная функция модуля)
*/
public function fields() {
$arSourceFields = array();
$this->fillAuthData();
$category_id = (int)$this->arProfile['SOURCE_PARAM_1'];
if ($category_id) {
// Список основных параметров
$arAdsFields = array(
"id" => "Идентификатор записи",
"url" => "Url объявления на сайте-источнике",
"title" => "Заголовок",
"price" => "Цена",
"time" => "Дата и время добавления объявления/обновления в систему. Время московское",
"phone" => "Телефон",
"phone_operator" => "Название мобильного оператора",
"person" => "Персона для контактов, автор объявления",
"contactname" => "Контактное лицо",
"person_type" => "Тип персоны для контактов",
"person_type_id" => "ID типа персоны для контактов",
"city" => "Регион и Город вместе",
"metro" => "Метро или район",
"address" => "Адрес",
"description" => "Описание объявления",
"nedvigimost_type" => "Тип недвижимости: Продам, Сдам, Куплю или Сниму",
"nedvigimost_type_id" => "ID типа недвижимости: 1 - Продам, 2 - Сдам, 3 - Куплю или 4 - Сниму",
"avitoid" => "ID объявления на сайте-источнике",
"source" => "Сайт-источник",
"source_id" => "ID cайта-источника в нашей системе",
"images" => "Картинки",
"params" => "Дополнительные параметры объявления",
"cat1_id" => "ID категории первого уровня",
"cat2_id" => "ID категории второго уровня",
"cat1" => "Название категории первого уровня",
"cat2" => "Название категории второго уровня",
"coords" => "Объект, содержащий координаты объявления, поля lat и lng",
"region" => "Только название региона",
"city1" => "Только название города",
"param_xxx" => "Дополнительный параметр с кодом xxx",
"count_ads_same_phone" => "Количество объявлений с тем же номером",
"phone_protected" => "Защищен ли телефон",
);
foreach ($arAdsFields as $k => $name) {
$arSourceFields[$k] = array(
'ID' => $k,
'NAME' => $name,
'EXAMPLE' => '',
);
}
// Получаем дополнительные параметры
$str = file_get_contents($this->arProfile['SOURCE'] . "/main/apigetparams?user=" . urlencode($this->source_login) .
"&token=" . urlencode($this->source_token) .
"&category_id=" . $category_id);
$obResp = json_decode($str);
$arFieldsPath = array();
$this->fieldsGetParams($obResp->data, $arFieldsPath, $arSourceFields);
}
return $arSourceFields;
}
/**
* Подсчёт общего количества импортируемых элементов
* (обязательная функция модуля)
*/
public function count() {
$count = 0;
$load_limit = (int)$this->arProfile['SOURCE_PARAM_2'];
if ($load_limit) {
$count = $load_limit;
}
else {
$this->fillAuthData();
$category_id = (int)$this->arProfile['SOURCE_PARAM_1'];
if ($category_id) {
$query = $this->arProfile['SOURCE'] . "/main/api?user=" . urlencode($this->source_login) .
"&token=" . urlencode($this->source_token) .
"&category_id=" . $category_id;
$str = file_get_contents($query);
$obResp = json_decode($str);
if ($obResp) {
$count = count($obResp->data);
}
sleep(5);
}
}
return $count;
}
/**
* Импорт очередной порции товаров (один шаг импорта)
* (обязательная функция модуля)
* $limit - количество импортируемых за данный шаг элементов
* $next_item - элемент, с которого должен начаться импорт
*/
public function import($type=self::STEP_NO, $limit=0, $next_item=0) {
$load_limit = (int)$this->arProfile['SOURCE_PARAM_2'];
if ($load_limit > 50) {
$limit = 50;
}
else {
$limit = $load_limit;
}
\CModule::IncludeModule('iblock');
$this->fillAuthData();
$category_id = (int)$this->arProfile['SOURCE_PARAM_1'];
if ($category_id) {
$query = $this->arProfile['SOURCE'] . "/main/api?user=" . urlencode($this->source_login) .
"&token=" . urlencode($this->source_token) .
"&category_id=" . $category_id;
if ($next_item) {
$query .= "&startid=" . $next_item;
}
if ($type == self::STEP_BY_COUNT && $limit) {
$query .= "&limit=" . ($limit + 1); // Последний элемент получаем только для стартового ID следующей итерации
}
$str = file_get_contents($query);
$obResp = json_decode($str);
$i = 0;
if ($obResp->error) {
throw new \Exception($obResp->error.' [Code '.$obResp->code.']');
}
if (!empty($obResp->data)) {
foreach ($obResp->data as $obItem) {
$arRow = (array)$obItem;
$arRow['coords'] = (array)$arRow['coords'];
foreach ($arRow['images'] as $k => $obImage) {
$arRow['images'][$k] = $obImage->imgurl;
}
$arRow['params'] = (array)$arRow['params'];
$next_item = $arRow['id'];
if ($type == self::STEP_BY_COUNT && $limit && $i >= $limit) {
break;
}
// Отправляем данные позиции в инфоблок
$this->saveIBData($arRow, $next_item);
$i++;
}
}
sleep(5);
}
return $next_item;
}
/**
* Добавление интеграции в меню модуля (на первом шаге настройки профиля)
* (обязательная функция модуля)
*/
static public function OnGetImportTypesHandler($arTypes) {
$arTypes['rest'] = array(
'name' => 'REST API ads-api.ru',
'source_types' => array('oauth'),
'file_ext' => 'rest_api',
'class' => 'ImportRestAdsapiru',
);
return $arTypes;
}
}
Назад в раздел
