Модальное окно в оформлении заказа sale.order.ajax Bitrix

Почему нужно добавлять модальное окно в оформлении заказа sale.order.ajax на Битрикс?

Выводить модальное окно в оформлении заказа sale.order.ajax в 1С-Битрикс можно по разным причинам.

Например на сайте есть объединение заказа и нужно вывести сообщение что будет происходить дальше, объединять заказ, или не объединять.

Также может быть другой случай, когда в шапке сайта имеется один выбранный город, а в самом оформлении заказа был заполнен другой город. И расчет доставки был сделан на основе города, выбранного в шапке. Для того, чтобы уведомить пользователя, необходимо вывести сообщение в модальном окне.

В текущем примере модально окно встроено в шаблон Аспро Макс, но можно его встроить и в обычный шаблон.

Работы по созданию модального окна в оформлении заказа

Добавим модальное окно, например в public/include/header_include/orderModal.php

Хранить данные можно в админке, тогда их можно будет изменить, и так правильнее. Для этого можно воспользоваться классом \Bitrix\Main\Config\Option::get и получать данные таким путем и выводить так:


<?= (!empty(\Bitrix\Main\Config\Option::get('e1.site.settings', 'E1_SS_MODAL_ORDER_TEXT', 'N'))) ? \Bitrix\Main\Config\Option::get('e1.site.settings', 'SS_MODAL_ORDER_TEXT', 'N'): 'Уважаемый посетитель, город доставки отличается от вашего города, и цена доставки разная.
Пожалуйста смените город, чтобы оформить заказ' ?>

А можно сразу вывести нужный текст, если он не будет меняться.

public/include/header_include/orderModal.php

<div class="custom-popup">
   <div class="custom-popup__container">
       <div class="popup__content">
           <div class="popup__content-header">
               <div class="popup__content-inner">
                   <div class="popup__content-header-title">Уведомление</div>
               </div>
               <div class="close">
                   <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                       <path d="M1 1L14.9998 14.9998M14.9999 1L1.00006 14.9998" stroke="#555555" stroke-width="2" stroke-linecap="round"/>
                   </svg>
               </div>
           </div>
           <div class="popup__content-main">
               <div class="popup__content-inner">
                   <div class="opportunity-list">
                   Уважаемый посетитель, город доставки отличается от вашего города, и цена доставки разная.
Пожалуйста смените город, чтобы оформить заказ
                   </div>
                   <div id="bx-popup-order-save-block-buttons" class="opportunity-btns">
                       <a href="#" class="btn btn-default opportunity-btn">Сменить город</a>
                       <a href="#" class="btn  opportunity-btn check">Оформить заказ</a>
                   </div>
               </div>
           </div>
       </div>
   </div>
</div>

В самом файле sale.order.ajax будут показаны только те строчки кода, которые нужно буде изменить.

public/local/templates/aspro_max_custom/components/bitrix/sale.order.ajax/v1/order_ajax.js

//строка 1364
 
//добавляем modal, popup
 
			//BX.bind(this.orderSaveBlockNode.querySelector('[data-save-button]'), 'click', BX.proxy(this.clickOrderSaveAction, this));
 
			//при клике на кнопку сохраняем заказ
 
			let save_buttons = BX('bx-popup-order-save-block-buttons').querySelectorAll('a.check');
 
			for (let i = 0; i < save_buttons.length; i++) {
 
				BX.bind(save_buttons[i], 'click', BX.proxy(this.clickOrderSaveAction, this));
 
			}
 
//строка 8397
//добавляем класс js-show-opportunity-popup для того, чтобы запускать модальное окно
className: 'btn btn-default btn-lg btn-order-save js-show-opportunity-popup'

//строка 8400, убираем событие
//делаем мод окно, в которое выводим, если город в шапке отличается от города в заказе

								// events: {
 
								// 	click: BX.proxy(this.clickOrderSaveAction, this)
 
								// }


public/local/templates/ВАШ ШАБЛОН/components/bitrix/sale.order.ajax/v1/template.php

<?//добавляем класс у кнопки js-show-opportunity-popup ?>
<a href="javascript:void(0)" style="margin: 10px 0" class="pull-right btn btn-default js-show-opportunity-popup btn-lg hidden-xs" data-save-button="true">

public/local/templates/ВАШ ШАБЛОН/js/main.js

//poput sale.order.ajax create
 
let showOpportunityPopup = function(e) {
 
	e.preventDefault();
 
	$(".custom-popup").fadeIn(300);
 
	$('body').addClass('body-fixed');
 
}
 

 
$(document).ready(function() {
 
	$(".custom-popup .close").click(function() {
 
		$(".custom-popup").fadeOut(300);
 
		$('body').removeClass('body-fixed');
 
	});
 

 
	$(".custom-popup .btn.btn-default.opportunity-btn").click(function() {
 
		$(".custom-popup").fadeOut(300);
 
		$('body').removeClass('body-fixed');
 
		$('.regions-confirm-button-negative').click(); //вызываем выбор города
 
	});
 

 
});

//строка 8744
$(document).on('click', '.js-show-opportunity-popup', function(e) {

	if(BX.Sale.OrderAjaxComponent.isValidPropertiesBlock().length)  {
 
		//Если форма НЕвалидна, прокручиваем к ошибке
 
		BX.Sale.OrderAjaxComponent.animateScrollTo($('.has-error')[0], 800, 50);
 
	} else {
 
	// Если форма валидна
 
	//проверяем город в форме и город в шапке, и выводим попап
 
	let region_wrapper = $('.region_wrapper .js_city_chooser span').html();
 
	let $city = jQuery('input[data-id="city"]').val();
 
	if (region_wrapper !== $city) {
 
	showOpportunityPopup(e);
 
      }
 
   }
 })


//строка 8774


let region_wrapper = $('.region_wrapper .js_city_chooser span').html();

let $city = jQuery('input[data-id="city"]').val();
 
//если форма валидна, то открываем мод окно или создаем заказ sale.order.ajax
 
if(typeof BX.Sale.OrderAjaxComponent.allowOrderSave == 'function') {
 
if (region_wrapper !== $city) {
 
    showOpportunityPopup(event);
 
} else BX.Sale.OrderAjaxComponent.allowOrderSave();
 
}
 
	if(typeof BX.Sale.OrderAjaxComponent.doSaveAction == 'function') {
 
		if (region_wrapper !== $city) {
 
		showOpportunityPopup(event);
 
	} else BX.Sale.OrderAjaxComponent.doSaveAction();
 	

public/local/templates/ВАШ ШАБЛОН/header.php

<?include_once(str_replace('//', '/', $_SERVER['DOCUMENT_ROOT'].'/'.SITE_DIR.'include/header_include/orderModal.php'));?>

public/local/templates/ВАШ ШАБЛОН/styles.css

/*стили модального окна, если города разные в заказе и в шапке*/

body.body-fixed {
 
   overflow: hidden;
 
   padding-right: 17px;
 
}
 

 
body.body-fixed .custom-popup {
 
   overflow: auto;
 
}
 
.custom-popup {
 
   height: 100%;
 
   width: 100%;
 
   position: fixed;
 
   top: 0;
 
   left: 0;
 
   right: 0;
 
   bottom: 0;
 
   z-index: 2999;
 
   background: rgba(0, 0, 0, 0.4);
 
   display: none;
 
}
 

 
.custom-popup .custom-popup__container {
 
   top: 0;
 
   left: 0;
 
   right: 0;
 
   z-index: 13;
 
   min-height: calc(100vh - 300px);
 
   display: flex;
 
   align-items: center;
 
   margin: 100px auto;
 
   max-width: 650px;
 
}
 
.custom-popup .popup__content {
 
   background: white;
 
   width: 100%;
 
}
 

 
.popup__content-header {
 
   border-bottom: 2px solid #62bb46;
 
   position: relative;
 
}
 

 
.popup__content-inner {
 
   padding: 35px 45px;
 
}
 

 
.popup__content-header-title {
 
   font-size: 26px;
 
   line-height: 33px;
 
   max-width: 550px;
 
   font-weight: 500;
 

 
}
 
.custom-popup .close {
 
   position: absolute;
 
   right: 30px;
 
   top: 30px;
 
   opacity: 1;
 
   display: block;
 
}
 

 
.popup__content-main {
 
   font-size: 18px;
 
   line-height: 23px;
 
}
 
.opportunity-list {
 
   list-style: none;
 
   margin-bottom: 30px;
 
}
 
.opportunity-list li {
 
   counter-increment: my-awesome-counter;
 
   margin-bottom: 15px;
 
}
 
.opportunity-list li::before {
 
   content: counter(my-awesome-counter) ". ";
 
   color: #D23F54;
 
   font-weight: bold;
 
}
 

 
.opportunity-list span {
 
   color: #D23F54;
 
   font-weight: 600;
 
}
 

 
.opportunity-btns {
 
   display: flex;
 
   gap: 15px;
 
   margin-bottom: 15px;
 
}
 
.btn.opportunity-btn {
 
   font-size: 17px;
 
   line-height: 18px;
 
   font-weight: 500;
 
   padding: 11px 40px
 
}
 

 
.opportunity-notice {
 
   margin-bottom: 30px;
 
   color: #888;
 
   font-size: 14px;
 
}
 

 
.opportunity-notice a {
 
   color: inherit;
 
   text-decoration: underline;
 
}
 

 
.opportunity-video {
 
   display: none;
 
}
 

 
.opportunity-video iframe {
 
   width: 100%;
 
   height: 270px;
 
}
 

 
@media (max-width: 768px) {
 
   .opportunity-btns {
 
       flex-direction: column;
 
       align-items: center;
 
   }
 

 
   .btn.opportunity-btn {
 
       width: 270px;
 
   }
 
}
 

 
@media(max-width: 600px) {
 
   .custom-popup .custom-popup__container {
 
       width: 80%;
 
   }
 
   .custom-popup .close {
 
       top: 15px;
 
       right: 15px;
 
   }
 
   .popup__content-inner {
 
       padding: 20px;
 
   }
 
   .popup__content-header-title {
 
       line-height: 1.3;
 
       font-size: 22px;
 
   }
 
   .popup__content-main {
 
       font-size: 16px;
 
   }
 
   .opportunity-list,
 
   .opportunity-notice{
 
       margin-bottom: 20px;
 
   }
 
   .opportunity-list li {
 
       margin-bottom: 10px;
 
   }
 
   .btn.opportunity-btn {
 
       font-size: 16px;
 
   }
 
   .opportunity-video iframe {
 
       width: 200px;
 
   }
 
}


На этом завершаю статью.

Результат будет таким:

Модальное окно в оформлении заказа sale.order.ajax Bitrix

Успехов в освоении новых знаний!

Интересные статьи по программированию:

Уважаемый читатель!

Ты можешь сделать проект Mirdeveloper.ru лучше!

Написание статей требует много затрат, времени и сил, ресурсов, в том числе и денежных.

Оставь чаевые, и будут новые статьи, и появятся видео.

Это даст новые возможности в улучшении сайта

Спасибо за то, что Вы с нами!


Комментарии находятся на модерации или не добавлены.

Для добавления комментариев необходимо зарегистрироваться и авторизоваться

Также возможно авторизоваться через Социальную сеть Вконтакте (VK)