Во-первых, логично отправлять письмо пользователю в случае ИЗМЕНЕНИЯ цены, а не просто ее обновления. Еще логичней отправлять, если цена снизилась, а не просто изменилась. Для этого вам надо иметь значение цены ДО обновления и ПОСЛЕ обновления. А уже потом цену до и после сравнивать, если уменьшилась, то отправляем письмо. То же самое с наличием. Пользователю пофигу, что товара было 30 на складе, а потом стало 40. Логично, что пользователю интересен товар, которого не было в наличии, а потом появился. Поэтому тот же принцип - сначала проверяем остаток ДО, потом ПОСЛЕ и сравниваем, если до было = 0, а после стало >0, тогда отправляем пользователю письмо. Теперь реализация.[CODE]AddEventHandler("catalog", "OnBeforePriceUpdate", "CheckPriceBeforeSend"); // Найдем изначальную цену
AddEventHandler("catalog", "OnPriceUpdate", "SendAfterCheck"); // Проверим изменение количества и цены, отправим письма[/CODE]
Существует несколько вариантов, как передать предыдущие параметры до изменения в функцию после изменения цены/количества. Самый простой мне показался через константы. Как вариант, можно передавать через глобальные переменные.[CODE] function CheckPriceBeforeSend (&$id) {
CModule::IncludeModule("catalog");
$price = CPrice::GetByID($id);
define("OLD_PRICE_".$id, $price['PRICE']);
define("OLD_CURRENCY_".$id, $price['CURRENCY']);
} [/CODE]Ну и после сохранения изменений проверяем выполнение условий, если тру, то отправляем почтовое событие.
[CODE] function SendAfterCheck (&$id) { $new_price = CPrice::GetByID($id); $all_const = get_defined_constants(); $price = $all_const['OLD_PRICE_'.$id]; if ($price!=$new_price['PRICE']) { // цена изменилась CModule::IncludeModule("iblock"); $rsEl = CIBlockElement::GetByID($new_price['PRODUCT_ID']); $item = $rsEl->Fetch(); $rs = CUser::GetList($by="", $order="", array( 'UF_PRICE_ALERT'=>$item['ID'] ), array('SELECT'=>array("UF_PRICE_ALERT")) ); // Перебираем всех найденных пользователей while ($customer = $rs->GetNext()) { if (in_array($item['ID'], $customer['UF_PRICE_ALERT']) AND $price>$new_price['PRICE']) { CEvent::Send("PRODUCT_PRICE_CHANGE", $item['LID'], array( 'EMAIL' => $customer['EMAIL'], 'USER_NAME' => $customer['NAME'], 'ITEM_NAME' => $item['NAME'], 'ITEM_LINK' => $item['DETAIL_PAGE_URL'],
'ITEM_NEW_PRICE' => $new_price['PRICE'],
'ITEM_OLD_PRICE' => $price,
), "N"); } } } } [/CODE]Поясню еще по коду. UF_PRICE_ALERT - это пользовательское поле пользователя, множественное целое число. Для каждого пользователя в нем хранится список ID товаров, на которые он подписался. PRODUCT_PRICE_CHANGE - код почтового события, ну там шаблоны писем, все дела.