Битрикс - всплывающее окно с промокодом и отправкой по почте
Последние записи
Определим что:
1. ip будут лежать в отдельном HL блоке. Его структура:
Поле: Строка
Код: UF_USER_IP
Поле: Да/Нет
Код: UF_USER_SUBSCRIBE_Y
По умолчанию: нет
Поле: Дата со временем
Код: UF_POPUPSOW
По умолчанию: текущее время
2. Настройки будут лежать в отдельном ИБ c type=preferences и id=IB_SETTINGS
У ИБ будет одно пользовательское свойство: Значение
Тип: Строка
Code: VAL
3. Создадим в ИБ новый раздел: "Настройки попапа с промо" и запомним его id.
4. Добавим настройки:
Текст в информационном окне подписки: Добро пожаловать
Показывать попап каждый n дней: 3
Попап активен: Y
Срок действия купона: 3
Код в init.php
/* Определяем нужен ли попап с промокодом в событии PageStart */
require($_SERVER['DOCUMENT_ROOT'].'/local/libs/init/promoCoupon.php');
Листинг promoCoupon.php
<?php
//Если мы в админке
if (defined('ADMIN_SECTION') && (ADMIN_SECTION === true))
return false;
\Bitrix\Main\EventManager::getInstance()->addEventHandlerCompatible(
'main',
'OnPageStart',
'Promo::Start'
);
use Bitrix\Main\Loader,
Bitrix\Highloadblock as HL,
Bitrix\Main\Entity;
use Bitrix\Main\Type\DateTime;
Loader::includeModule("highloadblock");
Loader::IncludeModule('iblock');
class Promo{
function Start()
{
//Объявляем глобальную переменню
global $promoPopup;
//По умолчанию показывать попап не нужно
$promoPopup['ACTIVE'] = 'N';
//Если мы уже осуществляли проверки, то выходим
//if(isset($_SESSION['POPUP_CHECKED'])){return false;}
//Получаем настройки попапа с промокодом
$arSelect = array('ID', 'NAME', 'CODE', 'PREVIEW_TEXT', 'PROPERTY_VAL');
$arFilter = array(
'=IBLOCK_ID' => 14,
'=IBLOCK_TYPE' => 'preferences',
'=IBLOCK_SECTION_ID' => 70,
'=ACTIVE' => 'Y',
'=ID' => array(2509, 2510, 2511, 2512),
);
$res = CIBlockElement::GetList(Array(), $arFilter, false, Array(), $arSelect);
//Ищем настройки попапа
while($ob = $res->GetNextElement())
{
$arFields = $ob->GetFields();
$promoPopup[$arFields['ID']]=$arFields;
}
//Получаем ip стандартными методами Битрикс
$ip = \Bitrix\Main\Service\GeoIp\Manager::getRealIp();
//Заполняем массив начальными данными
$data['ID'] = 4;//(UserIPTables,useriptables)
$data['IP'] = $ip;
//Записываем IP пользователя
$promoPopup['IP'] = $ip;
//Проводим дальнейшие вычисления только если в опции стоит галка, что показывать попап нужно
if ($promoPopup[2509]['PROPERTY_VAL_VALUE'] == 'Y') {
//Ищем запись о показе по айпи
$userByIP = isNeedPromoShow ($data);
if($userByIP['UF_USER_SUBSCRIBE_Y']==1){return false;}
if($userByIP['COUNT']<1){
//Если запись о пользователе по ip не найдена
//Ставим галку, что показывать попап нужно
$promoPopup['ACTIVE'] = 'Y';
}else{
//Если запись о пользователе по ip найдена
//То проверяем дату и если она подходит показываем
$date = date("Y-m-d H:i:s");//Текущее время по Москве
$showing = $userByIP['UF_POPUPSOW']->format("Y-m-d H:i:s");
//считаем разницу между датами
$diff = dateDiff($showing, $date);
//Если разница между показанным попапом больше установленной даты для повторного показа
if ($diff['hours'] > ($promoPopup[2510]['PROPERTY_VAL_VALUE'] * 24)) {
//То показываем попап
$promoPopup['ACTIVE'] = 'Y';
}
}
}
$_SESSION['POPUP_CHECKED'] = 'Y';
}
}
//Проверяем нужно ли показывать пользователю попап с промокодом
function isNeedPromoShow($data)
{
$hlblock = HL\HighloadBlockTable::getById($data['ID'])->fetch(); //где ID - id highloadblock блока из которого будем получать данные
$entity = HL\HighloadBlockTable::compileEntity($hlblock);
$entity_data_class = $entity->getDataClass();
$result = array();
$data = $entity_data_class::getList(array(
"select" => array("*"),
"order" => array("ID" => "DESC"),
"filter" => array(
"UF_USER_IP" => $data['IP'],//Фильтрация выборки по IP
//"!=UF_USER_SUBSCRIBE_Y" => 1 //Если промокод отправлен, то не получаем ничего
)
));
$result['COUNT'] = 0;
while ($arData = $data->Fetch()) {
$result['UF_POPUPSOW'] = $arData['UF_POPUPSOW'];
$result['UF_USER_SUBSCRIBE_Y'] = $arData['UF_USER_SUBSCRIBE_Y'];
if ($arData['UF_USER_SUBSCRIBE_Y'] == 0) {
$result['COUNT']++;
}
}
//Возвращаем все найденные элементы
return $result;
}
//Ставим запись о том что попап просмотрен
function setPromoViewed($data)
{
$hlblock = HL\HighloadBlockTable::getById($data['ID'])->fetch();
$entity = HL\HighloadBlockTable::compileEntity($hlblock);
$entity_data_class = $entity->getDataClass();
$date = new \Bitrix\Main\Type\DateTime(date("d.m.Y H:i:s"));
//Массив добавляемых параметров
$arFields = array(
'UF_USER_IP' => $data['IP'],
//'UF_USER_SUBSCRIBE_Y' => 1,
'UF_POPUPSOW' => $date,
);
$el = checkIsIPSaved($data);
if ($el > 0) {
//Если ip записан, то обновляем запись
$r = $entity_data_class::update($el, $arFields);
} else {
//Если ip не записан, то добавляем запись
$result = $entity_data_class::add($arFields);
if ($result->isSuccess()) {
$r = 'Y';
} else {
$r = 'Ошибка: ' . implode(', ', $result->getErrors()) . "";
}
}
return $r;
}
//Ставим запись о том что попап просмотрен
function setPromoSend($data)
{
$hlblock = HL\HighloadBlockTable::getById($data['ID'])->fetch();
$entity = HL\HighloadBlockTable::compileEntity($hlblock);
$entity_data_class = $entity->getDataClass();
$date = new \Bitrix\Main\Type\DateTime(date("d.m.Y H:i:s"));
//Массив добавляемых параметров
$arFields = array(
'UF_USER_IP' => $data['IP'],
'UF_USER_SUBSCRIBE_Y' => 1
);
$el = checkIsIPSaved($data);
if ($el > 0) {
//Если ip записан, то обновляем запись
$r = $entity_data_class::update($el, $arFields);
} else {
//Если ip не записан, то добавляем запись
$result = $entity_data_class::add($arFields);
if ($result->isSuccess()) {
$r = 'Y';
} else {
$r = 'Ошибка: ' . implode(', ', $result->getErrors()) . "";
}
}
return $r;
}
//Проверяем есть ли ip в базе
function checkIsIPSaved($data)
{
$hlblock = HL\HighloadBlockTable::getById($data['ID'])->fetch(); //где ID - id highloadblock блока из которого будем получать данные
$entity = HL\HighloadBlockTable::compileEntity($hlblock);
$entity_data_class = $entity->getDataClass();
$data = $entity_data_class::getList(array(
"select" => array("*"),
"order" => array("ID" => "DESC"),
"filter" => array("UF_USER_IP" => $data['IP']) //Фильтрация выборки
));
$r = 0;
while ($arData = $data->Fetch()) {
$r = $arData['ID'];
}
return $r;
}
//Вычисляем разницу между датами
function dateDiff($date1, $date2)
{
$time = new \DateTime($date1);
$since_time = $time->diff(new \DateTime($date2));
$A['days'] = $since_time->days;
$A['hours'] = $since_time->days * 24 + $since_time->h;
$A['minutes'] = ($since_time->days * 24 * 60) + ($since_time->h * 60) + $since_time->i;
return $A;
}
Листинг /include/libs/sendCoupon.php
<?php
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');
//Подключаем модули
use Bitrix\Main\Application;
use Bitrix\Main\Type\DateTime;
use Bitrix\Main\Web\Cookie;
$result = array('success' => 'N');
if (check_bitrix_sessid() && $_SERVER["REQUEST_METHOD"] == "POST" && !$_POST['MAIL']) {
CModule::IncludeModule("sale");
CModule::IncludeModule("catalog");
CModule::IncludeModule("subscribe");
$RUB_ID = array();
$RUB_LIST = '';
// получим все активные рубрики
$rsRubric = CRubric::GetList(array(), array("ACTIVE" => "Y"));
while ($arRubric = $rsRubric->GetNext()) {
$RUB_ID[] = $arRubric['ID'];
$RUB_LIST .= $arRubric['NAME'] . '/n';
}
/* создадим массив на подписку */
$subscr = new CSubscription;
$arFields = array(
"USER_ID" => $USER,
"FORMAT" => "html/text",
"EMAIL" => htmlspecialchars($_POST['EMAIL']),
"ACTIVE" => "Y",
"RUB_ID" => $RUB_ID,
"SEND_CONFIRM" => "N",
"CONFIRMED" => "Y"
);
$id = $subscr->Add($arFields, SITE_ID);
if ($id > 0) {
global $promoPopup;
//Генерируем новый купон
$coupon = CatalogGenerateCoupon();
//Добавляем новый купон на сайт
$result = \Bitrix\Sale\Internals\DiscountCouponTable::add(array(
"COUPON" => $coupon,
"DISCOUNT_ID" => 123,//ID правила работы с корзиной
"ACTIVE" => "Y",
"TYPE" => \Bitrix\Sale\Internals\DiscountCouponTable::TYPE_ONE_ORDER,
'ACTIVE_FROM' => new \Bitrix\Main\Type\DateTime(date("d.m.Y H:i:s")),
'ACTIVE_TO' => new \Bitrix\Main\Type\DateTime(date("d.m.Y H:i:s", strtotime('+' . $promoPopup[2511]['PROPERTY_VAL_VALUE'] . ' days'))),
//"USER_ID"=>$idUser,
'MAX_USE' => 1
));
//Меняем путь к подтверждению подписки
$arFields = array(
'EMAIL' => htmlspecialchars($_POST['EMAIL']),
'DATE' => date("d.m.Y H:i:s"),
);
if ($result->isSuccess()) {
$arFields['COUPON'] = $coupon;
} else {
//echo $result->getErrorMessages();
$arFields['COUPON'] = 'Во время генерации купона возникла ошибка. Пожалуйста, обратитесь к администрации';
}
//Отправляем письмо с купоном, генерируя событие
CEvent::Send("SENDER_SUBSCRIBE_CONFIRM_COUPON", 's1', $arFields, "N"); //Тип события: Отправка сообщения через новую форму обратной связи
$data = array(
'ID' => 4,
'IP' => $promoPopup['IP']
);
//Устанавливает галочку об успехе отправки купона
setPromoSend($data);
$application = Application::getInstance();
$context = $application->getContext();
$cookie = new Cookie("SUBSCRIBED", 'Y', time() + 3600 * 12 * 360);
$cookie->setDomain($_SERVER['SERVER_NAME']);
$cookie->setHttpOnly(false);
$context->getResponse()->addCookie($cookie);
$context->getResponse()->flush("");
$result = array('success' => 'Y');
} else {
$result = array('success' => 'Exist');
}
}
echo json_encode($result);
Листинг css
.absoluteCenter { display: -webkit-box; display: -moz-box; display: -ms-flexbox; display: -webkit-flex; display: flex; -webkit-box-align: center; -moz-box-align: center; -ms-flex-align: center; -webkit-align-items: center; align-items: center; -webkit-box-pack: center; -moz-box-pack: center; -ms-flex-pack: center; -webkit-justify-content: center; justify-content: center; text-align: center; flex-direction: column}
.js-dClose,svg,.d--Inner a,.d--but {-moz-transition: all 0.5s;-webkit-transition: all 0.5s;-o-transition: all 0.5s;-ms-transition: all 0.5s}
.d--Outer{display: flex;background-color: rgba(0,0,0,0.5);position: fixed;top:0;left:0;width:100%;height:100%;z-index: 1000;}
.d--Inner {background-color: #fff;padding:40px 40px;position: relative;min-width: 320px;max-width: 500px;max-height:90vh;-webkit-box-shadow: 0px 5px 10px 0px rgba(0,0,0,0.2); -moz-box-shadow: 0px 5px 10px 0px rgba(0,0,0,0.2); box-shadow: 0px 5px 10px 0px rgba(0,0,0,0.2);text-align: center;}
.d--Inner h2{font-family: 'OpenSans-Bold',Verdana,sans-serif;font-size: 24px; font-weight: 600;line-height: 32px;margin-bottom:14px;text-align: left}
.d--Inner > div{display: none}
.d--Inner > div.active{display: block}
.js-dClose{position: absolute;right: 15px;top:15px;border-radius: 50%;width: 15px;height:15px;cursor:pointer}
.js-dClose .svgBox{margin-top:3px;}
.js-dClose svg{width: 100%;height:100%;fill:#000;stroke:#000;}
.js-dClose:hover svg{fill:#3d3d3d;stroke:#3d3d3d;}
.d--title{font-family: 'OpenSans', 'OpenSans-Regular';font-size: 16px;font-weight: 600;color:#000;width: 70%;margin: 0 auto}
.d--form{padding-top: 30px}
.d--input{width: 60%;height: 44px;border-radius: 0px;border-style: none;border-width: 1px;border-bottom: 1px solid #ccc;font-family: 'OpenSans', 'OpenSans-Regular';box-sizing: border-box;padding-left: 12px;background-color: white;background-image: none;margin: 0;display: inline-block;outline: 0;color:#000}
.js-coupon-send-form .input-row:nth-child(3){display: none}
.d--submit {margin-top: 40px;text-transform: uppercase}
.d--but {outline: 0;display: inline-block;padding: 0 27px;text-shadow: none;text-decoration: none;background-color: #000000;color: #ffffff;min-width: 110px;height: 44px;line-height: 44px;border-radius: 0;border-style: none;font-family: 'OpenSans-Bold';font-size: 13px;letter-spacing: 2px;}
.d--but:hover {background-color: #ffffff;color: #000000;}
.d--policy {width: 80%;margin: 0 auto;line-height: 18px;margin-top: 30px;font-family: 'OpenSans-Regular',Verdana,sans-serif;}
.d--policy a{text-decoration: none;border-bottom:1px solid transparent}
.d--policy a:hover{text-decoration: none;border-bottom:1px solid #a2a2a2}
.d--bar {position: relative;display: block;width: 60%;margin: 0 auto;}
.d--bar:before, .d--bar:after {content: "";height: 2px;width: 0;bottom: 0;position: absolute;background: #000;transition: 0.2s ease all;-moz-transition: 0.2s ease all;-webkit-transition: 0.2s ease all;}
.d--bar:before {left: 50%;}
.d--bar:after {right: 50%;}
/* active state */
input:focus ~ .d--bar:before,
input:focus ~ .d--bar:after {
width: 50%;
}
.d--row.error .d--bar:before,.d--row.error .d--bar:after{background-color: #ff0000}
.d--row.error .d--input{border-bottom: 1px solid #ff0000}
@media all and (max-width: 545px) {
.d--Inner {min-width: 320px;max-width: 320px;padding: 40px 20px 40px 20px;}
}
Листинг js
/* Проверка на json */
function IsJsonString(str) {
try {
JSON.parse(str);
} catch (e) {
return false;
}
return true;
}
function closeGallery(){
$('.d--Outer').fadeOut(0,function(){
$('.d--Inner .active').removeClass('active');
});
}
function formLoad(formid){
$('.d--Inner').stop();
$('.d--Inner > div:visible').fadeOut(400,function(){
$('.d--Inner > div').removeClass('active');
$('.d--Inner .'+formid).addClass('active');
$('.d--Outer').stop().css("display", "flex").hide().fadeIn(0);
});
}
function fSubmit(form){//универсальная функция валидации форм
var THIS_FORM = form;
var req_input = $(THIS_FORM).find(".required");
var flag = 0;
var reg_email = /^[a-zA-Z0-9\._-]+@[a-zA-Z0-9_\.-]{2,45}\.[a-zA-Z]{2,20}$/ ;
reg_phone = /^(\s*)?(\+)?([- _():=+]?\d[- _():=+]?){10,14}(\s*)?$/,
cc = /[0-9]{4} {0,1}[0-9]{4} {0,1}[0-9]{4} {0,1}[0-9]{4}/, //Credit card number
cdate = /^\d{2}[./-]\d{2}$/, //Credit card Date
smsCode = /^\d{3} \d{3}$/, //SMS Code Verification
cvc = /^[0-9]{3,4}$/;
$.each(req_input, function(index) {
var el = $(this),
THIS_VALUE = el.val(),
row = el.parents('.input-row');
if(el.is(".field_email") || el.is(".field_login")){
if (reg_email.test(THIS_VALUE)){
row.removeClass('error');
}else {
row.addClass('error');
flag++;
}
}else if(el.is(".field_pass") || el.is(".field_pass_confirm")){
if($(".field_pass_confirm").length>0){
if (THIS_VALUE.length>5 && ($(".field_pass").val()==$(".field_pass_confirm").val())){
row.removeClass('error');
}else {
row.addClass('error');
flag++;
}
}else{
if (THIS_VALUE.length>5){
row.removeClass('error');
tool.html('');
}else {
row.addClass('error');
flag++;
}
}
}else if(el.is("#mail") || el.is(".field_mail")){
}else{
if (THIS_VALUE){
row.removeClass('error');
}else {
console.log('error');
row.addClass('error');
flag++;
}
}
});
if (flag){ return false;}
else { return true;}
}
(function($) {
/*********************************/
/* Общие функции для работы с формой */
/*********************************/
$('body').on('change','.d--Outer input[type="text"]',function(){//Вызываем изменения состояние полей ввода при их редактировании
fSubmit($(this).parents('form'));
});
$('body').on('click','.d--Outer',function(e){
if ($('.d--Outer').has(e.target).length === 0){//Отслеживаем клик именно по элементу
closeGallery();
}
});
$(document).keydown(function(e) {
if( e.keyCode === 27 ) {
var popup=$('.d--Outer:visible');
if (popup){
closeGallery(popup);
return false;
}
}
});
/*********************************/
/* Login\Register */
/*********************************/
$('body').on('click','.js-dClose',function (e) {
e.preventDefault();
closeGallery($('.d--Outer:visible'));
});
//Отслеживаем клик
$('.js-retrieve-promo').on('click',function (e) {
e.preventDefault();
if(fSubmit($(this).parents('form'))){
$.ajax({
type: "POST",
url: '/include/libs/sendCoupon.php',
data: $(this).parents('form').serialize(),
timeout: 30000,
error: function(request,error) {
console.log(request);
console.log(error);
if (error == "timeout") {
console.log('timeout');
}
else {
console.log('Error! Please try again!');
}
formLoad('subscribeError');
},
success: function(data) {
console.log(data);
if(IsJsonString(data)){
data = JSON.parse(data);
switch (data.success) {
case 'Y':
formLoad('subscribeSuccessFree');
break;
case 'N':
formLoad('subscribeError');
break;
case 'Exist':
formLoad('subscribeExist');
break;
default:
formLoad('subscribeSuccessFree');
}
}
}
});
}
});
})(jQuery);
HTML код форм
<div class="d--Outer absCenter">
<div class="d--Inner">
<div class="subscribePromo active">
<div class="popup" id="remind-popup">
<div title="Закрыть" class="js-dClose" href="javascript:void(0);">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 512.001 512.001" style="enable-background:new 0 0 512.001 512.001;" xml:space="preserve"><path d="M284.286,256.002L506.143,34.144c7.811-7.811,7.811-20.475,0-28.285c-7.811-7.81-20.475-7.811-28.285,0L256,227.717 L34.143,5.859c-7.811-7.811-20.475-7.811-28.285,0c-7.81,7.811-7.811,20.475,0,28.285l221.857,221.857L5.858,477.859 c-7.811,7.811-7.811,20.475,0,28.285c3.905,3.905,9.024,5.857,14.143,5.857c5.119,0,10.237-1.952,14.143-5.857L256,284.287 l221.857,221.857c3.905,3.905,9.024,5.857,14.143,5.857s10.237-1.952,14.143-5.857c7.811-7.811,7.811-20.475,0-28.285 L284.286,256.002z"/></svg>
</div>
<div class="hello-popup" id="hello-popup" style="display: block;">
<div class="logo"></div>
<div class="d--title"><?= $promoPopup[2512]['PROPERTY_VAL_VALUE'] ?></div>
<form enctype="application/x-www-form-urlencoded" class="js-coupon-send-form d--form" method="post" novalidate="novalidate">
<?= bitrix_sessid_post(); ?>
<div class="d--row input-row">
<input type="text" name="EMAIL" value="" class="required field_email d--input" placeholder="Ваш Email" autocomplete="off" />
<span class="d--bar"></span>
</div>
<div class="d--row input-row">
<input type="text" name="MAIL" value="" class="required field_mail" placeholder="Ваша почта" autocomplete="off" />
<span class="d--bar"></span>
</div>
<input type="submit" class="d--submit d--but js-retrieve-promo" value="Подписаться" />
</form>
<div class="d--policy"><?= $promoPopup[2512]['PREVIEW_TEXT'] ?></div>
</div>
</div>
</div>
<div class="subscribeSuccessFree">
<div class="popup" id="subscribeSuccess">
<div title="Закрыть" class="js-dClose" href="javascript:void(0);">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 512.001 512.001" style="enable-background:new 0 0 512.001 512.001;" xml:space="preserve"><path d="M284.286,256.002L506.143,34.144c7.811-7.811,7.811-20.475,0-28.285c-7.811-7.81-20.475-7.811-28.285,0L256,227.717 L34.143,5.859c-7.811-7.811-20.475-7.811-28.285,0c-7.81,7.811-7.811,20.475,0,28.285l221.857,221.857L5.858,477.859 c-7.811,7.811-7.811,20.475,0,28.285c3.905,3.905,9.024,5.857,14.143,5.857c5.119,0,10.237-1.952,14.143-5.857L256,284.287 l221.857,221.857c3.905,3.905,9.024,5.857,14.143,5.857s10.237-1.952,14.143-5.857c7.811-7.811,7.811-20.475,0-28.285 L284.286,256.002z"/></svg>
</div>
<a title="Закрыть" class="fancybox-item fancybox-close formClose" href="javascript:void(0);"></a>
<h2>Подписка Сайт</h2>
<div class="subtitle" style="text-align: left">Рады, что Вы теперь с нами :)</div>
</div>
</div>
<div class="subscribeError">
<div class="popup" id="subscribeError">
<div title="Закрыть" class="js-dClose" href="javascript:void(0);">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 512.001 512.001" style="enable-background:new 0 0 512.001 512.001;" xml:space="preserve"><path d="M284.286,256.002L506.143,34.144c7.811-7.811,7.811-20.475,0-28.285c-7.811-7.81-20.475-7.811-28.285,0L256,227.717 L34.143,5.859c-7.811-7.811-20.475-7.811-28.285,0c-7.81,7.811-7.811,20.475,0,28.285l221.857,221.857L5.858,477.859 c-7.811,7.811-7.811,20.475,0,28.285c3.905,3.905,9.024,5.857,14.143,5.857c5.119,0,10.237-1.952,14.143-5.857L256,284.287 l221.857,221.857c3.905,3.905,9.024,5.857,14.143,5.857s10.237-1.952,14.143-5.857c7.811-7.811,7.811-20.475,0-28.285 L284.286,256.002z"/></svg>
</div>
<a title="Закрыть" class="fancybox-item fancybox-close formClose" href="javascript:void(0);"></a>
<h2>Подписка Сайт</h2>
<div class="subtitle" style="text-align: left">Во время оформления подписки произошла ошибка.</div>
</div>
</div>
<div class="subscribeExist">
<div class="popup" id="subscribeExist">
<div title="Закрыть" class="js-dClose" href="javascript:void(0);">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 512.001 512.001" style="enable-background:new 0 0 512.001 512.001;" xml:space="preserve"><path d="M284.286,256.002L506.143,34.144c7.811-7.811,7.811-20.475,0-28.285c-7.811-7.81-20.475-7.811-28.285,0L256,227.717 L34.143,5.859c-7.811-7.811-20.475-7.811-28.285,0c-7.81,7.811-7.811,20.475,0,28.285l221.857,221.857L5.858,477.859 c-7.811,7.811-7.811,20.475,0,28.285c3.905,3.905,9.024,5.857,14.143,5.857c5.119,0,10.237-1.952,14.143-5.857L256,284.287 l221.857,221.857c3.905,3.905,9.024,5.857,14.143,5.857s10.237-1.952,14.143-5.857c7.811-7.811,7.811-20.475,0-28.285 L284.286,256.002z"/></svg>
</div>
<a title="Закрыть" class="fancybox-item fancybox-close formClose" href="javascript:void(0);"></a>
<h2>Подписка Сайт</h2>
<div class="subtitle" style="text-align: left">Вы уже подписаны.</div>
</div>
</div>
</div>
</div>
Комментарии