Битрикс — скрипт заполнения свойства «привязка к элементам» по строковому свойству

27.06.2018  06:59

Задача: у товаров есть строковое свойство «коллекции» — надо добавить и заполнить другое свойство, настроенное как привязка к элементам соседнего инфоблока Коллекции. В этом инфоблоке соответственно автоматом создать все записи из старого свойства. Скрипт обработки свойств:

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
//увеличим память и время выполнения скрипта:
set_time_limit(0);
ini_set('max_execution_time', '3600');
ini_set('memory_limit', '512M');
//этот кусок с вариациями у меня кочует по всем служебным скриптам
$IBLOCK_ID = 10;//id инфоблока каталога товаров
$IBLOCK_ID_C = 5;//id инфоблока коллекций
$c = 0;
$c_empty = 0;
$c_update = 0;
$c_add = 0;
CModule::IncludeModule("iblock");
CModule::IncludeModule("catalog");
$obE = new CIBlockElement();
global $USER;
if (!$USER->IsAdmin()){
exit;//если не админ то выход
}
	$arSelect = array(
		"ID",
		"NAME",
		"IBLOCK_ID",
		"IBLOCK_SECTION_ID",//added
		"PROPERTY_COLLECTION",//новое свойство тип привязка к элементам инфоблока
		"PROPERTY_YML2_KOLLEKTSIYA",//старое свойство типа строка
		"ACTIVE",
		"ACTIVE_DATE",
		"SORT",
	);
	$arFilter = array(
		"IBLOCK_ID" => $IBLOCK_ID,
		"IBLOCK_ACTIVE" => "Y",
		"=PROPERTY_COLLECTION" => false,
		"!=PROPERTY_YML2_KOLLEKTSIYA" => false,
		// "ID" => 8799,
		//"ACTIVE_DATE" => "Y",
		//"ACTIVE" => "Y",
	);
	$r = CIBlockElement::GetList(
		array(), 
		$arFilter, 
		false, 
		false, 
		$arSelect
	);
while ($rows = $r->Fetch())
{
	$name = $rows["PROPERTY_YML2_KOLLEKTSIYA_VALUE"];
	$id_prod = $rows["ID"];
	$arSelectCollection = array(
		"ID",
		"NAME",
		"IBLOCK_ID",
		"ACTIVE",
		"ACTIVE_DATE",
		"SORT",
	);
	$arFilterCollection = array(
		"IBLOCK_ID" => $IBLOCK_ID_C,
		"IBLOCK_ACTIVE" => "Y",
		"=NAME" => $name,
		//"ACTIVE_DATE" => "Y",
		//"ACTIVE" => "Y",
	);
	$rCollection = CIBlockElement::GetList(
		array(), 
		$arFilterCollection, 
		false, 
		false, 
		$arSelectCollection
	);
	if ($rowsCollection = $rCollection->Fetch())
	{//update
		$arProps_update["COLLECTION"] = $rowsCollection["ID"];
		// заполнение нового свойства id элемента из инфоблока Коллекции
		CIBlockElement::SetPropertyValuesEx($id_prod, $IBLOCK_ID, $arProps_update);
		// echo $rowsCollection["ID"].' '.$name.' update
'; $c_update++; } else {//add if (!empty($name)) {//генерация символьного кода $arParams = array("replace_space"=>"-","replace_other"=>"-"); $code = Cutil::translit($name,"ru",$arParams); } $arFields = Array( "ACTIVE" => "Y", "IBLOCK_ID" => $IBLOCK_ID_C, "NAME" => $name, "CODE" => $code, ); $arFields_insert = $arFields; if ( $ID = $obE->Add($arFields_insert) ) {//создаём в коллекциях новую запись $arProps_add["COLLECTION"] = $ID;//заполняем новое свойство id создаваемой записи в инфоблоке Коллекции CIBlockElement::SetPropertyValuesEx($id_prod, $IBLOCK_ID, $arProps_add); // echo $id_prod.' - '.$name.' add
'; $c++; } // echo 'add '.$code;exit; } } // результаты работы скрипта: echo '
fin '.$c; echo '
fin add '.$c_add; echo '
fin update '.$c_update;


Таким образом все строковые свойства автоматом перенеслись в инфоблок Коллекциии, а у товаров в каталоге заполнилось новое свойство типа привязка к элементам Коллекций.


перейти в Блог

Ударим лайками по бездорожью, разгильдяйству и бюрократизму!


Ключевые слова (тэги): 1С-Битрикс 43  PHP 55  web-программирование 79  

Вам есть что сказать — ну я же чую.
Высказаться о наболевшем, я выслушаю:
Имя


email (не публикуется)