Сегодня вы узнаете как написать скрипт для битрикса, который помогает скопировать свойство элемента инфоблока.
Как скопировать свойство в Битриксе
Для чего это может пригодиться? Например, когда вам надо сделать копию свойства, но вы не хотите испортить актуальные данные и что-нибудь сломать.
Любой скрипт начинается с подключения пролога и модуля инфоблока:
<? require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php"); CModule::IncludeModule("iblock");
Не скажу, что следующие строки везде хорошо работают, но на всякий случай напишу их, они снимают ограничения по времени и памяти выполнения скрипта. Полезно, когда у вам много элементов инфоблока:
@set_time_limit(99600); ini_set("memory_limit", "4096M"); ini_set("max_execution_time", "0"); ini_set("max_input_time", "0");
После этого пишем код:
$res = CIBlockElement::GetList( array(), array('IBLOCK_ID' => 1), false, false, array('PROP_FROM_OLD') ); while($el = $res->GetNextElement()){ $fields = $el->GetFields(); //тут введите код свойство которое копируется $from = $el->GetProperty('PROP_FROM_OLD'); //обновляем свойство CIBlockElement::SetPropertyValuesEx( $fields['ID'], //ID обновляемого элемента 14, //ID инфоблока array('PROP_TO_NEW' => $from['VALUE']) //код обновляемого свойства ); }
Получаем значение, и записываем его в новое свойство, которое нужно создать в инфоблоке. Полный скрипт выглядит так:
<? require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php"); CModule::IncludeModule("iblock"); @set_time_limit(99600); ini_set("memory_limit", "4096M"); ini_set("max_execution_time", "0"); ini_set("max_input_time", "0"); $res = CIBlockElement::GetList( array(), array('IBLOCK_ID' => 1), false, false, array('PROP_FROM_OLD') ); while($el = $res->GetNextElement()){ $fields = $el->GetFields(); //тут введите код свойство которое копируется $from = $el->GetProperty('PROP_FROM_OLD'); //обновляем свойство CIBlockElement::SetPropertyValuesEx( $fields['ID'], //ID обновляемого элемента 14, //ID инфоблока array('PROP_TO_NEW' => $from['VALUE']) //код обновляемого свойства ); }
PROP_FROM_OLD и PROP_TO_NEW – символьные коды. Не забывайте менять свой ID инфоблока.
Как скопировать элементы в 1С-Битрикс
Если свойств несколько и вам нужно пересоздать элементы относительно другого инфоблока, то вам поможет данный скрипт:
<? if (CModule::IncludeModule("iblock")): $rs = CIBlockElement::GetList ( false, Array("IBLOCK_ID" => 8, "ACTIVE" => "Y"), false, false, Array('ID', 'NAME', 'PROPERTY_HOURS', 'PROPERTY_MINUTES', 'ACTIVE_FROM') ); while ($ar_fields = $rs->GetNext()) { echo "<pre>"; print_r($ar_fields); echo "</pre>"; $el = new CIBlockElement; $PROP = array(); $PROP[7] = 1; // проект $PROP[8] = $ar_fields['PROPERTY_HOURS_VALUE']; // часы $PROP[9] = $ar_fields['PROPERTY_MINUTES_VALUE']; // минуты $arLoadProductArray = Array( "MODIFIED_BY" => $USER->GetID(), // элемент изменен текущим пользователем "IBLOCK_SECTION_ID" => false, // элемент лежит в корне раздела "IBLOCK_ID" => 3, "DATE_ACTIVE_FROM" => $ar_fields['ACTIVE_FROM'], "PROPERTY_VALUES"=> $PROP, "NAME" => $ar_fields['NAME'], "ACTIVE" => "Y", // активен ); if($PRODUCT_ID = $el->Add($arLoadProductArray)) echo "New ID: ".$PRODUCT_ID; else echo "Error: ".$el->LAST_ERROR; } endif; ?>
Как видите, из инфоблока с ID 8 мы создаем в инфоблоке с ID 3 новые элементы. Значения свойств берутся из старого инфоблока, или же, как было в моем случае, из инфоблока который “оказался не там” после XML выгрузки 🙂 .