Появилась необходимость копировать элементы внутри ИБ в другой раздел. В Битриске можно копировать только по одному элементу, и это не удобно когда надо скопировать более ста элементов в другой раздел.
Для начала нам надо добавить в список действий новое новое действие – «копировать».
Открываем файл — /bitrix/modules/iblock/admin/iblock_element_admin.php, находим строку 1895. Там объявляет массив с событиями:
$arActions = array(
"delete" => GetMessage("MAIN_ADMIN_LIST_DELETE"),
"activate" => GetMessage("MAIN_ADMIN_LIST_ACTIVATE"),
"deactivate" => GetMessage("MAIN_ADMIN_LIST_DEACTIVATE"),
);
Добавляем наше событие и получаем следующее:
$arActions = array(
"delete" => GetMessage("MAIN_ADMIN_LIST_DELETE"),
"activate" => GetMessage("MAIN_ADMIN_LIST_ACTIVATE"),
"deactivate" => GetMessage("MAIN_ADMIN_LIST_DEACTIVATE"),
"copy_all" => 'копировать',
);
Теперь нам необходимо добавить обработчик для данного события. В этом же файле перемещаемся на строку 647, там мы увидим следующее:
switch($_REQUEST['action'])
Ниже добавляем наш обработчик:
case "copy_all":
$el = CIBlockElement::GetByID($ID);
$el = $el->GetNext();
$ibId = $el['IBLOCK_ID'];
$new_section = intval($_REQUEST["section_to_move"]);
$items = CIBlockElement::GetList(
array(),
array('IBLOCK_ID' => $ibId,
'ID' => $ID
),
false,
false,
array('DETAIL_TEXT', 'PREVIEW_TEXT', 'PROPERTY_PRICE', 'PROPERTY_PHONE', 'PROPERTY_ADDRESS', 'PROPERTY_AREA', 'PROPERTY_LEVEL', 'PROPERTY_HOME', 'PROPERTY_REGION', 'PROPERTY_VARIANT', 'PROPERTY_BOLD', '*')
);
$item = $items->GetNext();
$ob = new CIBlockElement();
$PROP = array(
'PRICE' => $item['PROPERTY_PRICE_VALUE'],
'PHONE' => $item['PROPERTY_PHONE_VALUE'],
'ADDRESS' => $item['PROPERTY_ADDRESS_VALUE'],
'AREA' => $item['PROPERTY_AREA_VALUE'],
'LEVEL' => $item['PROPERTY_LEVEL_VALUE'],
'HOME' => $item['PROPERTY_HOME_VALUE'],
'REGION' => $item['PROPERTY_REGION_VALUE'],
'VARIANT' => $item['PROPERTY_VARIANT_VALUE'],
'BOLD' => $item['PROPERTY_BOLD_VALUE'],
);
$arLoadProductArray = Array(
"MODIFIED_BY" => $USER->GetID(),
"IBLOCK_SECTION_ID" => $new_section,
"IBLOCK_ID" => $ibId,
"NAME" => $item['NAME'],
"ACTIVE" => "Y",
"PREVIEW_TEXT" => $item['PREVIEW_TEXT'],
"DETAIL_TEXT" => $item['DETAIL_TEXT'],
);
if(!$res = $ob->Add($arLoadProductArray)) {
$lAdmin->AddGroupError(GetMessage("IBEL_A_UPDERR") . $ob->LAST_ERROR, $ID);
}
foreach ($PROP as $key => $val) {
CIBlockElement::SetPropertyValueCode($res, $key, array('VALUE' => $val));
}
break;
В данном коде жесткая привязка к определенным свойствам ИБ, можно переписать код для динамического определения свойств информационного блока. И даже не которые моменты можно оптимизировать.