Налаштування відстеження ціни товара користувачем 1С-Bitrix
Відстеження ціни — це коли користувач натискає «Повідомити про зниження» та йде. Через тиждень ціна впала — він отримує лист. Функціонал несмислено складний за логікою, але вимагає трьох елементів: сховища підписок, UI на сторінці товара та механізму порівняння цін. У стандартному Bitrix цього немає — збирається з кількох модулів.
Таблиця підписок
Створіть таблицю bl_price_tracker через \Bitrix\Main\ORM\Data\DataManager:
class PriceTrackerTable extends \Bitrix\Main\ORM\Data\DataManager
{
public static function getTableName(): string { return 'bl_price_tracker'; }
public static function getMap(): array {
return [
new \Bitrix\Main\ORM\Fields\IntegerField('ID', ['primary' => true, 'autocomplete' => true]),
new \Bitrix\Main\ORM\Fields\IntegerField('USER_ID'),
new \Bitrix\Main\ORM\Fields\StringField('EMAIL'),
new \Bitrix\Main\ORM\Fields\IntegerField('PRODUCT_ID'),
new \Bitrix\Main\ORM\Fields\FloatField('PRICE_AT_SUBSCRIBE'),
new \Bitrix\Main\ORM\Fields\FloatField('TARGET_PRICE'), // NULL = будь-яке зниження
new \Bitrix\Main\ORM\Fields\DatetimeField('CREATED_AT'),
new \Bitrix\Main\ORM\Fields\DatetimeField('NOTIFIED_AT'),
new \Bitrix\Main\ORM\Fields\StringField('STATUS'), // active, notified, cancelled
];
}
}
Індекси: унікальний на (USER_ID, PRODUCT_ID) — один користувач не може підписатися на один товар двічі.
UI на сторінці товара
У шаблоні компонента bitrix:catalog.element (файл template.php) додайте кнопку:
if ($USER->IsAuthorized()) {
$isTracking = PriceTrackerTable::getRow([
'filter' => ['USER_ID' => $USER->GetID(), 'PRODUCT_ID' => $arResult['ID'], 'STATUS' => 'active'],
]);
echo $isTracking
? '<button class="btn-untrack" data-id="'.$arResult['ID'].'">Відстежується ✓</button>'
: '<button class="btn-track" data-id="'.$arResult['ID'].'">Стежити за ціною</button>';
}
AJAX-обробник додає або видаляє рядок в bl_price_tracker. Записуйте PRICE_AT_SUBSCRIBE — поточну ціну на момент підписки. Без цього неможливо визначити, стала ли нова ціна нижче.
Перевірка снижень
Агент запускається раз на годину. Логіка:
- Беремо всі активні підписки з
bl_price_trackerзіSTATUS = active - Для кожного
PRODUCT_IDотримуємо поточну ціну через\Bitrix\Catalog\PriceTable::getRow(['filter' => ['PRODUCT_ID' => $id, 'CATALOG_GROUP_ID' => 1]]) - Порівнюємо з
PRICE_AT_SUBSCRIBE: якщо нова ціна < старої — відправляємо сповіщення - Оновлюємо
STATUS = notifiedтаNOTIFIED_AT = NOW()
При бажанні знову активувати підписку після сповіщення — переводимо в active після N днів: додайте в агент логіку reactivation для записів, де NOTIFIED_AT < NOW() - INTERVAL '30 days'.
Сторінка «Мої відстеження»
У особистому кабінеті користувача додайте розділ зі списком відстежуваних товарів. Компонент читає bl_price_tracker за USER_ID та JOIN'ить дані товара з b_iblock_element. Показуйте: назву товара, ціну при підписці, поточну ціну, дату підписки. Кнопка «Скасувати» змінює STATUS на cancelled.
Що налаштовуємо
- ORM-клас
PriceTrackerTableта міграцію DDL для таблиціbl_price_tracker - AJAX-контролер підписки/відписки з перевіркою авторизації
- Кнопку в шаблоні
catalog.elementз динамічним станом - Агент порівняння цін та відправки сповіщень
- Сторінку «Мої відстеження» в особистому кабінеті







