“За ценой следить — желанный товар купить”. Создаем нужный функционал для интернет-магазина на 1С-Битрикс

20 Августа 2020

следующая статья
Оксана Сорока

Back End Developer

Оксана Сорока
“За ценой следить — желанный товар купить”. Создаем нужный функционал для интернет-магазина на 1С-Битрикс

Довольно часто “гуляя” по просторам Вашего интернет-магазина, покупатель наталкивается на действительно понравившийся ему товар, но... По какой-то причине именно сейчас купить его он не решается. Возможно, цена на данную вещь кажется ему слишком высокой, возможно, побеждает желание “походить и посмотреть еще”, а возможно у него возникают десятки других причин, по которым так или иначе покупка откладывается. И Ваш интернет-магазин покидается безвозвратно. Конечно, Вы можете предполагать, что если вещь клиенту действительно понравилась, то он сможет добавить страничку магазина в закладки. Но, как показывает практика, чаще случается так, что посетитель сайта просто закрывает ее: то ли по невнимательности, то ли решив, что при случае ему не составит труда найти ее снова. 

Удержать любой ценой

Наверняка Вы согласитесь с тем, что терять таких вот потенциальных покупателей, это просто непозволительная роскошь. А потому необходимо всеми возможными способами напомнить о себе, вернуть клиента на сайт и убедить его все-таки осуществить покупку! Ну а что может привлечь внимание нерешительного покупателя лучше, чем горячая скидка на понравившийся ему ранее товар? Правильно, ничего! Как же клиент узнает о том, что на понравившийся ему товар действует скидка? Ответ прост: с помощью простого, но в то же время довольно действенного в данном случае функционала “Следить за ценой”.

Что же из себя представляет данный функционал? Как правило, это небольшая и имеющая характерный дизайн кнопка на карточке детального просмотра товара, при нажатии на которую на экране появляется соответствующая форма и клиенту предлагается ввести туда свое имя и адрес электронной почты (если же вам удобно отсылать клиенту уведомления на телефон, то номер мобильного телефона). В дальнейшем же, если цена даный на товар станет меньше, той, которая была действительна на момент “подписки”, клиенту автоматически отсылается письмо с характерным заголовком “Цена на интересующий вас товар снижена!”, “Спешите купить!” и т. д. Как показывает практика, это отличный способ напомнить о себе, проявить внимание и заботу о клиенте и в конечном итоге, возможно, убедить его купить товар. 

Составляющие функционала

Вроде все просто и довольно понятно, но, к сожалению, стандартными средствами БУСа такое вот отслеживание и сравнение цен “от А до Я” вам сделать не удастся. Тем не менее, реализовать это все равно не сложно и ниже я расскажу, как это сделать. 

В первую очередь вам нужна кнопка c характерным названием “Следить за ценой”, которую следует разместить на странице того или иного товара, то есть в файле template.php шаблона компонента, отвечающего за вывод детальной информации по элементу каталога — catalog.element. Где конкретно она будет располагаться и как будет выглядеть, полностью зависит от дизайна вашего интернет-магазина и, собственно, от вашей фантазии (примеры сайтов, где есть такая кнопка:  

1.png

Форма, с помощью которой можно осуществить подписку на наблюдение за стоимостью того или иного товара, изначально должна быть скрыта и появляется только тогда, когда клиент нажмет на заветную кнопку “Следить за ценой”. Я не буду заострять внимание на том, как сделать подобное всплывающее окно с формой, ведь сейчас для этого существует огромное количество довольно простых в применении плагинов (могу лишь порекомендовать один из них — удобный, как по мне, jQuery-плагин fancyBox, скачать который вы сможете здесь http://fancyapps.com/fancybox/). Вместо этого я лучше расскажу подробнее о том, каким компонентом Битрикс лучше воспользоваться в данном случае. Вариантов есть несколько. Например, для хранения данных о клиенте и понравившемся ему товаре вы можете создать отдельный Информационный блок, запись в который будет осуществляться с помощью стандартного компонента iblock.element.add.form (данный компонент осуществляет непосредственный вывод формы создания и редактирования элемента указанного информационного блока) или же реализовать такую форму с помощью компонента main.feedback, но в таком случае вам придется собственноручно прописывать код, отвечающий за сохранение введенных клиентом данных все в том же Инфоблоке или, к примеру, в Highload блоке, который куда больше подходит для хранения подобной информации. Я же для реализации данного функционала воспользовалась одним из компонентов модуля Веб-формы - form.result.new, служащим непосредственно для вывода формы и добавления результата, и потому расскажу о нем подробнее. 

Создается новая веб-форма, поля которой мы будем выводить, а результаты заполнения которой — сохранять, в разделе Сервисы вкладки Администрирование. 

2.png

Перейдя на вкладку “Настройка форм” и нажав кнопку “Создать”, на экране у вас появится окно для создания новой веб-формы, где вы сможете указать ее название, создать необходимые для заполнения поля и задать определенные настройки: например, включить/выключить использование Captcha для предотвращения заполнения формы роботами, ограничить возможность заполнения формы теми или иными пользователями и т. д (подробнее о создании и редактировании веб форм вы сможете прочесть здесь https://dev.1c-bitrix.ru/user_help/service/form/form_edit.php). Поскольку помимо информации о клиенте для правильной работы функционала нам нужна еще и информация об интересующем его товаре, наша форма будет иметь следующие поля: 

  • Имя клиента (можно, конечно, и упустить данное поле, но, согласитесь, обращение по имени в рассылке выглядит куда симпатичнее);

  • Email клиента (на него мы и будем в дальнейшем отправлять письмо);

  • ID товара (данное поле мы скроем и именно оно будет служить нашей привязкой к товару);

  • Цена товара (еще одно скрытое поле, которые в дальнейшем позволит нам сравнивать актуальную цену товара с ценой на момент подписки);

  • Ссылка на товар (данное поле я также сделала скрытым, создавать его не обязательно, но в письме, которое будет затем отправлено пользователю, гораздо лучше будет смотрется ссылка именно на конкретный понравившийся ему товар, а не просто на интернет — магазин в целом).

Разместить вызов компонента form.result.new вы можете либо опять таки в шаблоне компонента catalog.element, либо на странице element.php комплексного компонента catalog. Пример вызова form.result.new можно посмотреть здесь https://dev.1c-bitrix.ru/user_help/components/services/web_forms/form_result_new.php. Чрезвычайно важным при вызове данного компонента является параметр "WEB_FORM_ID", которым передается идентификатор созданной нами веб-формы остальные же параметры в нашем конкретном случае являются либо вовсе необязательными (например, такие как "LIST_URL", "EDIT_URL"),  либо заполняются исходя из ваших требований к работе компонента. Также для правильной работы функционала в качестве одного из параметров следует передать идентификатор  просматриваемого товара (ID). Если вы разместили вызов form.result.new на странице element.php комплексного компонента catalog, то обратите внимание на то, что на той же странице ID элемента возвращается при включении компонента bitrix:catalog.element (в файле element.php есть такая строка $elementID = $APPLICATION->IncludeComponent("bitrix:catalog.element",...);, где $elementID - как раз то, что нам нужно передать). Если же вызов form.result.new размещен у вас в шаблоне компонента catalog.element, взять ID вы сможете из массива $arResult ($arResult["ID"]).

3.png

Далее копируем шаблон компонента form.result.new для того, чтобы внести изменения в верстку (при необходимости) и передать нужные значения в поля, касающиеся информации о выбранном клиентом товаре. Кастомизировать данный шаблон довольно просто. Главное при этом знать, что: 

  • вместо открывающего и закрывающего тега <form> мы оборачиваем нашу форму в $arResult["FORM_HEADER"] и $arResult["FORM_FOOTER"];

  • информация о вопросах веб-формы хранится в массиве $arResult["QUESTIONS"];

  • в стандартном шаблоне компонента простое текстовое поле для вопроса имеет такой вид: <input type="text"  class="inputtext"  name="form_text_*ID_вопроса*" value="" size="0" />;

  • кнопка от отправки формы хранится в $arResult["SUBMIT_BUTTON"] и изначально имеет такой вид: <input  type="submit" name="web_form_submit" value="*Ваш текст для кнопки заданный в настройках формы*" />.

Атрибут “value” у полей формы, как мы можем видеть, является пустым, так как он заполняется непосредственно пользователем при вводе данных. Тем не менее,  это правило не касается тех полей формы, которые мы изначально создали для передачи нужной нам в дальнейшем информации о товаре. Во первых, чтобы скрыть такие поля от глаз пользователя, для них нужно прописать атрибут “hidden”, а во-вторых,  нам нужно вручную прописать им определенный атрибут “value”. Так как ID товара, которым заинтересовался пользователь, мы еще при вызове передавали в параметрах компонента, в “value” соответствующего поля мы поместим следующее: value="<?=$arParams["PRODUCT_ID"];?>". Далее нам необходимо сгенерировать ссылку на указанный товар, чтобы также передать ее в “value” соответствующего скрытого поля. Сгенерировать ссылку можно, к примеру, таким образом: $arResult["PRODUCT_LINK"] = (CMain::IsHTTPS() ? "https://" : "https://") . SITE_SERVER_NAME . $APPLICATION->GetCurPage(false) (где SITE_SERVER_NAME  — это константа, которая берется из поля “URL  сервера” в настройках текущего сайта). 

Что касается цены товара, то ее, к примеру, можно передать при вызове form.result.new (взяв из массива $arResult компонента bitrix:catalog.element подобно ID). Также узнать цену можно с помощью одного из перечисленных в документации методов  Битрикс, передавая в качестве параметра уже известное нам ID. Я изначально решила найти оптимальный для определения цены товара метод, так как в дальнейшем он в любом случае понадобится нам для написания скрипта, определяющего текущую цену товара и сравнивающего ее с ценой на момент подписки. Так как в Битриксе уменьшить цену на товар можно не только путем непосредственного изменения ее в Торговом каталоге вручную, а и с помощью возможностей раздела “Торговый маркетинг” (путем создания маркетинговых акций, правил работы с корзиной и скидок), нужна была универсальная функция, учитывающая все эти тонкости и безошибочно определяющая  конечную стоимость того или иного товара. И для этого я использовала  такую:

4.png

Таким образом в качестве атрибута “value” для поля, отвечающего за цену товара, я передаю результат выполнения указанной выше функции, а именно: $arResult["PRODUCT_PRICE"] = getFinalPrice($arParams["PRODUCT_ID"]). 

После того как пользователь заполнит получившуюся форму:

5.png

И нажмет кнопку, подтверждающую ее отправку,  результаты, отправленные им, будут доступны здесь:

6.png

Самая важная часть

Ну и теперь мы подошли к самому главному вопросу: каким же образом на сайте будет отслеживаться изменение цены на интересующий пользователя товар? Для этого мы напишем скрипт, который будет выполнять следующие действия: 

  • сначала с помощью метода CForm::GetResultAnswerArray() мы делаем выборку всех результатов, заполнения нашей веб формы;

  • затем, перебирая полученные результаты, мы берем указанные в них ID товаров и с помощью уже известной нам функции getFinalPrice() определяем, каковой является их цена на данный момент;

  • сравниваем полученную цену с той, которая записана у нас в форму на момент подписки, и если окажется, что она стала меньше, то с помощью метода CEvent::Send() инициируем отправку сообщения пользователю об этом на email,  указанный ним;

  • также, чтобы предотвратить повторную отправку точно такого же сообщения, меняем устаревшую цену в текущем результате веб-формы на актуальную;

  • следует также учесть, что если в результате выполнения функции getFinalPrice() нам приходит пустой ответ, можно сделать вывод о том, что товар с таким ID более недоступен на сайте, а потому запись с подпиской на него следует удалить. 

В целом выглядит все примерно так:

7.png

Для того же, чтобы наше сравнение происходило регулярно, мы воспользуемся планировщиком задач Cron (системой для автоматического запуска программ и скриптов на сервере в определённое время) и зададим периодичность, с которой будет выполнятся наш скрипт. Вот, к примеру, команда прописывающая выполнение скрипта каждые 5 часов 

8.png

О “письме счастья”

И напоследок пару слов собственно о письме, которое должен получить потенциальный покупатель в случае снижения цены. Для того чтобы инициировать почтовое событие с помощью функции CEvent::Send() в первую очередь его нужно создать. Для этого нужно перейти в Администрирование → Настройки → Настройки продукта → Почтовые события → Типы почтовых событий → Добавить тип. 

9.png

Далее создаем подходящий почтовый шаблон для этого типа почтового события (Администрирование → Настройки → Настройки продукта → Почтовые события → Почтовые шаблоны → Добавить шаблон).

10.png

Важно при создании данного почтового шаблона в “Типе почтового события” указать нужный нам тип FOLLOW_PRICE.

Вот и все! Таким образом у вас на сайте появится довольно простой, незамысловатый, но в  то же время очень полезный функционал, способный вернуть вашему интернет-магазину некоторую долю покупателей.


Похожие статьи

Записаться на консультацию

Мы свяжемся с вами в течении 10 минут