Haotik
@Haotik
PHP мидл без фреймворков

Как снять одно значение множественного свойства в BITRIX по апи?

есть множественное свойство HIT
5f48b296db3a4531873327.png
Значения 5f48b216da4a3518208654.png
В товаре 5f48b3ce435a7597367627.jpeg
Не могу дать ладу функции CIBlockElement::SetPropertyValues
Необходимо по условию скинуть галку NEW пытаюсь сделать вот таким образом
CIBlockElement::SetPropertyValues($arResult["ID"], $arResult["IBLOCK_ID"], ['2141' => false], "HIT");

В результате слетают все значения данного свойства.
  • Вопрос задан
  • 1146 просмотров
Решения вопроса 1
@PetrPo
Как задача звучит тривиально...

Реальность:
\Bitrix\Main\Loader::includeModule('iblock');

$propertyValuesIdByXmlId = $elementPropertyValuesById = [];

$iblockId = 17;
$elementId = 176;
$propertyCode = 'HIT';
$deletePropertyValuesXmlId = ['NEW'];

$iterator = \Bitrix\Iblock\PropertyEnumerationTable::getList([
	'select' => ['*'],
	'filter' => ['PROPERTY.IBLOCK_ID' => $iblockId, 'PROPERTY.CODE' => $propertyCode]
]);
while($row = $iterator->fetch()) {
	$propertyValuesIdByXmlId[$row['XML_ID']] = $row['ID'];
}

$dbRes = CIBlockElement::GetList([], ['IBLOCK_ID' => $iblockId, 'ID' => $elementId], false, false, ['IBLOCK_ID', 'ID', 'PROPERTY_'.$propertyCode]);
while($arRes = $dbRes->Fetch()) {
	$value = $arRes['PROPERTY_'.$propertyCode.'_VALUE'];
	$valueId = $arRes['PROPERTY_'.$propertyCode.'_ENUM_ID'];
	$elementPropertyValuesById[$valueId] = $value;
}

if($elementPropertyValuesById) {
	foreach($deletePropertyValuesXmlId as $xmlId) {
		$deletePropertyValueId = $propertyValuesIdByXmlId[$xmlId];
		
		if(isset($elementPropertyValuesById[$deletePropertyValueId])) {
			unset($elementPropertyValuesById[$deletePropertyValueId]);
		}
	}

  CIBlockElement::SetPropertyValuesEx($elementId, $iblockId, [$propertyCode => array_keys($elementPropertyValuesById)]);
}


P.S. все подписано конечно, но если что-то непонятно, спрашивай

UPD
перенес CIBlockElement::SetPropertyValuesEx выше в условие
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@wd-315
В вашем случае нужно использовать SetPropertyValuesEx
Метод сохраняет значения всех свойств элемента информационного блока. В отличие от SetPropertyValues может не содержать полный набор значений. Значения свойств, неуказанных в массиве PROPERTY_VALUES, будут сохранены. Этот метод более экономен в количестве запросов к БД. Метод статический.

https://dev.1c-bitrix.ru/api_help/iblock/classes/c...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы