Bitrix

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

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

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);
		}
	}
}

Комментариев: 4

  1. При сохранении новости, она не копируется в другой инфоблок, все прописал в файл init.php, присвоил свойство PARENTID, идентификаторы инфоблоков прописаны, но увы результата нет, могли бы Вы мне подсказать?

    1. Сложно вот так что-то подсказывать. Метод этот рабочий — на данный момент у меня работает на паре сайтов. Могу помочь непосредственно в коде сайта только если.

Оставить комментарий на Александр Отменить

Ваш электронный адрес не будет опубликован.Обязательные для заполнения поля отмечены *

19 + 12 =