Обновление привязки элементов к разделам в 1С-Битрикс

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

Обновление привязки элементов к разделам в 1С-Битрикс

Шаг 1: Получение списка элементов по фильтру

Для того чтобы извлечь элементы, соответствующие определенному критерию (например, элементы, созданные более 3 месяцев назад и привязанные к разделу "Новинки"), мы используем метод CIBlockElement::GetList. Фильтрация будет происходить по дате создания элементов и идентификатору раздела.

Пример кода для фильтрации элементов:


$section_new = 123; // Идентификатор раздела "Новинки"
$objDateTime = new \Bitrix\Main\Type\DateTime();
$objDateTime->add('-3 month'); // Устанавливаем фильтр по дате, элементы старше 3 месяцев
$arSelect = array("ID", "IBLOCK_ID", "PROPERTY_CATEG"); // Список полей, которые нам нужно получить
$arFilter = array(
    "IBLOCK_ID" => CATALOG_IBLOCK_ID, // Идентификатор инфоблока
    "ACTIVE" => "Y", // Только активные элементы
    ">DATE_CREATE" => $objDateTime->format("Y-m-d"), // Дата создания больше 3 месяцев назад
    "SECTION_ID" => array($section_new) // Элементы, привязанные к разделу "Новинки"
);
$res = CIBlockElement::GetList(array(), $arFilter, false, false, $arSelect); // Выполняем запрос

$elIds = [];
while($ob = $res->GetNextElement()){
    $arFields = $ob->GetFields();
    $elIds[] = $arFields['ID']; // Собираем ID элементов в массив
}
    

В данном примере мы отфильтровываем элементы по их дате создания и привязке к разделу "Новинки". Для фильтрации по разделу используем параметр SECTION_ID, который принимает массив значений, если нам нужно выбрать элементы, привязанные хотя бы к одному из указанных разделов.

Шаг 2: Получение привязанных разделов для каждого элемента

После того как мы получили ID нужных элементов, следующим шагом будет получение списка разделов, к которым привязан каждый элемент. Для этого используется метод CIBlockElement::GetElementGroups.

Пример кода:


// Получаем список привязанных разделов для каждого элемента
if (!empty($elIds)) {
    $result = CIBlockElement::GetElementGroups($elIds, true, array('ID', 'IBLOCK_ELEMENT_ID')); // Получаем группы разделов
    $arElUpdSect = [];
    while ($ar = $result->Fetch()) {
        $arElUpdSect[$ar['IBLOCK_ELEMENT_ID']][] = $ar['ID']; // Формируем массив с ID разделов
    }

    $bs = new CIBlockElement;
    foreach ($elIds as $elId) {
        // Удаляем раздел "Новинки", если он присутствует
        if (count($arElUpdSect[$elId]) > 1 && ($key = array_search($section_new, $arElUpdSect[$elId]))) {
            unset($arElUpdSect[$elId][$key]); // Удаляем из массива ID раздела "Новинки"

            // Обновляем список разделов для элемента
            $arUpdFields['IBLOCK_SECTION'] = $arElUpdSect[$elId]; // Новый массив с привязками
            $bs->Update($elId, $arUpdFields, 'N', true, true); // Обновляем элемент
        }
    }
}
    

В этом фрагменте кода для каждого элемента мы получаем все разделы, к которым он привязан, и из этого списка удаляем раздел "Новинки", если элемент был к нему привязан. Затем с помощью метода Update обновляем привязку элемента к оставшимся разделам.

Шаг 3: Метод CIBlockElement::GetElementGroups

Метод GetElementGroups используется для получения всех разделов, в которых находится элемент. Этот метод возвращает результат, который содержит информацию о разделах, а также дополнительную информацию о самих элементах.

Пример кода функции GetElementGroups:


public static function GetElementGroups($ID, $bElementOnly = false, $arSelect = array())
{
    global $DB;

    $arFields = array(
        "ID" => "BS.ID",
        "NAME" => "BS.NAME",
        "IBLOCK_SECTION_ID" => "BS.IBLOCK_SECTION_ID",
        "IBLOCK_ID" => "BS.IBLOCK_ID",
        "ACTIVE" => "BS.ACTIVE",
        "SORT" => "BS.SORT"
    );

    if (is_array($ID)) {
        Main\Type\Collection::normalizeArrayValuesByInt($ID);
        $sqlID = !empty($ID) ? $ID : array(0);
    } else {
        $sqlID = array((int)$ID);
    }

    $arSqlSelect = array();
    foreach ($arSelect as &$field) {
        $field = mb_strtoupper($field);
        if (array_key_exists($field, $arFields)) {
            $arSqlSelect[$field] = $arFields[$field] . " AS " . $field;
        }
    }

    $strSelect = implode(", ", $arSqlSelect) ?: "BS.*";
    $dbr = new CIBlockResult($DB->Query("
        SELECT $strSelect
        FROM b_iblock_section_element SE
        INNER JOIN b_iblock_section BS ON SE.IBLOCK_SECTION_ID = BS.ID
        WHERE SE.IBLOCK_ELEMENT_ID in (" . implode(", ", $sqlID) . ")
    "));
    return $dbr;
}
    

Этот метод извлекает информацию о разделах для элементов, переданных в качестве параметра. В нем формируется SQL-запрос, который возвращает все привязки элементов к разделам, а затем результат обрабатывается и возвращается как объект CIBlockResult.

Заключение

Работа с привязками элементов к разделам в 1С-Битрикс является важной частью разработки на этой платформе. С помощью описанных методов можно легко получать, изменять и обновлять привязки элементов к разделам, что полезно, например, для управления контентом, очистки старых элементов или организации динамических изменений на сайте.

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

Теги:  CMS, управление элементами, привязка разделов, обновление привязок, оптимизация контента

Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Участие в проекте

привлечение в проект на part-time основе

от 20 000 рублей / неделя

Возможно участие в проекте на ежедневной основе, как разработчика. Занятость - до 20 часов в неделю
Минимальный срок - одна неделя.

* сумма фиксированная

Модули и компоненты для «1С-Битрикс»

оценка производится на основе предоставленного Технического Задания

от 20 000 рублей
Разработка дополнительных модулей для 1С-Битрикс, расширение функционала, внедрение любых решений, требующихся для выполнения ваших бизнес-задач.

* стоимость зависит от конкретной задачи, ее объема и сложности выполняемых работ.

Техническая поддержка

выполняется с сайтами на основе любых CMS

от 5 000 рублей
Оптимизация производительности действующих интернет-проектов, наполнение и сопровождение, полная техническая поддержка и продвижение в поисковых сетях.

* стоимость зависит от объема и сложности выполняемых работ, используемой CMS.