Адаптивная всплывающая форма с проверкой на лету в общем виде на примере формы "Заказать в 1 клик"
Rus
Eng
Адаптивная всплывающая форма с проверкой на лету в общем виде на примере формы "Заказать в 1 клик"

Шаблон вывода всплывающей формы с необходимыми проверками. Пользуюсь постоянно, решил описать процесс для сокращения затрат собственного времени.

Часть приведенного кода избыточна и была использована мною в одном из проектов. Используйте с умом.

Код предоставляется как есть. Используйте его на свой страх и риск.

Первым делом подготавливаем кнопку на которую будет происходить реакция. В параметр data-id записываем id товара:

<div class="btn orderOneClickFormShow" data-id="<?=$arResult['ID']?>">Заказать в 1 клик<i class="fas fa-shopping-cart"></i></div>

Добавляем стили кнопки

.orderOneClick {padding: 10px 15px 10px 15px;color:#fff;display: flex;align-items: center;}

Размещаем в футере контейнер для формы

<div class="topWindowOuter absoluteCenter">
    <div class="topWindowInner">
		//Код формы вставляем сюда
    </div>
</div>

Размещаем нашу форму в контейнере:

<div class="modal-close js-close-form"> <span class="fas fa-times-circle"><svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve"><path d="M256,0C114.844,0,0,114.844,0,256s114.844,256,256,256s256-114.844,256-256S397.156,0,256,0z M256,490.667 C126.604,490.667,21.333,385.396,21.333,256S126.604,21.333,256,21.333S490.667,126.604,490.667,256S385.396,490.667,256,490.667 z"/><path d="M359.542,152.458c-4.167-4.167-10.917-4.167-15.083,0L256,240.917l-88.458-88.458c-4.167-4.167-10.917-4.167-15.083,0 c-4.167,4.167-4.167,10.917,0,15.083L240.917,256l-88.458,88.458c-4.167,4.167-4.167,10.917,0,15.083 c2.083,2.083,4.813,3.125,7.542,3.125s5.458-1.042,7.542-3.125L256,271.083l88.458,88.458c2.083,2.083,4.813,3.125,7.542,3.125 c2.729,0,5.458-1.042,7.542-3.125c4.167-4.167,4.167-10.917,0-15.083L271.083,256l88.458-88.458 C363.708,163.375,363.708,156.625,359.542,152.458z"/></svg></span> </div>
        <form id="buyOneClickForm">
            <?=bitrix_sessid_post();?>
            <input type="hidden" NAME="PRODUCT_ID" class="field_product_id" />
            <div class="row js-oneClickForm js-formDiv active">
                <div class="col-xs-12">
                    <h2 class="modal-title">Заказать в 1 клик</h2>
                </div>
                <div class="col-xs-12">
                    <label>Имя:</label>
                    <input type="text" class="field_name" name="NAME" placeholder="Имя" autocomplete="name" />
                </div>
                <div class="col-xs-12">
                    <label>Телефон:</label>
                    <input type="text" class="field_phone required" name="PHONE" placeholder="Телефон *" autocomplete="tel" />
                </div>
                <div class="col-xs-12">
                    <label>Почта:</label>
                    <input type="text" class="field_mail required" name="EMAIL" placeholder="Почта *" autocomplete="email" />
                </div>
                <div class="col-xs-12">
                    <label>Комментарий:</label>
                    <textarea class="field_comment" name="COMMENT" placeholder="Комментарий"></textarea>
                </div>
                <div class="col-xs-12 orderPolitika">
                    <input type="checkbox" class="field_check required" name="POLITIKA_AGREED" value="Y" id="politika"> <label for="politika">Я ознакомился с <a href="/help/politika-konfidentsialnosti/" target="_blank" rel="noopener noreferrer">Политикой конфиденциальности</a> и согласен со всеми пунктами</label>
                </div>
                <div class="col-xs-12 orderButtonBlock">
                    <div class="orderOneClickSubmit js-order-submit">Отправить<i class="fa fa-long-arrow-alt-right"></i></div>
                </div>
            </div>
            <div class="js-buyOneClickFormSuccess js-formDiv">
                <h2>Успех!</h2>
                <p>Спасибо, мы свяжемся с вами в течении n минут</p>
            </div>
            <div class="js-buyOneClickFormError js-formDiv">
                <h2>Ошибка!</h2>
                <p>Пожалуйста, попробуйте повторить заказ спустя какое-то время</p>
            </div>
        </form>
        <script>
            (function ($) {
                //Активируем маску телефона
                $('.field_phone').inputmask({"mask": "+7 (999) 999-9999"});
            })(jQuery);
        </script>

Добавим стили формы:

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

.topWindowOuter{background-color: rgba(0,0,0,0.5);position: fixed;top:0;left:0;width:100%;height:100%;z-index: 1000;display: none;}
.topWindowInner {background-color: #fff;padding:80px 100px;position: relative;min-width: 420px;max-width: 600px;-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: left}
.topWindowInner h2{font-family: Gotham-Pro-Bold,"HelveticaNeueCyr", "PT Sans", sans-serif;font-size: 24px; font-weight: 600;line-height: 32px;margin-bottom:14px;text-align: left}
.topWindowInner .formClose{position: absolute;right: 0;top:0;background-color: #E31D23;border-radius: 50%;width: 28px;height:28px; -webkit-transform: translate(50%,-50%); -moz-transform: translate(50%,-50%); -ms-transform: translate(50%,-50%); -o-transform: translate(50%,-50%); transform: translate(50%,-50%);cursor:pointer}
.topWindowInner .formClose .svgBox{margin-top:3px;}
.topWindowInner .formClose svg{width: 8px;height:8px;fill:#fff;stroke:#fff;}
.topWindowInner .formClose:hover{background-color: #d21a20}

.topWindowInner input[type="text"],.topWindowInner textarea{width: 100%;display: block;border: 1px solid #b7b7b7;font-family: Roboto,'Open Sans',sans-serif;padding: 10px 13px;font-size: 14px;}
.topWindowInner input[type="text"]{margin-bottom: 16px;position: relative;}
.topWindowInner input[type="text"].error{color:#d21a20;border:1px solid #d21a20;}
.topWindowInner input[type="checkbox"]{display: none}
.topWindowInner label{width: 100%;display: block;font-family: Roboto,sans-serif;font-weight: 400;font-size: 14px;line-height: 1.5;color: #2d2d2d;margin-bottom: 4px;border-bottom:1px solid transparent}
.topWindowInner label.error{text-decoration: underline;text-decoration-color: #d21a20;}
.topWindowInner .orderPolitika {padding-top: 10px}

.topWindowInner .row .col-xs-12:nth-child(4){display: none}
.topWindowInner h2{text-align: center;font-size: 2em;font-family: 'Roboto Condensed',sans-serif;position: relative;text-transform: uppercase;margin-bottom: 60px;}
.topWindowInner a{color:#e62d19}

.orderOneClickSubmit{font-size: 12px;color: #fff;text-align: left;padding: 9px 10px;padding-left: 24px;background: linear-gradient(116deg,#2d2d2d 0,#2d2d2d 70%,#e62d19 71%,#e62d19 100%);font-weight: 700;font-family: 'Roboto Condensed',sans-serif;display: inline-block;cursor: pointer;text-transform: uppercase;letter-spacing: .15em;margin: 44px 0 0 0;display: inline-block}
.orderOneClickSubmit:hover{opacity: 0.8}
.orderOneClickSubmit [class^=fa]{margin-left: 40px;font-size: 16px;line-height: 21px;font-weight: 900;}
.orderButtonBlock{text-align: center}

.js-formDiv {display: none}
.js-formDiv.active {display: block}

.modal-close {position: absolute;top: 12px;right: 24px;cursor: pointer;width: 24px;height:24px;fill:#333}
.modal-close:hover {fill:#FFEDF1}
.modal-close svg{-moz-transition: all 0.5s;-webkit-transition: all 0.5s;-o-transition: all 0.5s;-ms-transition: all 0.5s}

@media all and (max-width: 545px) {
    .topWindowInner {min-width: 320px;max-width: 320px;padding: 40px 20px 40px 20px;}
}

Добавим скрипт в котором будет обрабатываться вся логика формы

<script src="<?=SITE_TEMPLATE_PATH?>/js/main.js?<?=time()?>"></script>

или так:

use Bitrix\Main\Page\Asset;

Asset::getInstance()->addJs(SITE_TEMPLATE_PATH . "/js/main.js?".time()); //Добавление одиночного скрипта

Напишем скрипты обрабатывающие форму

Заполняем файлик main.js

/* But 1 click starts */
function IsJsonString(str) {
    try {
        JSON.parse(str);
    } catch (e) {
        return false;
    }
    return true;
}

/*********************************/
/* Общие функции для работы с формой */
/*********************************/
//При изменении состоянии input всплывающей формы делаем валидацию
$('body').on('keyup input change','.topWindowOuter input,.topWindowOuter textarea',function(){//Вызываем изменения состояние полей ввода при их редактировании
    formSubmit($(this).parents('form'));
});

//Закрываем окно при клике вовне
$('body').on('click','.topWindowOuter',function(e){
    if ($('.topWindowOuter').has(e.target).length === 0){//Отслеживаем клик именно по элементу
        closeGallery();
    }
});

//Показываем всплывающее окно
function showModal(el){
    el.stop().css("display", "flex").hide().fadeIn(600);
}

//При нажатии Esc скрываем форму
$(document).keydown(function(e) {
    if( e.keyCode === 27 ) {

        var popup=$('.topWindowOuter:visible');
        if (popup){
            closeGallery(popup);
            return false;
        }

    }
});

//Скрываем форму
function closeGallery(){
    $('.topWindowOuter').fadeOut(400,function(){
        $('.js-formDiv').removeClass('active').fadeOut(0);
        $('.js-oneClickForm').addClass('active').fadeIn(0);
    });
}

//Делаем валидацию формы
function formSubmit(form){//универсальная функция валидации форм

    var THIS_FORM = form;

    var req_input = $(THIS_FORM).find(".required");
    var flag = 0;


    $.each(req_input, function(index) {
        var THIS_VALUE = $(this).val(),
            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}$/; //Credit card CVC



        if($(this).is(".field_phone")){
            if (reg_phone.test(THIS_VALUE)){
                $(this).removeClass('error').addClass('succeed');
            }
            else {
                $(this).addClass('error').removeClass('succeed');
                flag++;
            }
        }else if($(this).is(".field_email")){
            if (reg_email.test(THIS_VALUE)){
                $(this).removeClass('error').addClass('succeed');
            }
            else {
                $(this).addClass('error').removeClass('succeed');
                flag++;
            }
        }else if($(this).is(".field_name")){
            if (THIS_VALUE.length>2){
                $(this).removeClass('error').addClass('succeed');
            }
            else {
                $(this).addClass('error').removeClass('succeed');
                flag++;
            }
        }else if($(this).is(".field_pass") || $(this).is(".field_pass_confirm")){
            if($(".field_pass_confirm").length>0){
                if (THIS_VALUE.length>5 && ($(".field_pass").val()==$(".field_pass_confirm").val())){
                    $(".field_pass").removeClass('error').addClass('succeed');
                    $(".field_pass_confirm").removeClass('error').addClass('succeed');
                }
                else {
                    $(".field_pass").addClass('error').removeClass('succeed');
                    $(".field_pass_confirm").addClass('error').removeClass('succeed');
                    flag++;
                }
            }else{
                if (THIS_VALUE.length>5){
                    $(".field_pass").removeClass('error').addClass('succeed');
                }
                else {
                    $(".field_pass").addClass('error').removeClass('succeed');
                    flag++;
                }
            }

        }else if($(this).is(".field_card_number")){
            $('.field_card_number').mask('0000 0000 0000 0000');
            if (cc.test(THIS_VALUE)){
                $(this).removeClass('error').addClass('succeed');
            }
            else {
                $(this).addClass('error').removeClass('succeed');
                flag++;
            }
        }else if($(this).is(".field_card_date")){
            $('.field_card_date').mask('00/00');
            if (cdate.test(THIS_VALUE)){
                $(this).removeClass('error').addClass('succeed');
            }
            else {
                $(this).addClass('error').removeClass('succeed');
                flag++;
            }
        }else if($(this).is(".field_card_cvc")){
            $('.field_card_cvc').mask('000');
            if (THIS_VALUE){
                $(this).removeClass('error').addClass('succeed');
            }
            else {
                $(this).addClass('error').removeClass('succeed');
                flag++;
            }
        }else if($(this).is(".field_sms_verify")){
            if (smsCode.test(THIS_VALUE)){
                $(this).removeClass('error').addClass('succeed');
            }
            else {
                $(this).addClass('error').removeClass('succeed');
                flag++;
            }
        }else if($(this).is(".field_check")){
            if($(this).prop("checked") == true){
                $(this).next().removeClass('error').addClass('succeed');
            }
            else {
                $(this).next().addClass('error').removeClass('succeed');
                flag++;
            }
        }else if($(this).is(".field_mail")){
            //Пропускаем фиктивное поля для остановки ботов
            //Рекомендую вам сменить имя и тип проверки на ботов
        }else{
            if (THIS_VALUE){
                $(this).removeClass('error').addClass('succeed');
            }
            else {
                $(this).addClass('error').removeClass('succeed');
                flag++;

            }
        }

    });
    if (flag){ return false;}
    else { return true;}
}

/*********************************/
/* Обработка заказа */
/*********************************/
(function ($) {
    //Кнопка купить в 1 клик, показываем форму
    $('body').on('click','.orderOneClickFormShow',function (e) {
        e.preventDefault();

        //Показываем форму
        showModal($('.topWindowOuter'));

        //Записываем в форму id требуемого элемента
        $('.field_product_id').val($(this).attr('data-id'));
    });

    //Клик на кнопку закрыть форму
    $('body').on('click','.js-close-form',function (e) {
        e.preventDefault();
        closeGallery();
    });

    //отмечаем checkbox как отмеченный. Скрипт нужен поскольку checkbox скрыт и используется его эмуляция
    $('body').on('click','label[for="politika"]',function (e) {
        e.preventDefault();

        var el = $(this),
            parents = el.parents('.orderPolitika'),
            input = parents.find('input[type="checkbox"]');

        parents.toggleClass('active');

        if(parents.hasClass('active')){
            input.prop('checked', true).val('Y');
        }else{
            input.prop('checked', false).val('N');
        }

        input.trigger("change");
    });

    //Для сокращения кода и повышения читабельности выносим данный фрагмент в отдельную функцию
    function formError(){
        $('.js-formDiv.active').fadeOut(400,function(){
            $('.js-formDiv').removeClass('active');
            $('.buyOneClickFormError').fadeIn(400,function(){
                $(this).addClass('active');
            });
        });
    }

    //Для сокращения кода и повышения читабельности выносим данный фрагмент в отдельную функцию
    function formSuccess(){
        $('.js-formDiv.active').fadeOut(400,function(){
            $('.js-formDiv').removeClass('active');
            $('.js-buyOneClickFormSuccess').fadeIn(400,function(){
                $(this).addClass('active');
            });
        });
    }

    //Кнопка отправить
    $('body').on('click','.js-order-submit',function (e) {
        e.preventDefault();

        var el=$(this),
            parents = el.parents('form');

        if(formSubmit(parents)){
            var data = parents.serialize();

            $.ajax({
                type: 'post',
                url: '/local/buyOneClick.php', //Запоминаем размещение файла buyOneClick.php
                data: data,
                //dataType: 'json',
                success: function (data) {
                    console.log(data);
                    if(IsJsonString(data)){
                        data = JSON.parse(data);
                        if(data.success==='ok'){
                            //Ошибок не было, заказ оформлен
                            formSuccess();
                        }else{
                            //Был возвращен флаг с ошибкой
                            formError();
                        }
                    }else{
                        //Не json, значит произошла ошибка
                        formError();
                    }
                },
                error:function(XMLHttpRequest, textStatus, errorThrown) {
                    console.log("Status: " + textStatus);
                }
            });


        }

    });
})(jQuery);
/* But 1 click ends */

Теперь разместим и заполним файл buyOneClick.php

require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');

use Bitrix\Main,
    Bitrix\Main\Loader,
    Bitrix\Main\Config\Option,
    Bitrix\Main\Mail\Event,
    Bitrix\Sale,
    Bitrix\Sale\Order,
    Bitrix\Main\Application,
    Bitrix\Sale\DiscountCouponsManager;

function sendNotification($name,$phone, $orderList, $orderId, $email, $price){
    global $USER;

    $arEventFields = array(
        "ORDER_ID"         => $orderId,
        "SOSTAV"              => $orderList,
        "ORDER_USER"    => $USER,
        "EMAIL" => $email,
        "BCC"  => 'aleksandrpleskachevskiy@gmail.com',
        "PRICE" => $price,
        //"PRICESS" => $savoi
    );

    //CEvent::SendImmediate("SALEINFOADMIN", 's1', $arEventFields, "N"); //Немедленное уведомление админа о новом заказа без записи события в БД
    CEvent::Send("SALEINFOADMIN", 's1', $arEventFields, "N"); //Уведомления админа о новом заказе
}

if (check_bitrix_sessid() && $_SERVER["REQUEST_METHOD"] == "POST") {
    if(htmlspecialchars($_POST['EMAIL'])){
        echo json_encode(array('success'=>'Y'));
    }else{
        CModule::IncludeModule("sale");
        CModule::IncludeModule("catalog");

        $data = array(
            'PRODUCT_ID' => $_POST['PRODUCT_ID'],
            'NAME' => htmlspecialchars($_POST['NAME']) ? htmlspecialchars($_POST['NAME']) : 'Покупка в 1 клик',
            'PHONE' => preg_replace("/[^0-9]/", '', htmlspecialchars($_POST['PHONE'])),//Оставляем только цифры
            'COMMENT' => htmlspecialchars($_POST['COMMENT']),
            'POLITIKA_AGREED' => htmlspecialchars($_POST['POLITIKA_AGREED']),
            'QUANTITY' => 1,
        );

        if(!$data['PHONE']){
            echo json_encode(array('success' => 'N','type' => 'телефон не заполнен'));
            die();
        }

        global $USER;

        if(!$USER->IsAuthorized()){

            $rand = randString(15);

            $registeredUserID = $USER->Add(array(
                "NAME"              => $data['NAME'],
                "EMAIL"             => 'one_click@'.$rand.'.com',
                "LOGIN"             => $rand,
                "PERSONAL_PHONE"     => $rand,
                "LID"               => "ru",
                "ACTIVE"            => "Y",
                "GROUP_ID"          => array(2,3,4),
                "PASSWORD"          => $rand,
                "CONFIRM_PASSWORD"  => $rand,
            ));

            if(!$registeredUserID){
                echo json_encode(array('success' => 'N','type' => 'Пользователь уже существует'));
                die();
            }

            $USER->Authorize($registeredUserID);
        }else{
            $registeredUserID = $USER->GetID();
        }

        $siteId = \Bitrix\Main\Context::getCurrent()->getSite();
        $currencyCode = Option::get('sale', 'default_currency', 'RUB');

        DiscountCouponsManager::init();

        // --- очистка корзины
        CSaleBasket::DeleteAll(CSaleBasket::GetBasketUserID());

        //Получаем корзину для пользователя
        $basket = Sale\Basket::loadItemsForFUser(Sale\Fuser::getId(), Bitrix\Main\Context::getCurrent()->getSite());

        if ($item = $basket->getExistsItem('catalog', $data['PRODUCT_ID'])) {//Проверяем, есть ли такой товарв в корзине
            $item->setField('QUANTITY', $item->getQuantity() + $data['QUANTITY']);//если есть – увеличиваем его количество
        } else {
            $item = $basket->createItem('catalog', $data['PRODUCT_ID']);//добавляем товар в корзину
            $item->setFields(array(
                'QUANTITY' => $data['QUANTITY'],
                'CURRENCY' => \Bitrix\Currency\CurrencyManager::getBaseCurrency(),
                'LID' => \Bitrix\Main\Context::getCurrent()->getSite(),
                'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider',
            ));
        }
        $basket->save();//сохраняем корзину

        $order = Order::create($siteId, $registeredUserID);
        $order->setPersonTypeId(1);
        $basket = Sale\Basket::loadItemsForFUser(\CSaleBasket::GetBasketUserID(), Bitrix\Main\Context::getCurrent()->getSite())->getOrderableItems();

        $order->setBasket($basket);

        /*Shipment*/
        $shipmentCollection = $order->getShipmentCollection();
        $shipment = $shipmentCollection->createItem();
        $shipment->setFields(array(
            'DELIVERY_ID' => 2,//ид варианта доставки(у нас это самовывоз)
            'DELIVERY_NAME' => 'Самовывоз',
            'CURRENCY' => $order->getCurrency()
        ));


        $shipmentItemCollection = $shipment->getShipmentItemCollection();

        foreach ($order->getBasket() as $item)
        {
            $shipmentItem = $shipmentItemCollection->createItem($item);
            $shipmentItem->setQuantity($item->getQuantity());
        }


        /*Payment*/
        $price = $order->getPrice();
        $paymentCollection = $order->getPaymentCollection();
        $extPayment = $paymentCollection->createItem();
        $extPayment->setFields(array(
            'PAY_SYSTEM_ID' => 2,
            'PAY_SYSTEM_NAME' => 'Наличные курьеру',
            'SUM' => $price
        ));

        /**/
        $order->doFinalAction(true);

        $propertyCollection = $order->getPropertyCollection();

        $orderProperties[6] = $USER->GetFullName();
        $orderProperties[8] = $USER->GetParam("PHONE");
        //$orderProperties[28] = "Y";//это у нас свойство, которое заполняется при быстром заказе, чтобы менеджеры не тупили
        $orderProperties[7] = $USER->GetParam("EMAIL");


        foreach ($propertyCollection->getGroups() as $group)
        {
            foreach ($propertyCollection->getGroupProperties($group['ID']) as $property)
            {
                $p = $property->getProperty();
                if( $p["CODE"] == "CONTACT_PERSON")
                    $property->setValue("VASYA");

                if($orderProperties[$p['ID']]!="") {
                    $propertyCollection->setValuesFromPost( array( 'PROPERTIES' => Array( $p["ID"] => $orderProperties[ $p['ID'] ] ) ), array() );//устанавливаем нужные свойства
                }
            }
        }

        $order->setField('CURRENCY', $currencyCode);
        $order->setField('COMMENTS', 'Заказ оформлен через АПИ из s "Купить в 1 клик". Далее комментарий пользователя: ' . $data['COMMENT']);

        $order->save();
        $orderId = $order->GetId();

        if($orderId){
            sendNotification($data['NAME'],$data['PHONE'], '', $orderId, 'one_click@'.$rand.'.com',$price);
            echo json_encode(array('success'=>'ok', 'order_id'=>$orderId));
        } else{
            echo json_encode(array('success' => 'N','type' => 'Ошибка при создании заказа'));
        }

    }
}

Добавление результатов формы в инфоблок с оповещением администратора

Допустим перед нами не форма заказа в 1 клик, а стандартная форма обратной связи. Тогда идем в Контент -> Инфоблоки -> Типы инфоблоков и создаем новый тип инфоблока, с названием "Обращения" и кодом "appeal"

Переходим в Контент -> Обращения и добавляем новый инфоблок с названием "Обратная связь [ст. Контакты]". Параметры будем хранить в отдельной таблице.

В моем случае необходимо было добавить 3 свойства. 2 типа строка (Имя, Как связаться) и 1 типа Html (Комментарий). Создадим эти свойства в инфоблоке и запомни их айди. В моем случае это 251, 252 и 253

Идем в Настройки -> Настройки продукта -> Почтовые и СМС события -> Типы событий и добавляем новое событие

Тип события 	= FEEDBACK_FORM_NEW
Название 		= Отправка сообщения через новую форму обратной связи
Описание 		= 	#AUTHOR# - Автор сообщения
				#HOW_TO_CONTACT# - Как связаться
				#TEXT# - Текст сообщения
				#EMAIL_FROM# - Email отправителя письма
				#EMAIL_TO# - Email получателя письма

Название 		= Sending a message using a new feedback form
Описание 		= 	#AUTHOR# - Message author
				#HOW_TO_CONTACT# - How to contact
				#TEXT# - Message text
				#EMAIL_FROM# - Sender's e-mail address
				#EMAIL_TO# - Recipient's e-mail address

Переходим в Настройки -> Настройки продукта -> Почтовые и СМС события -> Почтовые шаблоны и добавляем новый шаблон

Активен 		= Y
Сайт 			= Ваш сайт
От кого 		= #DEFAULT_EMAIL_FROM#
Кому 			= #EMAIL_TO#
Шаблон			= Информационное сообщение сайта #SITE_NAME#
------------------------------------------

Вам было отправлено сообщение через форму обратной связи

Автор: #AUTHOR#
Как связаться: #HOW_TO_CONTACT#

Текст сообщения:
#TEXT#

Сообщение сгенерировано автоматически.

Обработчики формы и скрипты используем из примера выше. Тогда скрипт принимающий значения формы, отправляющий сообщение администратору и добавляющий элемент инфоблока будет выглядеть так:

require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');

function sendNotification($name,$how, $mes){
    $arEventFields = array(
        "AUTHOR"         => $name,
        "HOW_TO_CONTACT" => $how,
        "TEXT"           => $mes
    );

    CEvent::Send("FEEDBACK_FORM_NEW", 's1', $arEventFields, "N"); //Тип события: Отправка сообщения через новую форму обратной связи
}

$result = array('success'=>'Y'); //Всегда отдаем успех, чтобы возможные злоумышленники не отладили свои скрипты

//$_POST['FAKE_FIELD'] - проверка на бота

if (check_bitrix_sessid() && $_SERVER["REQUEST_METHOD"] == "POST" && !$_POST['FAKE_FIELD']) {

    $name = htmlspecialchars($_POST['field_name']);
    $how = htmlspecialchars($_POST['field_contacts']);
    $mes = htmlspecialchars($_POST['field_message']);

    if($name && $how && $mes){
        sendNotification($name, $how, $mes);//Отправляем сообщение админу

        if(CModule::IncludeModule("iblock")){
            $el = new CIBlockElement;

            $PROP = array();
            $PROP[251] = $name;   //Имя
            $PROP[252] = $how;    //Как связаться
            $PROP[253] = $mes;    //Комментарий

            $arLoadProductArray = Array(
                "MODIFIED_BY"           => 1, // элемент изменен текущим пользователем
                "IBLOCK_SECTION_ID"     => false,          // элемент лежит в корне раздела
                "IBLOCK_ID"             => 23,
                "IBLOCK_TYPE"           => 'appeal',
                "PROPERTY_VALUES"       => $PROP,
                "NAME"                  => "Новое сообщение. Автор: ".$name,
                "ACTIVE"                => "Y",            // активен
                //"PREVIEW_TEXT"          => "текст для списка элементов",
                //"DETAIL_TEXT"           => "текст для детального просмотра",
                //"DETAIL_PICTURE"        => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/image.gif")
            );

            $PRODUCT_ID = $el->Add($arLoadProductArray);
        }
    }
}

echo json_encode($result);

Решение применялось на редакции Бизнес v20.0.600

 

Комментарии

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

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

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

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

Отправить

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

Напишите мне

Вы разрабатываете новый сервис, вносите доработки в существующий и хотите лучше чем у конкурентов? Вы обратились по адресу. Предлагаю вам комплексную разработку сайтов студийного уровня. У меня вы можете заказать дизайн, верстку, програмированние, разработку нетрадиционного функционала, реализацию связи между 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
Отправка не удалась
Во время отправки запроса произошла ошибка. Пожалуйста, подождите и попробуйте снова через некоторое время или свяжитесь со мной