Часто возникают задачи, когда необходимо обеспечить автоматическое копирование новости при создании и обновлении. Здесь я приведу один из вариантов решения такой задачи.
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); } } }
При сохранении новости, она не копируется в другой инфоблок, все прописал в файл init.php, присвоил свойство PARENTID, идентификаторы инфоблоков прописаны, но увы результата нет, могли бы Вы мне подсказать?
Сложно вот так что-то подсказывать. Метод этот рабочий — на данный момент у меня работает на паре сайтов. Могу помочь непосредственно в коде сайта только если.
у родительского инфоблока — PARENTID должен быть строковым свойством?
да, он должен быть строковым. Заработало у Вас?