Найти тему

Автоматическое копирование новости из одного инфоблока в другой

Часто возникают задачи, когда необходимо обеспечить автоматическое копирование новости при создании и обновлении. Здесь я приведу один из вариантов решения такой задачи.

1. Инфоблоки
В инфоблоке, куда будет вестись копирование нужно сделать свойство с кодом PARENTID. В этом свойстве будет хранится идентификатор родительского элемента из другого инфоблока.
В родительском инфоблоке я добавил галку «Копировать» (символьный код COPY), чтобы только при установленной галке копировалась та или иная запись. Если нужно, чтобы копировались все создаваемые записи, то такая галка не нужна.

2. Код в файле /bitrix/php_interface/init.php

AddEventHandler("iblock", "OnAfterIBlockElementAdd", "OnAfterIBlockElementAddHandler");
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", "OnAfterIBlockElementAddHandler");
function OnAfterIBlockElementAddHandler($arFields)
{
$arIblockNewsIDfrom = Array(000, 001); // Инфоблоки, из которых будет вестись копирование
$arIblockNewsIDto = Array(004, 005); // Инфоблоки, в которые будет вестись копирование
$el = new CIBlockElement;
$PROP = array();

foreach($arFields["PROPERTY_VALUES"] as $prop_id => $val)
{
$res = CIBlockProperty::GetByID($prop_id);
$ar_res = $res->GetNext();

if (is_array($val))
{
$val = array_shift($val);
$PROP[$ar_res["CODE"]] = $val["VALUE"];
}
}
$PROP["PARENTID"] = $arFields["ID"];

if ($arFields["RESULT"] && in_array($arFields["IBLOCK_ID"], $arIblockNewsIDfrom) && $PROP["COPY"])
{
foreach($arIblockNewsIDto as $iblock_item)
{
$res = CIBlockElement::GetByID($arFields["ID"]);
$arElem = $res->GetNext();

$arSelect = Array("ID", "NAME", "DATE_ACTIVE_FROM");
$arFilter = Array("IBLOCK_ID"=>$iblock_item, "PROPERTY_PARENTID"=>$arFields["ID"]);
$ex_record_res = CIBlockElement::GetList(Array(), $arFilter, false, Array("nPageSize"=>1), $arSelect);
$ex_record_ar = $ex_record_res->GetNext();


$arElem["PREVIEW_PICTURE"] = CFile::GetFileArray($arElem["PREVIEW_PICTURE"]);
$arElem["DETAIL_PICTURE"] = CFile::GetFileArray($arElem["DETAIL_PICTURE"]);

copy($arFields["PREVIEW_PICTURE"]["tmp_name"], $_SERVER["DOCUMENT_ROOT"]."/upload/".$arFields["PREVIEW_PICTURE"]["name"]);

$arLoadProductArray = Array(
"DATE_ACTIVE_FROM" => $arFields["ACTIVE_FROM"],
"IBLOCK_SECTION_ID" => false,
"IBLOCK_ID" => $iblock_item,
"PROPERTY_VALUES"=> $PROP,
"NAME" => $arFields["NAME"],
"ACTIVE" => "Y",
"PREVIEW_TEXT_TYPE" => $arFields["PREVIEW_TEXT_TYPE"],
"PREVIEW_TEXT" => $arFields["PREVIEW_TEXT"],
"DETAIL_TEXT_TYPE" => $arFields["DETAIL_TEXT_TYPE"],
"DETAIL_TEXT" => $arFields["DETAIL_TEXT"],
"PREVIEW_PICTURE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"].$arElem["PREVIEW_PICTURE"]["SRC"]),
"DETAIL_PICTURE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"].$arElem["DETAIL_PICTURE"]["SRC"])
);
if (!$ex_record_ar["ID"])
$el->Add($arLoadProductArray);
else
$el->Update($ex_record_ar["ID"], $arLoadProductArray);
}
}
}