Напоминание пользователю о появлении товара (Битрикс)

Напоминание пользователю о появлении товара Битрикс

Добрый день! Итак, есть задача: реализовать возможность пользователю интернет-магазина, в случае если товара в данный момент нет, оставить заявку на то, чтобы при появлении товара, ему пришло сообщение по почте с соответствующим текстом.
Первое что мы сделаем, это добавим к товарам свойство, сигнализирующее об отсутствии товара (если есть синхронизация с 1С УТ, то можно оценивать и остатки), и свойство, где будут храниться e-mail пользователей. Добавить свойство можно в разделе «Контент –> Информ.блоки –> Типы информ. блоков –> Каталоги –> *Выбрать свой каталог*» и перейти на вкладку «Свойства».

В результате у нас есть два свойства:

Напоминание пользователю о появлении товара Битрикс

Далее добавляем следующий код в шаблон компонента, отвечающего за вывод детальной информации о товаре (у меня это: /bitrix /components /bitrix /catalog_custom /templates /properties_custom /bitrix /catalog.element /.default /template.php)

<?
// Получаем соответствующее свойство товара
$ar_res = CCatalogProduct::GetByIDEx($arResult["ID"]);
$ar_res = $ar_res["PROPERTIES"]["NET"]["VALUE_XML_ID"];
?>

<?if($ar_res == "1"):?>
    Введите свой e-mail и мы сообщим Вам о появлении товара:<br />
   <input type="hidden" name="<?echo $arParams["ACTION_VARIABLE"]?>" value="REMINDER">
   <input type="hidden" name="<?echo $arParams["PRODUCT_ID_VARIABLE"]?>" value="<?echo $arResult["ID"]?>">
   <input type="hidden" name="IBLOCK_ID" value="<?echo $arResult["IBLOCK_ID"]?>">
   <input type="text" name="<?echo $arParams["ACTION_VARIABLE"]?>" size="15">
   <input type="submit" name="<?echo $arParams["ACTION_VARIABLE"]."ADD2REMINDER"?>" value="Напомнить">
<?endif;?>

При нажатии на кнопку «Напомнить» на сервер отправится информация о товаре. Далее в сам компонент добавим:

// Здесь мы обновляем свойство "Napomnitb" у товара
if ($_POST["actionADD2REMINDER"] == "Напомнить" and $_POST["action"] != "")
 {
   // Получаем значение свойства элемента
   $db_props = CIBlockElement::GetProperty($_POST["IBLOCK_ID"], $_POST["id"], array("sort" => "asc"), Array("CODE"=>"Napomnitb"));

   $value = "";
   $log = 0;
   if($ar_props = $db_props->Fetch())
           {
             $value = $ar_props["VALUE"]["TEXT"];
             $log = 1;
           }

   if ($log != 0)
     {
       $value = $value.$_POST["action"]."||";
     }

   CIBlockElement::SetPropertyValues($_POST["id"], $_POST["IBLOCK_ID"], array("VALUE"=>array("TEXT"=>$value, "TYPE"=>"html")), "Napomnitb");
 }

В свойство «Napomnitb» мы заносим «мэйлы» пользователя по принципу «123@mail.ru||321@mail.ru».

В административном разделе добавим новый тип почтового события:

Напоминание пользователю о появлении товара Битрикс

Там же создаем новый почтовый шаблон, как показано на картинке:

Напоминание пользователю о появлении товара Битрикс

Осталось написать функцию, которая бы отправляла сообщение пользователю. Для этого в файл «/bitrix/php_interface/init.php» (если нет, создать) добавим код:

function Send_reminder()
{
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/iblock/include.php");

 // Выбираем товары, у которых свойство "Napomnitb" заполнено и свойство "NET" отрицательно
  $arFilter = Array(
       "ACTIVE"=>"Y",
       "!%PROPERTY_NET_VALUE"=> "Да",
       "!PROPERTY_Napomnitb"=> false
        );

$res = CIBlockElement::GetList(Array("SORT"=>"ASC", "PROPERTY_PRIORITY"=>"ASC"), $arFilter);

while($ar_fields = $res->GetNext())
    {
      // Далее "пробегаем" по всем таким товарам
       $db_props = CIBlockElement::GetProperty($ar_fields["IBLOCK_ID"], $ar_fields["ID"], array("sort" => "asc"), Array("CODE"=>"Napomnitb"));

        if($ar_props = $db_props->Fetch())
           {
             $tok = strtok($ar_props["VALUE"]["TEXT"], "||");
                   $i = 0;
                   while ($tok)
                          {
                           // В массив $rez сохраняем мэйлы
                           $rez[$i] = $tok;
                           $i = $i +1;
                           $tok = strtok("||");
                          }
           }

    // Формируем нужные переменные для почтовых событий
    for ($i = 0; $i < count($rez); $i++)
     {
       $arEventFields = array(
         "EMAIL"        => $rez[$i],
         "PRODUCT"      => $ar_fields["NAME"],
         "LINK"         => $ar_fields["DETAIL_PAGE_URL"],
       );

       // Отправляем сообщение
       CEvent::SendImmediate("REMINDER", s1, $arEventFields, "N", 26);
     }

      // Обнуляем свойство "Napomnitb"
       $value = "";
       CIBlockElement::SetPropertyValues($ar_fields["ID"], $ar_fields["IBLOCK_ID"], array("VALUE"=>array("TEXT"=>$value, "TYPE"=>"html")), "Napomnitb");
    }

   return "Send_reminder();";
}

Так же следует зарегистрировать эту функцию-агент (функция CAgent::AddAgent). На вкладке «Настройки –> Инструменты –> Агенты» должна появиться примерно такая строчка:

Напоминание пользователю о появлении товара Битрикс

Ну вот и все :-) осталось только все это красиво оформить. Узнать о всех стандартных функциях движка можно в официальной документации для разработчиков, которую можно скачать на сайте Битрикса.

Похожие посты:
  • Отправка письма пользователю при смене статуса заказа (Битрикс)
  • Отправка письма на почту пользователю при оформлении нового заказа (Битрикс)
  • Анимация при добавлении товара в корзину
  • Самостоятельное присвоение аффилиатов к заказам (Битрикс)
  • Вывод на экран содержимого переменной (Битрикс).
  • 7 комментариев: Напоминание пользователю о появлении товара (Битрикс)

    1. Лаврушин Алексей

      Если что то непонятно пишите, отвечу

      • Алекс

        Подскажите пожалуйста, что такое «26″ в функции CEvent::SendImmediate(«REMINDER», s1, $arEventFields, «N», 26); ?

        • Лаврушин Алексей

          Здравствуйте, вот:

          Идентификатор почтового шаблона по которому будет отправлено письмо.
          Если данный параметр не задан, либо равен «», то письма будут отправлены по всем шаблонам привязанным к типу почтового события, идентификатор которого задается в параметре event_type, а также привязанных к сайту(ам) идентификатор которого указан в параметре site.
          Необязательный. По умолчанию – «».

    2. Отличный пост! Отличный блог!

      Теперь покритикую немножко. Вызов CCatalogProduct::GetByIDEx() по хорошему нужно в компоненте (раз уж переделывается) или, лучше, в resul_modifier’е вызывать, а не в template.php. А то, что у Вас вставляется в компонент, лучше вставить в component_epilog, чтобы и компонент не менять и не попасть случайно в кэширемую область (или сказать, что вставлять нужно в блок, где обрабатывается нажатие кнопки добавления в корзину).

      Далее во втором блоке кода можно сильно упростить, убрать переменную $log и лишние if’ы. Но это мелочи. А вот в 17 строчке, наверное, должно быть так – $value = $value.»||».$_POST["action"] , а лучше так $value .= «||».$_POST["action"]. Или я туплю?

      • Лаврушин Алексей

        Сразу видно что вы во всем разобрались. Все что вы написали верно.

    3. а в шаблоне можно достать свойство с помощью
      $arResult["PROPERTIES"]["NET"]["VALUE_XML_ID"]

      и тогда не нужно делать таких запросов

    Добавить комментарий:

    Подтвердите, что Вы не бот — выберите человечка с поднятой рукой: