Задать вопрос

CIBlockElement::Add — как добавить свойство типа список?

$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))


Я понимаю, что свойства можно добавить так.

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


но у меня входные данные не id же. чет туплю. хелп
  • Вопрос задан
  • 2504 просмотра
Подписаться 1 Простой 2 комментария
Решения вопроса 1
winer
@winer
занимаюсь разработкой сайтов на 1c-bitrix
Если у Вас нет возможности передать в качестве входных данных именно ID списочных элементов (внешний импорт или файл какой ни-будь), то делайте поиск по списочным значениям и уже из найденных элементов подставляйте их ID

$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 - будет массив с ID списочных значений, который нужен Вам в CIblockElement::Add
Стоит обратить внимание на то что в примере в метод getList передан параметр cache. Это позволит каждый раз не обращаться к БД, а взять значение из кеша.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@pavel__sidorov Автор вопроса
Евгений Николаев

благодарю за функцию

//[НАЧАЛО]Функция получения кода свойства типа список(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) по его названию а так же Ид инфоблока и коду(имени) свойства
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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