Адаптивная всплывающая форма с проверкой на лету в общем виде на примере формы "Заказать в 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
Комментарии