+7 495 008 8452 пн.-пт. 10:00 – 17:00
Загрузка...

Не нашли ответы на свои вопросы в наших публикациях? Задайте вопрос в службу техподдержки!


Разработчикам: рассмотрим практический пример обнуления остатков у всех товаров на складе при временной недоступности внешнего источника импорта (когда файл импорта задан через URL).
После доступности внешнего источника остатки будут перегружены.
При этом важно поставить выполнение профиля, например, на раз в 15 минут.

Показан пример использования события  OnPrepareSourceError (с версии модуля 1.54.1)

Предположим, что идентификатор настроенного профиля в модуле импорта - 8, а источник импорта задан через внешний файл (URL)

Нужно установить в cron проверку автозапуска импорта профиля каждые 15 минут. При этом если внешний файл не был изменен -  импорт не происходит:

*/15 * * * *  php -f /home/bitrix/www/bitrix/modules/acrit.import/scripts/cron.php 8

Далее необходимо повесить событие, выполняющее необходимое действие:

// init.php
use Bitrix\Catalog\ProductTable;
use Bitrix\Main\Loader;
use Bitrix\Main\EventManager;
use Bitrix\Main\Application;

$eventManager = EventManager::getInstance();
$request      = Application::getInstance()->getContext()->getRequest();

const ACRIT_IMPORT_PROFILE_ID = 8;

$dropAllGoodQuantities = static function ($iblockId) {
    Loader::includeModule('iblock');
    Loader::includeModule('catalog');

    $arProductFields = [
        'QUANTITY' => 0
    ];
    $arProductFields['AVAILABLE'] = ProductTable::calculateAvailable($arProductFields);

    $rs = CIBlockElement::GetList(['ID' => 'ASC'], [
        'IBLOCK_ID' => (int)$iblockId,
        '>QUANTITY' => 0
    ], false, false, ['ID']);

    $cnt = 0;
    while ($arProduct = $rs->Fetch()) {
        $rsUpd = ProductTable::update($arProduct['ID'], $arProductFields);
        if (! $rsUpd->isSuccess()) {
            echo implode(PHP_EOL, $rsUpd->getErrors());
        }
        $cnt++;
    }
    // \Bitrix\Main\Diag\Debug::dump($cnt);
};

$eventManager->addEventHandler('acrit.import', 'OnPrepareSourceError',
    static function (\Acrit\Import\Import $profile, \Throwable $error) use ($dropAllGoodQuantities) {
        $profileId = $profile->getArProfile()['ID'];
        // set quantity for all products to 0 because 
        // [Failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error]!
        if ($profileId == ACRIT_IMPORT_PROFILE_ID) {
            $iblockId = $profile->getArProfile()['IBLOCK_ID'];
            $dropAllGoodQuantities($iblockId);
            // clear cached file to download it next time (when server status 200) and re-import
            $profile->clearCachedSource();
        }
    }
);


Назад в раздел



Часто задаваемые вопросы по модулям экспорта

Видео плейлист по настройке модулей экспорта