Николаев Виталий
Блог веб-разработчика: Битрикс, PHP, Python, Linux и SEO
Битрикс Битрикс
27.11.2021

Битрикс загрузить картинки по артикулу из файлов фотографий

Иногда нужно массово загрузить фотографии товаров в каталог 1С-Битрикс. Например, когда есть папка с изображениями, а названия файлов совпадают с артикулами товаров.

В этой статье разберем PHP-скрипт, который загружает изображения товаров из файлов и привязывает их к элементам инфоблока по артикулу.

Файлы изображений должны иметь вид:

артикул.jpg

Например:

12345.jpg
A-100.jpg
BX-777.jpg

Скрипт загрузки фотографий товаров

<?php
$_SERVER["DOCUMENT_ROOT"] = '/var/www/html/bx-site/';

require($_SERVER["DOCUMENT_ROOT"] . "bitrix/modules/main/include/prolog_before.php");

CModule::IncludeModule("iblock");

// Директория с картинками для загрузки
const DIR_IMG = '/var/www/html/bx-site/script/img-import/';

// Получаем массив файлов
$img_arr_dir = scandir(DIR_IMG);

$arCode = array();

$i = 0;

foreach ($img_arr_dir as $item) {

    if ($item == '.' or $item == '..') {
        continue;
    }

    $path = DIR_IMG . $item;

    $vendor_code = explode('.', $item);

    $arCode[$i]['code'] = $vendor_code[0];

    $arCode[$i]['path'] = $path;

    $i++;
}

// Получаем товары каталога одним запросом,
// чтобы не дергать товары по одному
$resItemsList = CIBlockElement::GetList(
    array("ID", "NAME", "CML2_ARTICLE"),
    array(
        "IBLOCK_ID" => 11,
        "CML2_ARTICLE" => array_keys($arCode)
    ),
    false,
    false,
    array(
        "ID",
        "NAME",
        "PROPERTY_CML2_ARTICLE"
    )
);

// Преобразуем полученные товары в массив
$elements = array();

while ($element = $resItemsList->fetch()) {
    $elements[] = $element;
}

// Цикл, который определяет ID товара
// и сохраняет картинку в инфоблок
$el = new CIBlockElement;

foreach ($arCode as $item) {

    // Находим ID товара по артикулу
    if (
        $key = array_search(
            $item["code"],
            array_column($elements, 'PROPERTY_CML2_ARTICLE_VALUE')
        )
    ) {

        echo 'Найден товар с артикулом '
            . $item["code"]
            . ' ID: '
            . $elements[$key]["ID"]
            . '<br>';

        // Сохраняем картинку в инфоблок
        $arLoadProductArray = array(
            "DETAIL_PICTURE" => CFile::MakeFileArray($item["path"]),
        );

        if ($el->Update($elements[$key]["ID"], $arLoadProductArray)) {
            echo 'Изображение загружено<br>';
        } else {
            echo 'Изображение не загружено<br>';
        }

    } else {

        echo 'Товар с артикулом '
            . $item["code"]
            . ' не найден<br>';
    }
}

require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/epilog_after.php");

Как работает скрипт

Скрипт выполняет несколько действий:

  • подключает ядро Битрикс;
  • сканирует папку с изображениями;
  • получает артикул из имени файла;
  • ищет товар в инфоблоке по свойству CML2_ARTICLE;
  • загружает изображение в поле DETAIL_PICTURE.

Где указать путь к сайту

В начале скрипта указывается путь к корню сайта:

$_SERVER["DOCUMENT_ROOT"] = '/var/www/html/bx-site/';

Замените этот путь на путь к вашему сайту.

Папка с изображениями

Директория с картинками задается в константе:

const DIR_IMG = '/var/www/html/bx-site/script/img-import/';

Именно в эту папку нужно положить изображения товаров.

Формат имени файла

Скрипт ожидает, что имя файла будет совпадать с артикулом товара:

артикул.jpg

Например, если у товара артикул:

ABC-123

файл должен называться:

ABC-123.jpg

По какому свойству ищется товар

Поиск товара выполняется по свойству:

CML2_ARTICLE

В Битрикс это стандартное свойство артикула, которое часто используется в каталогах после обмена с 1С.

ID инфоблока

В примере используется инфоблок:

"IBLOCK_ID" => 11

Если у вас другой каталог, замените ID инфоблока на свой.

Куда загружается изображение

Картинка сохраняется в поле:

DETAIL_PICTURE

То есть становится детальной картинкой товара.

Если нужно загрузить изображение в картинку анонса, используйте:

PREVIEW_PICTURE

Важный момент в коде

В текущем варианте есть нюанс: массив $arCode формируется с числовыми ключами, поэтому array_keys($arCode) вернет не артикулы, а номера элементов массива.

Для фильтра по артикулам лучше отдельно собрать массив артикулов:

$articleList = array_column($arCode, 'code');

И использовать его в фильтре:

"PROPERTY_CML2_ARTICLE" => $articleList

Исправленный фрагмент получения товаров

$articleList = array_column($arCode, 'code');

$resItemsList = CIBlockElement::GetList(
    array("ID" => "ASC"),
    array(
        "IBLOCK_ID" => 11,
        "PROPERTY_CML2_ARTICLE" => $articleList
    ),
    false,
    false,
    array(
        "ID",
        "NAME",
        "PROPERTY_CML2_ARTICLE"
    )
);

Еще один нюанс с array_search

Если найденный товар находится в массиве под индексом 0, условие может не сработать, потому что 0 воспринимается как false.

Надежнее проверять так:

$key = array_search(
    $item["code"],
    array_column($elements, 'PROPERTY_CML2_ARTICLE_VALUE')
);

if ($key !== false) {
    // товар найден
}

Когда пригодится такой скрипт

  • массовая загрузка изображений товаров;
  • подготовка каталога к запуску;
  • перенос изображений из старого сайта;
  • обновление карточек товаров;
  • загрузка фото после импорта из 1С;
  • автоматизация работы с каталогом Битрикс.

Итог

Такой скрипт позволяет быстро загрузить фотографии товаров в 1С-Битрикс по артикулу.

Достаточно подготовить изображения в формате артикул.jpg, указать ID инфоблока, путь к папке с файлами и запустить скрипт.

12 просмотров

Комментарии

Где заказы?
Почему у одних компаний очередь из клиентов, а у других пустой сайт и тишина?
Телеграм канал «Где заказы?» — про продажи, сайты и ошибки бизнеса на реальных примерах. Подписаться