Битрикс - всплывающее окно с промокодом и отправкой по почте
Rus
Eng
Битрикс - всплывающее окно с промокодом и отправкой по почте

Определим что:

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>

Комментарии

Комментариев еще нет, Вы можете стать первым кто его оставит

Оставьте комментарий

На сайте используется система премодерирования комментариев, поэтому ваше сообщение будет опубликовано лишь после одобрения модератором

Вы отвечаете на комментарий пользователя

Отправить

ОБРАТНАЯ СВЯЗЬ

Напишите мне

Вы разрабатываете новый сервис, вносите доработки в существующий и хотите лучше чем у конкурентов? Вы обратились по адресу. Предлагаю вам комплексную разработку сайтов студийного уровня. У меня вы можете заказать дизайн, верстку, програмированние, разработку нетрадиционного функционала, реализацию связи между CMS, CRM и Data Analitics, а так же все остальное касаемое сайтов, кроме продвижения.

Обращайтесь, я всегда проконсультирую по всем вопросам и помогу подобрать наиболее эффективное решение для Вашего бизнеса. Я занимаюсь созданием сайтов в Новосибирске и в других регионах России, также работаю со странами СНГ. Вы останетесь довольны нашим сотрудничеством

Во время отправки произошла ошибка, пожалуйста попробуйте еще раз через некоторое время
Сообщение отправлено успешно

Телефоны

+7(993) 007-18-96

Email

info@tichiy.ru

Адрес

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

Отправляя форму Вы автоматически подтверждаете, что ознакомились и принимаете Политику конфиденциальности сайта

Написать мне
Отправить
Отправляя форму Вы автоматически подтверждаете, что ознакомились и принимаете Политику конфиденциальности сайта
Отправка успешна!
Thank you for your feedback. I will answer you within the next working hours
Отправка не удалась
Во время отправки запроса произошла ошибка. Пожалуйста, подождите и попробуйте снова через некоторое время или свяжитесь со мной