Если вы нашли эту статью, значит вы как и я не смогли решить данную задачи при помощи событий OnAfterIBlockElementUpdate 🙂
Как в битриксе перезаписать цену взятую из свойства
В одной статье сказано, «основная причина почему не работают обработчики событий для элементов связана с тем что сначала выполняются обработчики для инфоблока, а затем для каталога» .
Это значит что наши события при добавлении или обновлении информационных блоков просто отработают первыми, и даже если мы напишем CPrice::Update — то он просто перезапишется значениями из вкладки «торговый каталог».
Наша задача брать цену из свойства (при добавлении через админ форму, публичную или админ раздела) и перезаписывать значение цены в самом каталоге. Решить данную проблему можно в 2 шага:
Шаг 1: заходим в настройки инфоблока с товарами (Каталог). На первой вкладке ищем поле «Файл для редактирования элемента, позволяющий модифицировать поля перед сохранением:» . Записываем значение:
/bitrix/php_interface/include/iblock_catalog_edit_after_save.php
После сохранения создаем файл на сервере по данному пути.
Шаг 2: В файл iblock_catalog_edit_after_save.php — пишем следующий код:
function BXIBlockAfterSave($arFields) { $price = array_shift($_POST["PROP"]); // take first value $price = str_replace(",", ".", $price); // replace coma //AddMessage2Log($price); $PRODUCT_ID = $arFields["ID"]; $arField = Array("PRODUCT_ID" => $PRODUCT_ID, "CATALOG_GROUP_ID" => 1, "PRICE" => $price, "CURRENCY" => "RUB"); $res = CPrice::GetList(array(),array("PRODUCT_ID" => $PRODUCT_ID, "CATALOG_GROUP_ID" => 1)); if ($arr = $res->Fetch()) { CPrice::Update($arr["ID"], $arField); } else { CPrice::Add($arField); } } ?>
А теперь давайте разбираться, тут есть несколько ньюансов:
1. BXIBlockAfterSave
— именно это событие и поможет нам справиться с задачей, другие события просто не реагируют..
2. $price = array_shift($_POST[‘PROP’]);
— в массиве $arFields
не так и много полей за которые можно зацепиться (если я не путаю там даже ID информационного блока нет 🙂), поэтому мы будем работать с массивом $_POST
. Вывести содержимое этого массива можно при помощи:
AddMessage2Log($_POST);
Не забудьте что вам нужно в файле /bitrix/php_interface/dbconn.php прописать путь к лог файлу:
Define("LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"]."/.log.txt");
Если вы всё сделали правильно, можете попробовать пересохранить какой-либо элемент каталога (под элементом в данном контексте я имею ввиду товар, но в инфоблоках эта сущность по умолчанию называется элемент).
3. 55
— это ID
моего свойства с ценой, которое я изменяю и далее значение которого мы записываем в переменную при помощи:
$price = array_shift($_POST["PROP"]); // take first value $price = str_replace(",", ".", $price); // replace coma
Вам нужно изменить 55 на ID вашего свойства. Ну а вторым действием заменяем запятую на точку, чтобы избежать каких-то ошибок.
Внимательный читатель спросит — а зачем же нам init.php? А в том то и дело, что единственное чем нам поможет этот файл, это записать данную функцию туда, вопрос — есть ли в этом смысл? Ведь всё что грузится в init.php доступно потом почти в любой части сайта.
Надеюсь у вас всё получилось, пишите в комментариях о своих успехах 🙂
Компонент служит для редактирования результатов заполнения веб-форм.
При его использовании в сочетании с компонентом Список результатов значение поля RESULT_ID можно оставить по умолчанию. Если же компонент используется самостоятельно, то необходимо определить откуда компонент должен брать значение параметра RESULT_ID или задать его явно. Компонент стандартный и входит в дистрибутив модуля.
В структуре визуального редактора компонент расположен по пути Сервисы > Веб-формы > Редактирование результата .
Компонент относится к модулю Веб-формы .
Настройки, определяющие права групп пользователей на редактирование результатов устанавливаются в настройках каждой из веб-форм, а в случае работы в расширенном режиме также в настройках статусов.
Пример вызова компонента form.result.edit |
---|
$APPLICATION->IncludeComponent("bitrix:form.result.edit","",Array("SEF_MODE" => "Y", "RESULT_ID" => "$_REQUEST[\"RESULT_ID\"]", "EDIT_ADDITIONAL" => "N", "EDIT_STATUS" => "Y", "LIST_URL" => "result_list.php", "VIEW_URL" => "result_view.php", "CHAIN_ITEM_TEXT" => "", "CHAIN_ITEM_LINK" => "", "IGNORE_CUSTOM_TEMPLATE" => "Y", "USE_EXTENDED_ERRORS" => "Y", "SEF_FOLDER" => "/", "SEF_URL_TEMPLATES" => Array("edit" => "#RESULT_ID#/"), "VARIABLE_ALIASES" => Array("view" => Array(), "edit" => Array(),)),);?> |
Секции настроек компонента:
Описание параметров
Поле | Параметр | Описание |
Источник данных | ||
---|---|---|
ID результата | RESULT_ID | Указывается идентификатор результата заполнения формы. По умолчанию указано $_REQUEST["RESULT_ID"] , но также может быть записан php-код, возвращающий RESULT_ID . |
Внешний вид | ||
Игнорировать свой шаблон | IGNORE_CUSTOM_TEMPLATE | При отмеченной опции для отображения веб-формы будет использоваться шаблон формы по умолчанию, даже если создан свой шаблон. |
Использовать расширенный вывод сообщений об ошибках | USE_EXTENDED_ERRORS | При отмеченной опции будет использован расширенный вывод сообщений об ошибках. |
Управление адресами страниц | ||
Включить поддержку ЧПУ | SEF_MODE | При отмеченной опции будет включена поддержка ЧПУ. Если режим поддержки ЧПУ включен , то необходимо настроить следующие параметры: SEF_FOLDER , SEF_URL_TEMPLATES . |
Параметры компонента | ||
Выводить на редактирование дополнительные поля | EDIT_ADDITIONAL | При отмеченной опции будут выведены для редактирования дополнительные поля формы при их наличии. |
Выводить форму смены статуса | EDIT_STATUS | При отмеченной опции будет выведена форма смены статуса текущего результата. Статусы будут доступны в соответствии с правами пользователя. |
Страница со списком результатов | LIST_URL | Указывается адрес страницы со списком результатов. |
Страница просмотра результата | VIEW_URL | Указывается адрес страницы просмотра результата. |
Название дополнительного пункта в навигационной цепочке | CHAIN_ITEM_TEXT | Указывается название дополнительного пункта в навигационной цепочке. Если оставить незаполненным, то в навигационную цепочку пункт не добавляется. |
Ссылка на дополнительном пункте в навигационной цепочке | CHAIN_ITEM_LINK |