Найти в Дзене

Очистка значений свойств элементов инфоблока

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

Приведем примеры кода для решения подобных задач.

Предположим, нам нужно убрать пробелы в начале и в конце значений свойств инфоблока (концевые пробелы).

Будем работать с инфоблоком, который создан в системе под номером 6

$IBLOCK_ID=6;

Получим все элементы инфоблока

$db_elemens = CIblockElement::GetList(array(), array("IBLOCK_ID"=>$IBLOCK_ID), false, false);

Инициализируем счетчик, чтобы понимать, сколько элементов инфоблока обработано

$i=0;

Далее в цикле будем обходить каждый элемент инфоблока (первый цикл):

while ($obElement = $db_elemens->GetNextElement())
{
...
}

Содержимое первого цикла:

Увеличиваем количество обработанных элементов

$i++;

Затираем массив очищенных свойств элемента инфоблока

$arFields=[];

Получаем массив значений полей элемента инфоблока. За исключением получения идентификатора (ID) элемента инфоблока мы с ними работать не будем, но чтобы было. При необходимости код очистки полей можете дописать самостоятельно или задать вопрос в комментариях

$el=$obElement->GetFields();

Далее получаем массив значений свойств элемента инфоблока

$properties = $obElement->GetProperties();

Обходим полученные значения в цикле (второй цикл). В цикле очищаем эти значения и сохраняем в массив очищенных значений. Если значение свойства в итоге будет пустое, ничего с ним не делаем

foreach ($properties as $key=>$p)
{
if (trim($p['VALUE'])!="") $arFields[$key]=trim($p['VALUE']);
}

И в итоге сохраняем новые значения полей

CIBlockElement::SetPropertyValuesEx($el["ID"], $IBLOCK_ID, $arFields);

Соберем все в итоговый код

<?
$IBLOCK_ID=6;
$db_elemens = CIblockElement::GetList(array(), array("IBLOCK_ID"=>$IBLOCK_ID), false, false);
$i=0;
while ($obElement = $db_elemens->GetNextElement())
{
$i++;
$arFields=[];
$el=$obElement->GetFields();
$properties = $obElement->GetProperties();
foreach ($properties as $key=>$p)
{
if (trim($p['VALUE'])!="") $arFields[$key]=trim($p['VALUE']);
}
CIBlockElement::SetPropertyValuesEx($el["ID"], $IBLOCK_ID, $arFields);
}
?>
<p>Обработано <?=$i?>

Обратите внимание, что в конце мы вывели количество обработанных элементов.

На канале еще есть видео по этому вопросу.

Продолжение следует...

Спасибо за просмотр.

Подписывайтесь на канал, пишите комментарии.

Удобно ли просматривать код в виде цитаты? Удобны ли мои подробные пояснения? А может быть у меня есть ошибки? Или у вас есть вопросы?

Подписывайтесь, и обсудим в комментах.