1C-Битрикс изменить цену при добавлении или обновлении элемента (init.php)

Если вы нашли эту статью, значит вы как и я не смогли решить данную задачи при помощи событий OnAfterIBlockElementUpdate 🙂

Как в битриксе перезаписать цену взятую из свойства

В одной статье сказано, «основная причина почему не работают обработчики событий для элементов связана с тем что сначала выполняются обработчики для инфоблока, а затем для каталога».

Это значит что наши события при добавлении или обновлении информационных блоков просто отработают первыми, и даже если мы напишем CPrice::Update — то он просто перезапишется значениями из вкладки «торговый каталог».

Наша задача брать цену из свойства (при добавлении через админ форму, публичную или админ раздела) и перезаписывать значение цены в самом каталоге. Решить данную проблему можно в 2 шага:

Шаг 1: заходим в настройки инфоблока с товарами (Каталог). На первой вкладке ищем поле «Файл для редактирования элемента, позволяющий модифицировать поля перед сохранением:». Записываем значение:

После сохранения создаем файл на сервере по данному пути.

Шаг 2: В файл iblock_catalog_edit_after_save.php — пишем следующий код:

А теперь давайте разбираться, тут есть несколько ньюансов:
1. BXIBlockAfterSave — именно это событие и поможет нам справиться с задачей, другие события просто не реагируют..
2. $price = array_shift($_POST[‘PROP’][55]); — в массиве $arFields не так и много полей за которые можно зацепиться (если я не путаю там даже ID информационного блока нет 🙂 ), поэтому мы будем работать с массивом $_POST. Вывести содержимое этого массива можно при помощи:

Не забудьте что вам нужно в файле /bitrix/php_interface/dbconn.php прописать путь к лог файлу:

Если вы всё сделали правильно, можете попробовать пересохранить какой-либо элемент каталога (под элементом в данном контексте я имею ввиду товар, но в инфоблоках эта сущность по умолчанию называется элемент).
3. 55 — это ID моего свойства с ценой, которое я изменяю и далее значение которого мы записываем в переменную при помощи:

Вам нужно изменить 55 на ID вашего свойства. Ну а вторым действием заменяем запятую на точку, чтобы избежать каких-то ошибок.

Далее по коду мы просто вылавливаем ID элемента, и выполняем обновление цены. Если цены нет, то создаем ее. Тут нам помогают CPrice::Update и CPrice::Add.

Внимательный читатель спросит — а зачем же нам init.php? А в том то и дело, что единственное чем нам поможет этот файл, это записать данную функцию туда, вопрос — есть ли в этом смысл? Ведь всё что грузится в init.php доступно потом почти в любой части сайта.

Надеюсь у вас всё получилось, пишите в комментариях о своих успехах 🙂

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

автор: Dmitriy

Занимаюсь веб-разработкой с 2011 года.

Предоставляю услуги по созданию проектов на CMS 1С-Битрикс - сайты, шаблоны и компоненты с нуля.

Другие виды работ:
  • Доработка функционала на уже существующих проектах
  • Вёрстка макетов (HTML, CSS, JavaScript, jQuery, JADE, SASS, Gulp)
  • Скрипты на PHP и JS (jQuery)

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

E-mail: dmitriyribka@gmail.com
Skype: cinemacreaterus

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *