Rus
Eng
Битрикс - всплывающее окно с промокодом и отправкой по почте
Order site
By contacting me you will receive a reliable and knowledgeable contractor who will quickly and efficiently implement any task for you and your business.

All English-language materials have been translated fully automatically using the Google service

Let's define what:

  1. ip will be in a separate HL block. Its structure:

Field: String
Code: UF_USER_IP

Field: Yes / No
Code: UF_USER_SUBSCRIBE_Y
Default: no

Field: Date with time
Code: UF_POPUPSOW
Default: current time

2. The settings will be in a separate IB c type = preferences and id = IB_SETTINGS
IB will have one custom property: Value
Type: String
Code: VAL

3. Create a new section in IB: "Settings for a pop-up with a promo" and remember its id.
4. Add settings:
Subscription info text: Welcome
Show popup every n days: 3
Popup active: Y
Coupon validity: 3  

Code in init.php

  / * Determine if you need a popup with a promo code in the PageStart event * /
require ($_SERVER ['DOCUMENT_ROOT']. '/ local / libs / init / promoCoupon.php');  

Listing 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;
}

Listing /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);

Listing 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;}
}

Listing 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 code of forms

<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>

Comments

There are no comments yet, you can be the first to leave it

Leave a comment

The site uses a comment pre-moderation system, so your message will be published only after approval by the moderator

You are replying to a user's comment

Send

FEEDBACK

Email me

Please message me to discuss the task. I work remotely and officially (as a self-employed professional); my hourly rate is 1,800 RUB, and I can dedicate 3–4 hours a day to the project. I respond quickly, and the consultation is free.

An error occurred while sending, please try again after a while
Message sent successfully

Phones

+7(993) 007-18-96

Email

info@tichiy.ru

Address

Россия, г. Москва

By submitting the form, you automatically confirm that you have read and accept the Privacy Policy site