Битрикс загрузить картинки по артикулу из файлов фотографий
Иногда нужно массово загрузить фотографии товаров в каталог 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 инфоблока,
путь к папке с файлами
и запустить скрипт.
Комментарии