Ciblockelement update не работает

SOS! Очищаются свойства методом UPDATE класса CIBlockElement вне документации.

Доброе время суток! Очень критичная ошибка.

$Ielem = new CIBlockElement;
$Ielem -> Update($ob[«ID»], Array(«SORT»=>rand(300, 10000)));

Вот такая безобидная штука по документации поломала весь наш сайт в секунду. Свойства все очистились. Хорошо бекап был.

Из Документации
bool CIBlockElement::Update( int ID , array arFields , bool bWorkFlow = false, bool bUpdateSearch = true, bool bResizePictures = false, bool bCheckDiskQuota = true );

arFields
Массив вида Array(«поле»=>»значение», . ), содержащий значения полей элемента инфоблоков и дополнительно может содержать поле «PROPERTY_VALUES» — массив со всеми значениями свойств элемента в виде массива Array(«код свойства»=>»значение свойства» . Где
«код свойства» — числовой или символьный код свойства,
«значение свойства» — одиночное значение, либо массив значений (если свойство множественное).
Если массив PROPERTY_VALUES задан, то он должен содержать полный набор значений свойств для данного элемента, т.е. если в нем будет отсутствовать одно из свойств, то все его значения для данного элемента будут удалены.
Это справедливо для всех типов свойств кроме типа файл . Файлы надо удалять через массив с параметром «del»=>»Y».
Дополнительно для сохранения значения свойств см: CIBlockElement :: SetPropertyValues() , CIBlockElement :: SetPropertyValueCode().

Но у меня нет массива PROPERTY_VALUES, какого черта очистились все свойства.
Да и зачем он нужен такой глючный функционал с очищением всех свойств при задании одного, если свойства мы можем других методом изменить.

Источник

Update

Описание

Метод изменяет параметры элемента с кодом ID. Перед изменением элемента вызываются обработчики события OnStartIBlockElementUpdate из которых можно изменить значения полей или отменить изменение элемента вернув сообщение об ошибке. После изменения элемента вызывается само событие OnAfterIBlockElementUpdate. Нестатический метод.

Если изменяется свойство типа файл, то необходимо сформировать массив.

Смотрите также

Параметры вызова

Параметр Описание С версии
ID ID изменяемой записи.
arFields Массив вида Array(«поле»=>»значение», . ), содержащий значения полей элемента инфоблоков и дополнительно может содержать поле «PROPERTY_VALUES» — массив со всеми значениями свойств элемента в виде массива Array(«код свойства»=>»значение свойства»). Где
«код свойства» — числовой или символьный код свойства,
«значение свойства» — одиночное значение, либо массив значений (если свойство множественное).

Если массив PROPERTY_VALUES задан, то он должен содержать полный набор значений свойств для данного элемента, т.е. если в нем будет отсутствовать одно из свойств, то все его значения для данного элемента будут удалены.

Это справедливо для всех типов свойств кроме типа файл. Файлы надо удалять через массив с параметром «del»=>»Y».
Если свойство типа список, то в PROPERTY_VALUES надо отдавать не название, а ID значения.
Дополнительно для сохранения значения свойств см: CIBlockElement::SetPropertyValues(), CIBlockElement::SetPropertyValueCode().

Примечание 3: Если нужно обновить элемент инфоблока, добавив его в несколько новых разделов, но не изменив «главный», т.е. чтобы URL элемента не изменился, то в вызове CIBlockElement::Update передайте два ключа: IBLOCK_SECTION_ID — ID основного раздела, IBLOCK_SECTION — массив ID всех разделов элемента, включая основной.

bWorkFlow Изменение в режиме документооборота. Если true и модуль документооборота установлен, то данное изменение будет учтено в журнале изменений элемента. Не обязательный параметр, по умолчанию изменение в режиме документооборота отключено. 3.1.3 bUpdateSearch Индексировать элемент для поиска. Для повышения производительности можно отключать этот параметр во время серии изменений элементов, а после их окончания переиндексировать поиск. Не обязательный параметр, по умолчанию элемент после изменения будет автоматически проиндексирован в поиске. 3.2.1 bResizePictures Использовать настройки инфоблока для обработки изображений. По умолчанию настройки не применяются. Если этот параметр имеет значение true, то к полям PREVIEW_PICTURE и DETAIL_PICTURE будут применены правила генерации и масштабирования в соответствии с настройками информационного блока. 8.0.10 bCheckDiskQuota Проверять ограничение по месту занимаемому базой данных и файлами или нет (настройка главного модуля). Необязательный параметр. 11.0.14

Возвращаемое значение

Примеры использования

Менять параметр IBLOCK_ID нельзя.

Пример задания нового значения дополнительного свойства:

Для типа HTML/TEXT, при вставке HTML-кода и автоматическом подключении HTML-редактора: Для типа HTML/TEXT, при вставке plain text:

Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.

Источник

Решение ошибки Bitrix Class ‘CIBlockElement’ not found

Используя функцию CIBlockElement::GetList (возвращает список элементов по фильтру arFilter) или похожие (GetByID -Возвращает элемент по его ID, GetElementGroups — Возвращает группы, которым принадлежит элемент, по его коду, GetIBlockByID — Метод возвращает инфоблок по ID его элемента, GetProperty- Получение свойств злемента, Add — Добавляет новый элемент, Update — Изменяет элемент, Delete — Удаляет элемент из информационного блока, SetElementSection — Привязывает элемент информационного блока к группам, SetPropertyValues — Сохраняет свойства элемента информационного блока, SetPropertyValuesEx — Сохраняет значения всех свойств элемента информационного блока. В отличие от SetPropertyValues может не содержать полный набор значений, SetPropertyValueCode — Изменяет значение свойства элемента, UpdateSearch — Индексирует указанный элемент в модуле поиска, CounterInc — Увеличивает счетчик показов элемента, SubQuery — Позволяет использовать подзапросы) , очень часто мы получаем ошибку рода Class ‘CIBlockElement’ not found.

Вид функции CIBlockElement::GetList

  1. CIBlockElement::GetList
  2. array arOrder = Array(«SORT»=>»ASC»),
  3. array arFilter = Array(),
  4. mixed arGroupBy = false,
  5. mixed arNavStartParams = false,
  6. array arSelectFields = Array()
  7. );

Решение ошибки очень простое, скорее всего на этой странице не подключается модуль iblock, подключим его, для этого перед вызовом функции вставляем данный код:

Ну а что бы не получить дополнительных ошибок в дальнейшем при разработке на битриксе лучше подключать его вот так:

  1. if(CModule::IncludeModule(«iblock»)):
  2. //тут уже вызов нашей функции. В моем случае это был GetList
  3. endif;

Источник

Bitrix: Отслеживание изменения свойств элемента инфоблока при помощи обработчика событий

Допустим элемент инфоблока является товаров, у этого элемента инфоблока есть свойство PRICE, в котором хранится значение цены товара. Соответственно при обновлении этого свойства PRICE необходимо автоматически обновлять цену товара (цену которая находится на вкладке Торговый каталог).

При изменении элементов инфоблока вызываются события:

  • OnBeforeIBlockElementUpdate — событие, которое вызывается перед изменением элемента.
  • OnStartIBlockElementUpdate — событие, которое вызывается в момент начала изменения элемента.
  • OnBeforeIBlockElementUpdate — событие, которое вызывается после изменения элемента.

В нашем случаи воспользуемся событием OnBeforeIBlockElementUpdate. Цену будем обновлять при помощи способа указанно в статье об обновлении цен при помощи метода CPrice::Update;

Полученный обработчик событий необходимо прописать в файле init.php

Файл init.php храниться в папке /bitrix/php_interface/ или /local/php_interface/ если его там нет, нужно создать

Однако если обновление свойства PRICE осуществляется не при помощи метода CIBlockElement::Update(), а при помощи методов: CIBlockElement::SetPropertyValues, CIBlockElement::SetPropertyValueCode, CIBlockElement::SetPropertyValuesEx — указанные выше обработчики использовать не получится, так как для этих методов работаю свои обработчики событий:

Метод Обработчик события
CIBlockElement::SetPropertyValues
  • OnIBlockElementSetPropertyValues
  • OnAfterIBlockElementSetPropertyValues
CIBlockElement::SetPropertyValuesEx
  • OnIBlockElementSetPropertyValuesEx
  • OnAfterIBlockElementSetPropertyValuesEx

В таком случаи необходимо переписать обработчик события на актуальные события в зависимости от метода изменения свойств элемента.

Допустим свойство изменяется при помощи метода CIBlockElement::SetPropertyValues, тогда код будет выглядеть следующим образом:

Источник

Как можно обновить у товара цену после события OnAfterIBlockElementUpdate?

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

Как я понял для этого нужно запустить обработчик события OnAfterIBlockElementUpdate для информационного блока. Ниже мой код

Почему-то код который должен обновлять цену у товара не срабатывает при событии OnAfterIBlockElementUpdate Хотя если запускать его в консоли PHP Битрикс то цена обновляется, в чем может быть причина?

  • Вопрос задан более года назад
  • 854 просмотра

Первое, битрикс умеет хранить цены в одной валюте, а показывать в другой по курсу установленному для этих валют.

Второе, OnAfterIBlockElementUpdate вызывается только при вызове CIBlockElement::Update
если у вас свойство обновляется другим методом, как пример CIBlockElement::SetPropertyValuesEx то это событие вызываться не будет

Третье, для отладки используйте xdebug, больше половины простых вопросов снялось бы с Тостера если бы люди использовали средства отладки. Не настроено окружение? Ну так используйте хотя бы битриксовскую функцию AddMessage2Log, проверяйте срабатывает ли событие

Александр, Ярослав кстати вам ссылку правильную дал, и мыслит он в правильном направлении, вот только выражает ее кратко, что сразу не понять.
Вообщем то все просто вы сохраняете элемент в админке:
Идет вызов CIBlockElement::Update вместе со всеми свойствами и соответственно срабатывает ваше событие OnAfterIBlockElementUpdate
Но дальше админка сохраняет и цену! Она же в админке в форме тоже присутствует и в этой форме старое значение цены.
Как результат цена не изменилась. Точнее она сначала сменилась на новую, но потом вернулось старое значение из формы.

Решение в вашем случае, убрать обработку события OnAfterIBlockElementUpdate
Вешаемся на события OnBeforePriceUpdate, оно тоже будет вызываться при сохранении в админке (читаем выше, цена тоже сохраняется), а там уже дергаем ваше свойство, на его основе пересчитываем цену и подменяем.

Источник

Читайте также:  Почему не работает тепловизор
Оцените статью