Заполнить инфоблок брендов из свойства инфоблока с товарами

Просмотров: 138

Задача: в интернет-магазине есть инфоблок с товарами, загружаемый из 1С, у которого заполнено свойство "Производитель" и оно является списком. Нужно заполнить отдельный инфоблок этими производителями, чтобы не наполнять его вручную.

Это может пригодиться для реализации другой заметки: Вывести товары бренда в его описании
Заполнить инфоблок брендов из свойства инфоблока с товарами

Получаем значения множественного свойства "Список"

Для этого нам достаточно воспользоваться методом CIBlockPropertyEnum::GetList, который по коду свойства получит все его значения (впрочем, и остальную информацию получит, но нас интересует только VALUE)

use Bitrix\Main\Loader;

Loader::includeModule('iblock');

$arTrans = array("replace_space" => "-", "replace_other" => "-");
$el = new CIBlockElement;

$property_enums = CIBlockPropertyEnum::GetList(
    array(
        "VALUE" => "ASC",
    ),
    array(
        "IBLOCK_ID" => 10, // ID инфоблока каталога
        "CODE" => "CML2_MANUFACTURER"
    )
);

while ($enum_fields = $property_enums->GetNext()) {
    $arFields = array(
        "IBLOCK_ID" => 7, // ID инфоблока производителей
        "NAME" => strip_tags($enum_fields['VALUE']),
        'ACTIVE' => 'Y',
        'CODE' => Cutil::translit($enum_fields['VALUE'], "ru", $arTrans),
    );
    $NewElementId = $el->Add($arFields);
}

Объяснение кода:

  • Подключаем модуль информационных блоков (iblock), чтобы иметь возможность работать с ними.
  • Задаем параметры для транслитерации, чтобы использовать их для создания символьных кодов.
  • Создаем экземпляр класса CIBlockElement, который будет использоваться для добавления новых элементов в инфоблок.
  • Получаем все значения свойства "Производитель" из инфоблока с товарами, отсортированные по значению.
  • Проходим по всем значениям, полученным на предыдущем шаге, и добавляем их в инфоблок производителей.

Что происходит в коде:

Модуль iblock загружается для работы с информационными блоками.

Настраиваются параметры транслитерации для создания символьных кодов.

Создается экземпляр класса CIBlockElement для добавления элементов в инфоблок.

Метод CIBlockPropertyEnum::GetList используется для получения всех значений свойства "Производитель" из инфоблока с товарами.

В цикле while происходит проход по всем значениям свойства "Производитель":

  • Создаются массивы данных для новых элементов в инфоблоке производителей.
  • Используется метод Add для добавления этих элементов в инфоблок.
Михаил Базаров 10.07.2024
Вариант на D7
Код
use Bitrix\Main\Loader;
use Bitrix\Iblock\IblockTable;
use Bitrix\Iblock\PropertyEnumerationTable;
use Bitrix\Iblock\Elements\ElementTable;
use Bitrix\Main\Type\Dictionary;
use Bitrix\Main\Text\Converter;
use Bitrix\Main\Text\Translit;

Loader::includeModule('iblock');

$arTrans = array("replace_space" => "-", "replace_other" => "-");

// Получаем инфоблок производителей по ID
$iblockIdCatalog = 10;
$iblockIdManufacturers = 7;

// Получаем значения свойства "CML2_MANUFACTURER" инфоблока каталога
$propertyEnums = PropertyEnumerationTable::getList([
    'select' => ['ID', 'VALUE'],
    'filter' => [
        'IBLOCK_ID' => $iblockIdCatalog,
        'PROPERTY.CODE' => 'CML2_MANUFACTURER'
    ],
    'order' => ['VALUE' => 'ASC']
]);

while ($enumFields = $propertyEnums->fetch()) {
    $translitCode = Translit::convert($enumFields['VALUE'], 'ru', $arTrans);

    // Создаем новый элемент в инфоблоке производителей
    $result = ElementTable::add([
        'IBLOCK_ID' => $iblockIdManufacturers,
        'NAME' => strip_tags($enumFields['VALUE']),
        'ACTIVE' => 'Y',
        'CODE' => $translitCode,
    ]);

    if (!$result->isSuccess()) {
        $errors = $result->getErrorMessages();
        // Обработка ошибок
    }
}