
Добрый день! Итак, есть задача: реализовать возможность пользователю интернет-магазина, в случае если товара в данный момент нет, оставить заявку на то, чтобы при появлении товара, ему пришло сообщение по почте с соответствующим текстом.
Первое что мы сделаем, это добавим к товарам свойство, сигнализирующее об отсутствии товара (если есть синхронизация с 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). На вкладке «Настройки –> Инструменты –> Агенты» должна появиться примерно такая строчка:
Ну вот и все осталось только все это красиво оформить. Узнать о всех стандартных функциях движка можно в официальной документации для разработчиков, которую можно скачать на сайте Битрикса.
Если что то непонятно пишите, отвечу
Подскажите пожалуйста, что такое «26″ в функции CEvent::SendImmediate(«REMINDER», s1, $arEventFields, «N», 26); ?
Здравствуйте, вот:
Идентификатор почтового шаблона по которому будет отправлено письмо.
Если данный параметр не задан, либо равен «», то письма будут отправлены по всем шаблонам привязанным к типу почтового события, идентификатор которого задается в параметре event_type, а также привязанных к сайту(ам) идентификатор которого указан в параметре site.
Необязательный. По умолчанию – «».
Спасибо=)
Отличный пост! Отличный блог!
Теперь покритикую немножко. Вызов CCatalogProduct::GetByIDEx() по хорошему нужно в компоненте (раз уж переделывается) или, лучше, в resul_modifier’е вызывать, а не в template.php. А то, что у Вас вставляется в компонент, лучше вставить в component_epilog, чтобы и компонент не менять и не попасть случайно в кэширемую область (или сказать, что вставлять нужно в блок, где обрабатывается нажатие кнопки добавления в корзину).
Далее во втором блоке кода можно сильно упростить, убрать переменную $log и лишние if’ы. Но это мелочи. А вот в 17 строчке, наверное, должно быть так – $value = $value.»||».$_POST["action"] , а лучше так $value .= «||».$_POST["action"]. Или я туплю?
Сразу видно что вы во всем разобрались. Все что вы написали верно.
а в шаблоне можно достать свойство с помощью
$arResult["PROPERTIES"]["NET"]["VALUE_XML_ID"]
и тогда не нужно делать таких запросов