
Добавление подписки на товар через API в Bitrix
При разработке интернет-магазинов на Bitrix часто возникает необходимость программно добавлять подписки на уведомления о поступлении товаров. К сожалению, в официальной документации примеры такого функционала практически отсутствуют. В этой статье мы рассмотрим, как реализовать добавление подписки на товар через API Bitrix.
Основной код
Для работы с подписками в Bitrix используется класс SubscribeManager
из модуля catalog
. Вот базовый пример добавления подписки:
<?php
use Bitrix\Main\Loader;
// Подключаем необходимый модуль
if (!Loader::includeModule('catalog')) {
return;
}
// Создаем экземпляр менеджера подписок
$subscribeManager = new \Bitrix\Catalog\Product\SubscribeManager();
// Определяем тип контакта (по умолчанию - email)
$defaultContactTypeId = \Bitrix\Catalog\SubscribeTable::CONTACT_TYPE_EMAIL;
// Подготавливаем данные для подписки
$subscribeData = array(
'USER_CONTACT' => 'pozitiff@mail.ru', // Email пользователя
'ITEM_ID' => 79354, // ID товара
'SITE_ID' => 's1', // ID сайта
'CONTACT_TYPE' => $defaultContactTypeId, // Тип контакта
);
// Добавляем подписку
$subscribeId = $subscribeManager->addSubscribe($subscribeData);
if ($subscribeId > 0) {
echo "Подписка успешно добавлена. ID: " . $subscribeId;
} else {
echo "Ошибка при добавлении подписки";
}
Описание параметров
Обязательные параметры:
- USER_CONTACT – контактные данные пользователя (email или телефон)
- ITEM_ID – идентификатор товара, на который оформляется подписка
- SITE_ID – идентификатор сайта
- CONTACT_TYPE – тип контакта
Типы контактов:
// Email (по умолчанию)
\Bitrix\Catalog\SubscribeTable::CONTACT_TYPE_EMAIL
// Телефон
\Bitrix\Catalog\SubscribeTable::CONTACT_TYPE_PHONE
Расширенный пример с проверками
Для более надежной работы рекомендуется добавить дополнительные проверки:
<?php
use Bitrix\Main\Loader;
use Bitrix\Catalog\Product\SubscribeManager;
use Bitrix\Catalog\SubscribeTable;
if (!Loader::includeModule('catalog')) {
throw new Exception('Модуль catalog не подключен');
}
function addProductSubscription($email, $productId, $siteId = SITE_ID) {
// Валидация email
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return array('success' => false, 'error' => 'Некорректный email');
}
// Проверяем существование товара
if (!\Bitrix\Catalog\ProductTable::getById($productId)->fetch()) {
return array('success' => false, 'error' => 'Товар не найден');
}
$subscribeManager = new SubscribeManager();
$subscribeData = array(
'USER_CONTACT' => trim($email),
'ITEM_ID' => intval($productId),
'SITE_ID' => $siteId,
'CONTACT_TYPE' => SubscribeTable::CONTACT_TYPE_EMAIL,
);
$subscribeId = $subscribeManager->addSubscribe($subscribeData);
if ($subscribeId > 0) {
return array(
'success' => true,
'subscribeId' => $subscribeId,
'message' => 'Подписка успешно оформлена'
);
} else {
return array('success' => false, 'error' => 'Ошибка при добавлении подписки');
}
}
// Пример использования
$result = addProductSubscription('user@example.com', 79354, 's1');
if ($result['success']) {
echo $result['message'];
} else {
echo 'Ошибка: ' . $result['error'];
}
Дополнительные возможности
Проверка существующих подписок
Перед добавлением новой подписки можно проверить, не существует ли уже подписка для данного пользователя:
$existingSubscribe = \Bitrix\Catalog\SubscribeTable::getList(array(
'filter' => array(
'USER_CONTACT' => $email,
'ITEM_ID' => $productId,
'SITE_ID' => $siteId
),
'limit' => 1
))->fetch();
if ($existingSubscribe) {
echo "Подписка уже существует";
} else {
// Добавляем новую подписку
}
Добавление подписки для авторизованного пользователя
Если пользователь авторизован, можно добавить его ID в данные подписки:
global $USER;
$subscribeData = array(
'USER_CONTACT' => $email,
'ITEM_ID' => $productId,
'SITE_ID' => $siteId,
'CONTACT_TYPE' => SubscribeTable::CONTACT_TYPE_EMAIL,
'USER_ID' => $USER->IsAuthorized() ? $USER->GetID() : null,
);
Заключение
Использование SubscribeManager
позволяет легко интегрировать функционал подписок на товары в ваши проекты на Bitrix. Данный подход особенно полезен при создании кастомных форм подписки или интеграции с внешними системами.
Помните о необходимости валидации входных данных и обработки ошибок для обеспечения стабильной работы системы подписок.