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

15.12.2018  10:00

Возникла задача — вывести свойства товаров в фильтр, но оказалось, что в 1С бардак и свойства хранятся по отдельности, в инфоблоке такой же ералаш и свойства товаров строковые и фильтр по ним работать не будет. Значит хотя бы в битриксе надо навести порядок.

Настройки инфоблока товаров
На скрине зелёным выделено новое множественное свойство типа «привязка к элементам» (можно и типа «список»). Красным — старые свойства, в которых по-тупому хранится значение «Да», если товар имеет привязку к празднику.

Скрипт перелопачивает все товары, и если какие-то свойства заполнены, то прописывает привязки в новое свойство HOLIDAY (старые привязки затираются, что нам и нужно).

Сам скрипт:
$_SERVER["DOCUMENT_ROOT"] = realpath(dirname(__FILE__)."/..");
require_once ($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
CModule::IncludeModule("iblock");
if ( !$USER->IsAdmin() ) {
    $APPLICATION->AuthForm("");
// если запускать руками, то проверка на админа, если кроном — это надо убирать
}
// $obE = new CIBlockElement();
$IBLOCK_ID = 14;// id инфоблока товаров
$arrProps = Array(
	"FILTR_DEN_ROZHDENIYA" => Array(
		"PROP" => "HOLIDAY",//код нового свойства
		"VALUE" => 122,//id элемента инфоблока к которому сделать привязку или id свойства если тип список
	),
	"FILTR_YUBILEY" => Array(
		"PROP" => "HOLIDAY",
		"VALUE" => 123,
	),
	// ну и остальные свойства по-аналогии
);
$filterFields[] = "ID";
$filterFields[] = "NAME";
$filterFields[] = "CODE";
foreach($arrProps as $k => $v) {
	$filterFields[] = 'PROPERTY_'.$k.'';
}
$c = 0;
$arFilter = Array(
   "IBLOCK_ID"=>$IBLOCK_ID,
   // "ID"=>123,// попробовать на одном конкретном товаре, чтобы не облажаться
   "ACTIVE" => "Y",
);
$res = CIBlockElement::GetList(Array("ID"=>"ASC"), $arFilter, $filterFields);
while ($ar_fields = $res->GetNext()) {
	unset($arProps);
	foreach($arrProps as $k => $v) {
		if($ar_fields["PROPERTY_".$k."_VALUE"] == "Да") $arProps[$v["PROP"]][] = $v["VALUE"];
	}
	$arFields_update = Array(
		"IBLOCK_ID" => $IBLOCK_ID,
	);
	$obE = new CIBlockElement();
	if ($obE->Update($ar_fields["ID"], $arFields_update)){
		//echo ''.$name.' update
'; $arMessages[] = ''.$name.' update1'; $c++; if (!empty($arProps)) CIBlockElement::SetPropertyValuesEx($ar_fields["ID"], $IBLOCK_ID, $arProps); unset($arProps); } } echo 'fin '.$c; // можно и $arMessages распечатать


Всё! Теперь полный порядок и в смарт фильтре свойство может отображаться списком или флажками. Скрипт можно запускать вручную, а можно повесить на крон и забыть, а запускать сразу после выгрузки из 1С.
Андрей Панёвин
Здравствуйте! Я — Андрей Панёвин и занимаюсь профессиональной разработкой сайтов на платформе 1С-Битрикс (исключительно программирование). Есть вопросы по статье? Могу подсказать и помочь по скайпу (andrey.panevin.ru), WhatsApp (+7-911-091-0670) или перепиской в ВК.
1000 р./час.



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

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


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

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


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