Меню
RSS
Массовая перезапись свойства элемента в каталоге
 
Здравствуйте, нужно обновить определённое свойство, а точнее его перезаписать так как с 1С приходят данные с запятой, а нужны в общем то с точкой. Написал следующий скрипт, но не нашёл в Апи битрикса как записать 1 запросом данные, я так понимаю на каждый setProperyValueEx и Update идёт запрос к базе, ну следовательно вылезает что время запроса к базе превышено и скрипт выполняется не полностью. Если поставить время запроса больше то отваливается апач от браузера, тестил на локальном сервере. Подскажите как это всё грамотно сделать пожалуйста.
Код
if(CModule::IncludeModule("iblock")){ 

   $id_catalog = 8;
   $prop = [];
   $order = ['ID' => 'ASC'];
   $filter = ['IBLOCK_ID' => $id_catalog];
   $rows = CIBlockElement::GetList($order, $filter);
   while ($row = $rows->fetch()) {
       $row['PROPERTIES'] = [];
       $prop[$row['ID']] =& $row;
       unset($row);
   }
   //Получаю массив со всеми свойствами всех элементов
   CIBlockElement::GetPropertyValuesArray($prop, $filter['IBLOCK_ID'], $filter);
   unset($rows, $filter, $order);
   //перезаписываю в массив $arCodeValue нужное свойство
        $arCodeValue = [];
   foreach ($prop as $key => $value) {
      if(!empty($value)){
      while(strstr($value['PROPERTIES']['VOLUME']['VALUE'], ',')){
      $value['PROPERTIES']['VOLUME']['VALUE'] = str_replace(',','.',$value['PROPERTIES']['VOLUME']['VALUE']);
      $arCodeValue[$key] = [$value['PROPERTIES']['VOLUME']['ID'] => $value['PROPERTIES']['VOLUME']['VALUE']];
      }
      }else echo 'empty';
   }
        //До этого всё выполняется быстро, а последний цикл как раз даёт много запросов бд
        //Записываю массив $arCodeValue при помощи SetPropertyValuesEx
        //Сохраняю при помощи Update 
   foreach ($prop as $key => $value) {
      if(!empty($value) && strstr($value['PROPERTIES']['VOLUME']['VALUE'], ',')){
      CIBlockElement::SetPropertyValuesEx($key, $id_catalog, $arCodeValue[$key]);
      $elthis = new CIBlockElement;
      $elthis->Update(
         $key,
         [ 'WF_STATUS_ID' => 1, 'ACTIVE' => 'Y' ],
         true
      );
      echo $key;
      echo ' ';
      unset($elthis);
      }
   }
}
 
Не сильно вчитался в скрипт, но не очень понял зачем:
Код
 $elthis = new CIBlockElement;
      $elthis->Update(
         $key,
         [ 'WF_STATUS_ID' => 1, 'ACTIVE' => 'Y' ],
         true
      );
      echo $key;

CIBlockElement::SetPropertyValuesEx и без этого должно сохранить значение.
Если совсем много, сделайте скрипт пошаговым. Пример тут, там не очень феншуйно и немного говнокодства, но если единоразово нужен, вполне сгодится.
https://bazarow.ru/forum/forum11/641-poshagovaya-obrabotka-bolshogo-kolichestva-elementov-infobloka_-bystro-skript
 
Код
$elthis = new CIBlockElement;
      $elthis->Update(
         $key,
         [ 'WF_STATUS_ID' => 1, 'ACTIVE' => 'Y' ],
         true
      );
      echo $key;
Этот код нужен чтобы умный фильтр работал, в апи битрикса снизу кто-то написал что этот код сохраняет последний черновик, чтобы это не значило. В общем только что тестил, CIBlockElement::SetPropertyValuesEx и правда сохраняет значение, но умный фильтр их не видит а если с этим кодом то в общем то видит, не знаю почему, но это так) Спасибо за пример пошаговости.
Читают тему
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
Загрузить картинки
 

Блог-note: заметки разработчика

ORM в инфоблоках, получение информации об элементах инфоблока на D7

Задача: собрать полные данные об элементах инфоблока, применяя ORM/D7, который пришел на смену устаревшему CIBlockEleme...

Заполнение множественного пользовательского свойства типа "строка" через API

Задача: когда пользователь заходит в мобильное приложение, нужно сохранить FCM токен устройства в пользовательское поле ...

Настройка выгрузки товаров в Яндекс Маркет с сайта Битрикс

Настройка выгрузки в Яндекс маркет в формате yml, выполняется достаточно просто, кроме одной заморочки: в типовой постав...

Удалить всех пользователей которые не делали заказов в магазине 1С-Битрикс

Задача: сайт проработал 7 лет и все время на нем была открытая регистрация, создано много мертвых учетных записей (б...

Автогенерация символьных кодов разделов и элементов Битрикс

Иногда нужно создать символьные коды для разделов и элементов. Например: если сайт создан давно и ранее работал на ID се...

Установить цену товара из свойства инфоблока

На одном из проектов, нужно было единоразово заполнить цены товаров из свойства инфоблока. Сделать это можно через API, ...

Бонус за выполненный заказ на внутренний счет пользователя

Задача: после того как заказ, в интернет-магазине, перешел в статус "Выполнен" начислить пользователю 5% от стоимости за...

Получить и вывести данные из профиля покупателя в кабинете пользователя 1С-Битрикс

Задача: вывести пользователю информацию по всем, его, профилям покупателя в компоненте sale.personal.profile.list без пе...

Вывести производителей на сайте с отбором его товаров из каталога

Достаточно частая задачка для каталога или интернет-магазина: вывести список производителей с подробными описаниями, а т...