Попробуйте дальше сами разобраться.
Все цены вы уже знаете как собрать в массиве. см. предыдущие примеры.
Надо понять каким образом надо передать данные дальше.
Может быть даже так: $result = $products->rows;
В result_modifier.php можно было бы сделать так: проверить свойство товара МЕТАЛЛ == ЗОЛОТО , если условие выполняется, то в $arResult для элемента добавить пометку, что товар по акции(без модификации свойства АКЦИЯ). Но не надо в result_modifier.php выполнять методы на изменение CIBlockElement::SetPropertyValues. Зачем вам лишние запросы к БД при каждой загрузке страницы, а если на страницу зайдет одновременно 1000 человек что будет с базой? =)
Володя Ганн:Я правильно понял у вас у товаров есть свойство АКЦИЯ? можно по событию OnAfterIBlockElementUpdate (https://dev.1c-bitrix.ru/api_help/iblock/events/on..., которое срабатывает после изменения элемента инфоблока, проверять свойство элемента. Если Свойство МЕТАЛЛ == ЗОЛОТО, то выставлять активность для свойства АКЦИЯ. Это для новых элементов. А для уже созданных, вы можете на отдельной страничке написать код, который проходит по всем элемента инфоблока и делает то же самое: "проверять свойство элемента. Если Свойство МЕТАЛЛ == ЗОЛОТО, то выставлять активность для свойства АКЦИЯ". После того, как напишите скрипт, запустите его один раз. В итоге у всех золотых товаров будет стоять галочка акция.
а нету ли в аргументах события OnOrderSave ид зареганного человека, в arFields или arOrder. Во втором вроде должен быть. В крайнем случае по id заказа можно получить id пользователя
попробуйте написать событие и в теле отладить: текущего пользователя, чтобы проверить на момент события прошла ли регистрация; и вывести arFields т.е. приходит ли телефон