Май 23, 2024
Теги: Инфоблоки, ORM, Перенос данных
Работа с настройками свойств элементов инфоблока для разделов, используются, например, для добавления свойств элементов в умный фильтр для конкретных разделов. Класс "\Bitrix\Iblock\SectionPropertyTable".
Вывод всех настроек свойств элементов инфоблока с ID=16 для разделов, для которых установлена галочка "Выводить в умном фильтре", например, для сохранения в php файл для последующего переноса на другой сайт:
\Bitrix\Main\Loader::includeModule('iblock');
$rsSectionProperty = \Bitrix\Iblock\SectionPropertyTable::getList(array(
'filter' => array(
'IBLOCK_ID' => 16,
'SMART_FILTER' => 'Y',
'>SECTION_ID' => 0,
),
'select' => array(
'*',
'PROPERTY_XML_ID'=>'PROPERTY.XML_ID',
'SECTION_XML_ID'=>'SECTION.XML_ID',
'PROPERTY_NAME'=>'PROPERTY.NAME',
'SECTION_NAME'=>'SECTION.NAME',
),
));
while($sectionProperty=$rsSectionProperty->fetch())
{
var_export($sectionProperty);
echo ",\n";
}
Пример восстановления настроек из данных на основе предыдущего скрипта:
\Bitrix\Main\Loader::includeModule('iblock');
require($_SERVER['DOCUMENT_ROOT'].'/temp/section_to_property.php');
$iblockId = 10;
$notFoundProperty = 0;
$notFoundSection = 0;
foreach($sectionToProperty as $item)
{
print_r($item);
$property = \Bitrix\Iblock\PropertyTable::getList(array(
'filter' => array(
'IBLOCK_ID' => $iblockId,
'XML_ID' => $item['PROPERTY_XML_ID'],
),
'select' => array(
'ID',
'NAME',
),
'limit' => 1,
))->fetch();
if(!$property)
$notFoundProperty++;
$section = \Bitrix\Iblock\SectionTable::getList(array(
'filter' => array(
'IBLOCK_ID' => $iblockId,
'XML_ID' => $item['SECTION_XML_ID'],
),
'select' => array(
'ID',
'NAME',
),
'limit' => 1,
))->fetch();
if(!$section)
$notFoundSection++;
if(!$property || !$section)
continue;
print_r($property);
print_r($section);
$rsSectionProperty = \Bitrix\Iblock\SectionPropertyTable::getList(array(
'filter' => array(
'IBLOCK_ID' => $iblockId,
'SECTION_ID' => $section['ID'],
'PROPERTY_ID' => $property['ID'],
),
'select' => array(
'*',
'PROPERTY_XML_ID'=>'PROPERTY.XML_ID',
'SECTION_XML_ID'=>'SECTION.XML_ID',
'PROPERTY_NAME'=>'PROPERTY.NAME',
'SECTION_NAME'=>'SECTION.NAME',
),
));
if($sectionProperty=$rsSectionProperty->fetch())
{
echo "Да, найдено, обновляем\n";
print_r($sectionProperty);
\Bitrix\Iblock\SectionPropertyTable::update(array(
'IBLOCK_ID' => $sectionProperty['IBLOCK_ID'],
'SECTION_ID' => $sectionProperty['SECTION_ID'],
'PROPERTY_ID' => $sectionProperty['PROPERTY_ID'],
),array(
'SMART_FILTER' => 'Y',
'DISPLAY_EXPANDED' => $item['DISPLAY_EXPANDED'],
'DISPLAY_TYPE' => $item['DISPLAY_TYPE'],
'FILTER_HINT' => $item['FILTER_HINT'],
));
}
else
{
echo "Нет, не найдено, добавляем\n";
\Bitrix\Iblock\SectionPropertyTable::add(array(
'IBLOCK_ID' => $iblockId,
'SECTION_ID' => $section['ID'],
'PROPERTY_ID' => $property['ID'],
'SMART_FILTER' => 'Y',
'DISPLAY_EXPANDED' => $item['DISPLAY_EXPANDED'],
'DISPLAY_TYPE' => $item['DISPLAY_TYPE'],
'FILTER_HINT' => $item['FILTER_HINT'],
));
}
}
echo "Не найдено свойство: ".$notFoundProperty."\n";
echo "Не найден раздел: ".$notFoundSection."\n";