P
P
Pavel Sidorov2021-07-07 10:32:31
1C-Bitrix
Pavel Sidorov, 2021-07-07 10:32:31

CIBlockElement::Add - how to add a property of the list type?

$el = new CIBlockElement;

$PROP = array();
$PROP['mystring'] = "some string"; 
$PROP['mylist'] = ???


$arLoadProductArray = Array(
  "MODIFIED_BY"    => $USER->GetID(), 
  "PROPERTY_VALUES"=> PROP,
   ...
  );

if($PRODUCT_ID = $el->Add($arLoadProductArray))


I understand that properties can be added like this.

$PROP['mylist'] = array (01, 02 ..) - где 01, 02 .. это id значения свойства типа список


but my input data is not the same id. I'm stupid. help

Answer the question

In order to leave comments, you need to log in

2 answer(s)
R
Roman Gritsuk, 2021-07-07
@pavel__sidorov

If you are not able to pass exactly the IDs of the list elements as input data (external import or some kind of file), then search by the list values ​​and substitute their IDs from the already found elements

$iblockId = 1;//id инфоблока
$inputValues = [44, 45, 46];//Ваши входные данные

$enumIds = array_column(\Bitrix\Iblock\PropertyEnumerationTable::getList([
    "select" => ["ID"],
    "filter" => [
        "PROPERTY.CODE" => "mylist",
        "PROPERTY.IBLOCK_ID" => $iblockId,
        "VALUE" => $inputValues
    ],
    "cache" => [
        "ttl" => 86400
    ]
]->fetchAll()), "ID");

$enumIds - there will be an array with IDs of list values ​​that you need in CIblockElement::Add
It is worth paying attention to the fact that in the example the cache parameter was passed to the getList method. This will allow each time not to access the database, but to take the value from the cache.

P
Pavel Sidorov, 2021-07-07
@pavel__sidorov

Evgeny Nikolaev
thank you for the feature

//[НАЧАЛО]Функция получения кода свойства типа список(Enum) по его названию а так же Ид инфоблока и коду(имени) свойства
function myGetPropEnumId($name=false,$IBlockId=false,$code=false) {
  if ($name and $IBlockId and $code) {
    $name = $name . "";//Поле может прийти как int что может привести к неверному срабатыванию условия ниже, поэтому приводим к string
//В следующей строчке в качестве фильтра нельзя передать ~VALUE, если его передать всё равно выберутся все записи из фильтра без учёта ~VALUE. Требуется сравнение именно с ~VALUE, а не просто VALUE, поскольку просто VALUE будет содержать заменённые на " кавычки и если они есть совпадения не будет
    $property_enums = CIBlockPropertyEnum::GetList(Array("DEF"=>"DESC", "SORT"=>"ASC"), Array("IBLOCK_ID"=>$IBlockId,"CODE"=>$code,"~VALUE"=>$name));
    while ($enum_fields = $property_enums->GetNext()) {
      if ($enum_fields["~VALUE"] == $name) {//Поскольку в качестве фильтра бесполезно передавать ~VALUE, проверяем совпадение в этом условии
        return $enum_fields["ID"];//Если искомое значенией найдено возвращаем результат в этой строке
      }
    }

//Если искомое значение найдено не было выполняется код далее

//Определяем ID свойства в инфоблоке
// ID свойств так же можно было получить следующим методом: $result = \Bitrix\Iblock\PropertyTable::getList($params);
    $properties = CIBlockProperty::GetList(Array("sort"=>"asc", "name"=>"asc"), Array("ACTIVE"=>"Y","IBLOCK_ID"=>$IBlockId,"PROPERTY_TYPE"=>"L","CODE"=>$code));
    if ($prop_fields = $properties->GetNext()) {//Если удалось определить ID свойства в инфоблоке
      $PROPERTY_ID = $prop_fields["ID"];

//Создаём элемент списка ENum и выполняем его добавление
      $ibpenum = new CIBlockPropertyEnum;
// !!! ВАЖНО В СЛЕДУЮЩЕЙ СТРОЧКЕ УКАЗЫВАЕТСЯ ID СВОЙСТВА РАЗМЕР ИНФОБЛОКА ТОРГОВЫХ ПРЕДЛОЖЕНИЙ А НЕ СИМВОЛЬНЫЙ КОД
      if ($PropID = $ibpenum->Add(Array("IBLOCK_ID"=>$IBlockId,"PROPERTY_ID"=>$PROPERTY_ID,"VALUE"=>$name))) {
        return $PropID;//Возвращаем Id созданного свойства Enum
      }
    }
  }
//Иначе возвращаем ошибку
  return false;
}
//[КОНЕЦ]Функция получения кода свойства типа список(Enum) по его названию а так же Ид инфоблока и коду(имени) свойства

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question