В проекте несколько разных служб доставки посылок объединены в одну. Мне нужно сделать изменение цены в зависимости от адреса. Проект начинал не я. Предыдущий программист непонятной квалификации частично поменял исходники движка не переместив их в свое пространство имен. Писалось все на Управлении сайтом версии 11.0.3. Начальство отказало в обновлении, объяснив это необходимостью переделывать часть кода, а времени нет и сдавать уже совсем скоро.
Для начала написал вот такой код:
| Цитата |
|---|
AddEventHandler("sale", "OnOrderUpdate", Array("DPE", "DeliveryPriceEdit" ;) );
class DPE { function DeliveryPriceEdit($ID, $arFields) { CModule::IncludeModule('main'); CModule::IncludeModule('sale'); CModule::IncludeModule('iblock'); $fp = fopen($_SERVER["DOCUMENT_ROOT"]."/tmp.txt", 'w+'); $result = CSaleOrderProps::GetByID($ID); fwrite($fp, print_r($result, true)); } }; |
В текстовом файле пусто, хотя событие срабатывает.
Пробовал изменять цену доставки перед добавлением через OnBeforeOrderAdd и $arFields["CALLBACK_FUNC"] = "N", но в итоге общую стоимость заказа по старой цене доставки и другую цену в параметрах заказа.
Потом решил сделать велосипедище. По событию OnOrderUpdate заношу в инфоблок элемент с названием из ID заказа. Потом по событию создания элемента инфоблока собирался извлекать и изменять параметры заказа:
| Цитата |
|---|
AddEventHandler("sale", "OnOrderUpdate", Array("DPE", "DeliveryPriceEdit" ;) );
class DPE { function DeliveryPriceEdit($ID, $arFields) // PRICE_DELIVERY - OnOrderUpdate { CModule::IncludeModule('main'); CModule::IncludeModule('sale'); CModule::IncludeModule('iblock'); $blockClass = new CIBlockElement; $res = $blockClass->Add(array("NAME"=>$ID, "IBLOCK_ID"=>25), false, false, false); } };
AddEventHandler("iblock", "OnAfterIBlockElementAdd", Array("BUF", "Edit" ;) );
class BUF { function Edit(&$arFields) { $ID = intVal($arFields["NAME"] ;) ; $fp = fopen($_SERVER["DOCUMENT_ROOT"]."/tmp.txt", 'w+'); fwrite($fp, $ID."\n" ;) ; $prop = new CSaleOrderPropsValue; $result = $prop->GetByID($ID); fwrite($fp, print_r($result, true)); $blockClass = new CIBlockElement; $res = $blockClass->Delete($ID); } } |
Но в итоге имеет так же пустой текстовый файл, хотя на статической странице по известному ID можем получить все параметры.
Я вообще без понятия что делать. Проект в итоге затянулся надолго, но руководство не дает обновить Битрикс. Проект уже в кошмарах сниться, т.к. кроме этой проблемы было еще множество, которые были решены через еще кучу велосипедов.