/ Scripts & jquery / Создаём корзину

Создаём корзину

23.03.2024

630

Создадим самостоятельно корзину товаров. Будем использовать такие технологии как: js (jQuery), localStorage и JSON как формат.

Если очень упростить то нужно сделать следующее:

const myArray = [
    {
        id: 124, 
        title: 'Ткань #1',
        quantity: 4,
        fabric_price: 500,
        fabric_height: 2.1,
        cornice_length: 1.1,
        ceiling_height: 2.4,
        image: '/wp-content/webp-express/webp-images/uploads/2024/03/1-1-1-150x150.jpg.webp',
    },
    {
        id: 125, 
        title: 'Ткань #2',
        quantity: 1,
        fabric_price: 600,
        fabric_height: 2.1,
        cornice_length: 1.1,
        ceiling_height: 2.4,
        image: '/wp-content/webp-express/webp-images/uploads/2024/03/1-2-1-150x150.jpg.webp',
    },
];

// преобразовать массив в строку JSON, используя JSON.stringify()
const jsonArray = JSON.stringify(myArray);

// сохраните в localStorage, используя «массив» в качестве ключа и jsonArray в качестве значения
localStorage.setItem('array', jsonArray);

// получить строку JSON из localStorage
const str = localStorage.getItem('array');

// преобразовать строку JSON в соответствующий объект
const parsedArray = JSON.parse(str);

console.log(parsedArray);

т.е. сохраняем параметры корзины в LocalStorage, но далее нужно проработать ряд скриптов по манипулированию данными.

В данном примере будет приведен далеко не самый классический пример корзины. Но важно рассмотреть сам принцип.

Создание списка корзины и индикатора кол-ва товаров

Создаем массив в localStorage, если он не существует:

// Создаем массив, если он не существует
if (localStorage.getItem("array") === null) {
    localStorage.setItem('array', JSON.stringify([]));
}

Основная функция прорисовки списка товаров:

function printCart() {

    let myCart = JSON.parse(localStorage.getItem('array')),
    renderBlock = document.getElementById('cart-area');

    /* Clearing the block before displaying */
    renderBlock.innerHTML = '';

    if(myCart.length == 0) {
    
        renderBlock.insertAdjacentHTML('beforeEnd', `
            <div class="cart-empty">Нет позиций в заказе</div>
        `);        
    
    } else {

        renderBlock.insertAdjacentHTML('beforeEnd', `
            <div class="cart-item cart_gui">
                <div class="cart-item-image"></div>
                <div class="cart-item-name">наименование</div>
                <div class="cart-item-quantity">кол-во штор <br>на 1 окно</div>
                <div class="cart-item-cornice_length">длина карниза <br>1 окна (м)</div>
                <div class="cart-item-ceiling_height">высота от пола до карниза (м)</div>
                <div class="cart-item-recomendet">кол-во ткани</div>
                <div class="cart-item-total">стоимость</div>
                <div class="cart-item-double"></div>
                <div class="cart-item-remove"></div>
            </div>
        `);    
        
        total = 0;
        
        /* We withdraw products from the cart */
        Array.from(myCart).forEach( function(product) {

            if (typeof product.quantity_fabric === "undefined") {
                quantity_fabric = product.cornice_length * product.quantity;
            } else {
                quantity_fabric = product.quantity_fabric;
            }

            recomendet = Number(product.cornice_length) + (Number(product.quantity) * 0.5);

            itemFabricPrice = Number(quantity_fabric) * Number(product.fabric_price);
            itemSewingPrice = Number(quantity_fabric) * Number(product.sewing_price);

            itemFabricPrice_format = itemFabricPrice.toFixed(0).replace(/\B(?=(\d{3})+(?!\d))/g, " ");
            itemSewingPrice_format = itemSewingPrice.toFixed(0).replace(/\B(?=(\d{3})+(?!\d))/g, " ");

            itemTotalPrice = itemFabricPrice + itemSewingPrice;

            itemTotalPrice_format = itemTotalPrice.toFixed(0).replace(/\B(?=(\d{3})+(?!\d))/g, " "); // округляем, делаем разрядность

            renderBlock.insertAdjacentHTML('beforeEnd', `
                <div class="cart-item" data-id="${product.id}">
                    
                    <div class="cart-item-image"><img src="${product.image}" alt="${product.image}"></div>
                    <div class="cart-item-name">
                    <a href="${product.url}">${product.title}</a>
                    <small><span>цена: ${product.fabric_price} ₽</span>, <span>высота: ${product.fabric_height} м</span>, <span>пошив: ${product.sewing_price} ₽</span></small>
                    </div>

                    <div class="cart-item-quantity">
                        <input type="number" class="qty" name="qty" value="${product.quantity}">
                    </div>
                    <div class="cart-item-cornice_length">
                        <input type="number" class="cornice_length" name="cornice_length" value="${product.cornice_length}" min="1" max="100" step="0.1">
                    </div>
                    <div class="cart-item-ceiling_height">
                        <input type="number" class="ceiling_height" name="ceiling_height" value="${product.ceiling_height}" min="1" max="100" step="0.1">
                    </div>
                    <div class="cart-item-recomendet">
                        <input type="number" class="quantity_fabric" name="quantity_fabric" value="${quantity_fabric}" min="1" max="100" step="0.1">
                        <p>Минимально <br>необходимо <span>${recomendet.toFixed(1)}</span> м</p>
                    </div>
                    <div class="cart-item-total">
                    ${itemTotalPrice_format} ₽
                    <small><span>ткань: ${itemFabricPrice_format} ₽</span>, <span>пошив: ${itemSewingPrice_format} ₽</span></small>
                    </div>

                    <div class="cart-item-double"><div onclick="cloneItem(${product.id})" title="дублировать строку">+</div></div>
                    <div class="cart-item-remove"><div onclick="delFromCart(${product.id})" title="удалить строку">×</div></div>
                    
                </div>
            `);

            total += itemTotalPrice;

        });

        total_format = total.toFixed(0).replace(/\B(?=(\d{3})+(?!\d))/g, " "); // округляем, делаем разрядность

        //Сумма заказа
        renderBlock.insertAdjacentHTML('beforeEnd', `
            <div id="cart-total">Итого: ${total_format} ₽</div>
        `);

        //Кнопка Очистить корзину
        renderBlock.insertAdjacentHTML('beforeEnd', `
            <div class="clearCart"><button class="btn" onclick="clearCart()"><i class="icon-xmark1"></i> Очистить корзину</button></div>
        `);
    
    
    }

}

Корзина будет выводить и обновляться внутри тега div#cart-area.

Функция счетчика товаров:

function printCounter() {

    let myCart = JSON.parse(localStorage.getItem('array')),
    renderCounter = document.getElementById('cart-counter');

    renderCounter.innerHTML = '';

    if(myCart.length == 0) {
        renderCounter.insertAdjacentHTML('beforeEnd', `0`);        
    } else {
        renderCounter.insertAdjacentHTML('beforeEnd', `${myCart.length}`);
    }

}

Изначально загружаем корзину и счетчик, если есть соответствующие тэги на странице.

// Изначально загружаем корзину
jQuery(document).ready(function($) {

    if(jQuery("#cart-area").length != 0) { printCart(); }
    if(jQuery("#cart-counter").length != 0) { printCounter(); }

});

Функции корзины

Очистить корзину

// Очистить корзину
function clearCart() {
    localStorage.setItem('array', JSON.stringify([]));
    if(jQuery("#cart-area").length != 0) { printCart(); }
    if(jQuery("#cart-counter").length != 0) { printCounter(); }
}

Добавить Позицию в массив

// Добавить Позицию в массив
function add_item(id,title,protype,quantity,image,url,fabric_price,fabric_height,sewing_price,cornice_length,ceiling_height,quantity_fabric) {

    id = parseInt(id);
    quantity = parseInt(quantity);

    let angryCartData = JSON.parse(localStorage.getItem('array') ?? null),
    existingProducts = angryCartData.find(product => product.id === id);

    if( !existingProducts ) {

        angryCartData.push({
            id: id, 
            title: title,
            protype: protype,
            quantity: quantity,
            image: image,
            url: url,
            fabric_price: fabric_price,
            fabric_height: fabric_height,
            sewing_price: sewing_price,
            cornice_length: cornice_length,
            ceiling_height: ceiling_height,
            quantity_fabric: quantity_fabric,
        });

    } else {

        existingProducts.quantity = existingProducts.quantity + quantity;

    }

    localStorage.setItem('array', JSON.stringify(angryCartData));
    if(jQuery("#cart-area").length != 0) { printCart(); }
    if(jQuery("#cart-counter").length != 0) { printCounter(); }

}

Добавление (+1) количества

// Добавление (+1) количества Позиции
function add_qnt(id) {

    let angryCartData = JSON.parse(localStorage.getItem('array') ?? null),
    existingProducts = angryCartData.find(product => product.id === id);

    if (existingProducts) {
        existingProducts.quantity++;
    }

    localStorage.setItem('array', JSON.stringify(angryCartData));
    if(jQuery("#cart-area").length != 0) { printCart(); }
    if(jQuery("#cart-counter").length != 0) { printCounter(); }

}

Уменьшение (-1) количества

// Уменьшение (-1) количества Позиции
function rem_qnt(id) {

    let angryCartData = JSON.parse(localStorage.getItem('array') ?? null),
    existingProducts = angryCartData.find(product => product.id === id);

    if ( existingProducts.quantity < 2 ) {
        angryCartData.splice(angryCartData.indexOf(existingProducts), 1);
    } else {
        existingProducts.quantity--;
    }

    localStorage.setItem('array', JSON.stringify(angryCartData));
    if(jQuery("#cart-area").length != 0) { printCart(); }
    if(jQuery("#cart-counter").length != 0) { printCounter(); }

}

Изменение количества (полем)

// Изменение количества (полем)

jQuery('body').on('change', '#cart-area input[name="qty"]', function(){

    var id = jQuery(this).parents('.cart-item').data('id');
    var qty = jQuery(this).val();

    let angryCartData = JSON.parse(localStorage.getItem('array') ?? null),
    existingProducts = angryCartData.find(product => product.id === id);

    if (existingProducts) {
        if ( qty < 1 ) {
            angryCartData.splice( existingProducts, 1 );
        } else {
            existingProducts.quantity = qty;
        }
    }   

    localStorage.setItem('array', JSON.stringify(angryCartData));
    if(jQuery("#cart-area").length != 0) { printCart(); }
    if(jQuery("#cart-counter").length != 0) { printCounter(); }
    
});

Также можно изменять любые другие параметры, пример:

// Изменение длины карниза (м) Позиции (поле)
jQuery('body').on('change', '#cart-area input[name="cornice_length"]', function(){

    var id = jQuery(this).parents('.cart-item').data('id');
    var cornice_length = jQuery(this).val();

    let angryCartData = JSON.parse(localStorage.getItem('array') ?? null),
    existingProducts = angryCartData.find(product => product.id === id);

    if (existingProducts) {
        if ( cornice_length > 1 ) { // min = 1
            existingProducts.cornice_length = cornice_length;
        }
    }   

    localStorage.setItem('array', JSON.stringify(angryCartData));
    if(jQuery("#cart-area").length != 0) { printCart(); }
    if(jQuery("#cart-counter").length != 0) { printCounter(); }
    
});

Удаление Позиции

// Удаление Позиции
function delFromCart(id) {

    let angryCartData = JSON.parse(localStorage.getItem('array') ?? null),
    existingProducts = angryCartData.find(product => product.id === id);

    if (existingProducts) {
        // angryCartData.splice( existingProducts, 1 );
        angryCartData.splice(angryCartData.indexOf(existingProducts), 1);
    }
    
    localStorage.setItem('array', JSON.stringify(angryCartData));
    if(jQuery("#cart-area").length != 0) { printCart(); }
    if(jQuery("#cart-counter").length != 0) { printCounter(); }

}

Дублирование Позиции

// Дублирование Позиции
function cloneItem(id) {

    let angryCartData = JSON.parse(localStorage.getItem('array') ?? null),
    existingProducts = angryCartData.find(product => product.id === id);

    if (existingProducts) {

        angryCartData.push({
            id: jQuery.now(), 
            title: existingProducts.title,
            protype: existingProducts.protype,
            quantity: existingProducts.quantity,
            image: existingProducts.image,
            url: existingProducts.url,
            fabric_price: existingProducts.fabric_price,
            fabric_height: existingProducts.fabric_height,
            sewing_price: existingProducts.sewing_price, 
            cornice_length: existingProducts.cornice_length,
            ceiling_height: existingProducts.ceiling_height,
            quantity_fabric: existingProducts.quantity_fabric,
        });
    
    }
    
    localStorage.setItem('array', JSON.stringify(angryCartData));
    printCart();
    printCounter();

}

Функции добавления товаров в корзину

Эти функции приведены как пример, т.к. все зависит от конкретной верстки.

Верстка:

<form id="order-params" class="form-container form-label">

	<div class="form-field col-6">
		<label><span>Цена (руб. за пог.м)</span>
		<div class="form-field-wrap">
			<input type="text" name="fabric_price" value="<?php echo $term_meta['fabric_price']; ?>" disabled>
		</div>
		</label>
	</div>

	<div class="form-field col-6">
		<label><span>Высота ткани (м)</span>
		<div class="form-field-wrap">
			<input type="text" name="fabric_height" value="<?php echo $term_meta['fabric_height']; ?>" disabled>
		</div>
		</label>
	</div>

	<div class="form-field col-6">
		<label><span>Цена пошива (руб.)</span>
		<div class="form-field-wrap">
			<input type="text" name="sewing_price" value="<?php echo $term_meta['sewing_price']; ?>" disabled>
		</div>
		</label>
	</div>

	<div class="quantity hidden">Количество <input type="number" name="quantity" value="1" min="1" max="1000"></div>
	<div class="cornice_length hidden">Длина корниза (м) <input type="number" name="cornice_length" value="1" min="1" max="100" step="0.1"></div>
	<div class="ceiling_height hidden">Высота потолков (м) <input type="number" name="ceiling_height" value="1" min="1" max="100" step="0.1"></div>
	<div class="quantity_fabric hidden">Количество ткани <input type="number" name="quantity_fabric" value="1" min="1" max="100" step="0.1"></div>


	<div class="form-field col-12">
		<label class="submit">
		<div class="submit-ajax submit-container">
			<input class="btn submit-button" type="submit" value="Добавить в заказ"/>
		</div>
		</label>
	</div>

	<div class="notice"></div>

	<p>Для уточнения количества ткани Вам нужно перейти в заказ:</p>

	<a class="btn" href="/checkout/">Перейти в заказ</a>

</form>

Функция добавления:

// Добавление товара (из карточки)
jQuery('#order-params').on('submit', function(event){    
    event.preventDefault();

    var id = jQuery.now();
    var title = jQuery('h1').text();
    var protype = jQuery(this).find('input[name="protype"]').val();
    var quantity = jQuery(this).find('input[name="quantity"]').val();

    var image = jQuery('.colors .item:first-child img').attr('src');
    var url = location.pathname;

    var fabric_price = jQuery(this).find('input[name="fabric_price"]').val();
    var fabric_height = jQuery(this).find('input[name="fabric_height"]').val();
    var sewing_price = jQuery(this).find('input[name="sewing_price"]').val();
    
    var cornice_length = jQuery(this).find('input[name="cornice_length"]').val();
    var ceiling_height = jQuery(this).find('input[name="ceiling_height"]').val();
    var quantity_fabric = jQuery(this).find('input[name="quantity_fabric"]').val();

    add_item(id,title,protype,quantity,image,url,fabric_price,fabric_height,sewing_price,cornice_length,ceiling_height,quantity_fabric);

    jQuery(this).find('.notice').text('Вы добавили ткань «' + title + '» в свой заказ.');

    setTimeout(function () {		
        jQuery('#order-params .notice').empty();
    }, 3000);    
    
});

Оформление заказа

Далее, при оформлении заказа, необходимо передать эту корзину в виде заказа. Форма может быть абсолютна любая, корзину мы будем брать из localStorage.

<form id="form_checkout" class="form-container recall-form-validate send-cart" data-theme="Заказ тканей"><div class="row">

    <input class="form-first-name" type="hidden" name="first_name" placeholder="Ваше имя" value="" maxlength="60">

    <div class="form-field col-612">
        <label><span>ФИО <small>*</small></span>
        <div class="form-field-wrap">
            <input class="form-name required" type="text" name="name" placeholder="ФИО *" maxlength="60">
        </div>
        </label>
    </div>

    <div class="form-field col-6">
        <label><span>Телефон <small>*</small></span>
        <div class="form-field-wrap">
            <input class="form-phone required" type="text" name="phone" placeholder="Телефон *" maxlength="20">
        </div>
        </label>
    </div>

    <div class="form-field col-6">
        <label><span>E-mail <small>*</small></span>
        <div class="form-field-wrap">
            <input class="form-email required" type="text" name="email" placeholder="E-mail" maxlength="30">
        </div>
        </label>
    </div>

    <div class="form-field col-12 radio-buttons">
    <span>Предпочтительная форма связи: </span>
    <div class="group-labels">
        <label><input type="radio" name="connect" value="Телефон" checked="checked">Телефон</label>
        <label><input type="radio" name="connect" value="WhatsApp">WhatsApp</label>
        <label><input type="radio" name="connect" value="Telegram">Telegram</label>
    </div>
    </div>            

    <div class="form-field col-12">
        <label><span>Комментарий</span>
        <div class="form-field-wrap">
            <textarea class="form-quest" name="quest" cols="40" rows="4" aria-required="true" placeholder="Комментарий к заказу" maxlength="600"></textarea>
        </div>
        </label>
    </div>

    <div class="form-field col-12">
        <label class="acceptance">
            <span></span>
            <div class="form-field-wrap">
                <div>
                <input type="checkbox" class="required" name="acceptance" checked>
                <small>Я согласен на обработку персональных данных согласно <a href="/kontakty/politika-konfidentsialnosti/" target="_blank">Политики конфиденциальности</a></small>
                </div>
            </div>
        </label>
    </div>

    <div class="form-field col-12">
        <label class="submit">
        <span></span>
        <div class="submit-ajax submit-container">
            <input class="submit-button" type="submit" value="Отправить"/>
        </div>
        </label>
    </div>

    <div class="notice"></div>

</div></form>

Функция отправки заказа

// Отправка заявки
jQuery('.recall-form-validate').on('submit', function (event) {
	event.preventDefault();

	var form = jQuery(this);

	var name = jQuery(form).find('.form-name');

	var phone = jQuery(form).find('.form-phone');
	var email = jQuery(form).find('.form-email');
	var quest = jQuery(form).find(".form-quest");
	
	var theme = jQuery(form).attr('data-theme');
	var form_id = jQuery(form).attr('data-id');
	var object = jQuery('h1').text();
	
	//Получение значения выбранного radio
	var connect = jQuery(form).find('input[name="connect"]:checked').val();

	if (jQuery(this).hasClass('send-cart')) {
		var cartData = localStorage.getItem('array');
		// console.log(cartData);
	}

	
	

	// Защита от СПАМа
	var first_name = jQuery(form).find('.form-first-name');
	if( !first_name.val().length == 0 ) {
		jQuery(form).find(".submit-ajax").html('');
		return false;
	}


	// Изначально очищаем уведомления под полями
	jQuery(form).find('.warning').remove();


	// Общая проверка текстовых полей (+textarea)
	jQuery(form).find('input[type="text"].required, textarea.required').each(function() {
		if (jQuery(this).val()  === '') {
			jQuery(this).removeClass('filled').addClass('not-filled');
		} else {
			jQuery(this).removeClass('not-filled').addClass('filled');
		}
	});


	// Проверка имени
	if ((jQuery(name).hasClass('required')) && (jQuery(name).val()  === '')) {
		jQuery(name).after('<div class="warning">Напишите Ваше имя</div>');
	}
	

	// Проверка телефона
	if ((jQuery(phone).hasClass('required')) && (jQuery(phone).val()  === '')) {
		jQuery(phone).after('<div class="warning">Заполните поле с номером телефона</div>');
	} else if ((jQuery(phone).hasClass('required')) && (jQuery(phone).val().length < 8)) {
		jQuery(phone).removeClass('filled').addClass('not-filled');
		jQuery(phone).after('<div class="warning">Слишком короткий номер</div>');
	} else if ((jQuery(phone).hasClass('required')) && (!((jQuery(phone).val().lastIndexOf("+7", 0) === 0) || (jQuery(phone).val().lastIndexOf("8", 0) === 0)))) {
		jQuery(phone).removeClass('filled').addClass('not-filled');
		jQuery(phone).after('<div class="warning">Введите корректный номер в формате +79998887766 или 89998887766</div>');
	} else {
		jQuery(phone).removeClass('not-filled').addClass('filled');
	}


	// Проверка E-mail
	if ((jQuery(email).hasClass('required')) && (jQuery(email).val()  === '')) {
		jQuery(email).after('<div class="warning">Заполните поле с E-mail</div>');
	} else if ((jQuery(email).hasClass('required')) && !validateEmail(jQuery(email).val())) {
		jQuery(email).removeClass('filled').addClass('not-filled');
		jQuery(email).after('<div class="warning">Введите корректный E-Mail</div>');
	} else {
		jQuery(email).removeClass('not-filled').addClass('filled');
	}

	
	// Проверка комментария
	if ((jQuery(quest).hasClass('required')) && (jQuery(quest).val()  === '')) {
		jQuery(quest).after('<div class="warning">Напишите кратко свой вопрос</div>');
	}	

	
	// Проверка обработки персональных данных
	if ( jQuery(form).find('input:checkbox[name="acceptance"]').hasClass('required') ) {
		if ( !jQuery(form).find('input:checkbox[name="acceptance"]').is(':checked') ) {
			jQuery(form).find('input:checkbox[name="acceptance"]').parent().removeClass('filled').addClass('not-filled');
			jQuery(form).find('input:checkbox[name="acceptance"]').parent().after('<div class="warning">Вы должны согласится на обработку персональных данных</div>');
		} else {
			jQuery(form).find('input:checkbox[name="acceptance"]').parent().removeClass('not-filled').addClass('filled');
		}
	}


	// Отправка формы
	if ( jQuery(form).find("*").hasClass('not-filled') ) {
		jQuery(form).find(".notice").html('Заполните обязательные поля');
	} else {
		jQuery(form).find(".notice").html('');

		jQuery.ajax({
			url: "/wp-admin/admin-ajax.php",
			method: 'post',
			data: {
				action: 'feedback',
				name: name.val(),
				phone: phone.val(),
				email: email.val(),
				quest: quest.val(),
				theme: theme,
				form_id: form_id,
				object: object,
				connect: connect,
				cartData: cartData
			},
			success: function (response) {
				jQuery(form).find(".submit-ajax").html(response);
				clearCart();
			}
		});
		
		// setTimeout(function () {		
		// 	jQuery.fancybox.close();
		// }, 2000);
		
	}
	
});



// Проверка E-mail
function validateEmail($email) {
	var emailReg = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;
	return emailReg.test( $email );
}

Отправка письма с заказом

// Отправка формы
function feedback_send(){
    $name   = sanitize_text_field( $_REQUEST['name'] );
    $phone  = sanitize_text_field( $_REQUEST['phone'] );
	$email  = sanitize_email( $_REQUEST['email'] );
	$quest  = sanitize_textarea_field( $_REQUEST['quest'] );
	$theme  = sanitize_textarea_field( $_REQUEST['theme'] );
	$form_id = sanitize_text_field( $_REQUEST['form_id'] );
	$object = sanitize_text_field( $_REQUEST['object'] );
	$connect = sanitize_text_field( $_REQUEST['connect'] ); 

	$cartData = $_REQUEST['cartData'];


	$mail_to = get_post_meta($form_id, 'destination', 1);
	if (empty($mail_to)) { $mail_to = 'mail@site.ru'; }
	
	
    $msg  = "<table class='letter'><tbody><tr><td class='name'>Имя:</td><td>$name</td></tr>";
	if (!empty($phone))     	{ $msg .= "<tr><td class='name'>Телефон:</td><td>$phone</td></tr>"; }
	if (!empty($email))    		{ $msg .= "<tr><td class='name'>E-Mail:</td><td>$email</td></tr>"; }
	$msg  .= "<tr><td colspan='2'></td></tr>";	
	if (!empty($quest))    		{ $msg .= "<tr><td class='name'>Вопрос:</td><td>$quest</td></tr>"; }		

	if (!empty($cartData)) {

		$cartData_json = str_replace('\"', '"', $cartData);
		$cartData_arr = json_decode($cartData_json, true);

		$cartData_arr_count = count($cartData_arr);
		$total = 0;

		$msg  .= "<tr><td colspan='2'></td></tr>";

		$i = 1;

		foreach($cartData_arr as $array) {


			$itemFabricPrice = $array['quantity_fabric'] * $array['fabric_price'];
            $itemSewingPrice = $array['quantity_fabric'] * $array['sewing_price'];

			$itemTotalPrice = $itemFabricPrice + $itemSewingPrice;
			$itemTotalPrice_format = number_format(round($itemTotalPrice, 0), 0, '', ' '); 

			$total += $itemTotalPrice;

			$msg .= "<tr>";

			if ($i == 1) {
				$msg .= "<td rowspan='$cartData_arr_count' class='name'>Состав заказа:</td>";
			}

				$msg .= "<td>";
					$msg .= "<img src='".$array['image']."' width='35'>";
					$msg .= "<div class='text'>".$array['title']." <br>
					кол-во штор на 1 окно: <strong>".$array['quantity']." шт </strong><br>
					длина карниза 1 окна: <strong>".$array['cornice_length']." м </strong><br>
					высота от пола до карниза: <strong>".$array['ceiling_height']." м </strong><br>
					кол-во ткани: <strong>".$array['quantity_fabric']." м</strong><br>";

					$msg .= "цена: <strong>".$itemTotalPrice_format." ₽</strong>";
				$msg .= "</td>";

			$msg .= "</tr>";

			$i++;

		}


		$msg .= "<tr>";
		$msg .= "<td class='name'>Итого:</td><td>".number_format(round($total, 0), 0, '', ' ')." ₽</td>";
		$msg .= "</tr>";

	}
	
	$msg  .= "<tr><td colspan='2'></td></tr>";	
	if (!empty($connect))   		{ $msg .= "<tr><td class='name'>Форма связи:</td><td>$connect</td></tr>"; }
	if (!empty($object))   		{ $msg .= "<tr><td class='name'>Страница:</td><td>$object</td></tr>"; }	else { $msg .= "<tr><td class='name'>Страница:</td><td>Главная</td></tr>"; }
	$msg  .= "</tbody></table>";	
	
	$msg  .= "<style>.letter {max-width: 600px; border-collapse: collapse; margin-bottom: 30px;} .letter td {border: 1px solid #eee; padding: 7px 20px;} .letter td.name {color: #ccc;}</style>";
		
		
    $headers = "Content-Type: text/html; charset=utf-8\n";
    $headers .= 'From: '.get_bloginfo().' <no-replay@'.$_SERVER['HTTP_HOST'].'>' . "\r\n";	
	
	$response = '';

    // Отправляем почтовое сообщение
    if(wp_mail($mail_to, $theme, $msg, $headers)) {
        $response = 'Сообщение отправлено. <br>Мы свяжемся с вами в ближайшее время.';

		// Сохраняем отправленные формы в БД
		global $wpdb;
		$tablename = $wpdb->prefix."send_forms";

		$form_date = date("Y-m-d H:i:s");

		$wpdb->insert($tablename, array(
			'form_date' => $form_date,
			'form_theme' => $theme,
			'form_name'  => $name,
			'form_email' => $email,
			'form_phone' => $phone,
			'form_quest' => $quest,
		) );

	} else {
		$response = 'Ошибка при отправке.';
	}
	
    // Сообщение о результате отправки почты
    if ( defined( 'DOING_AJAX' ) && DOING_AJAX ){
        echo $response;
        wp_die();
    }
}

add_action('wp_ajax_nopriv_feedback', 'feedback_send' );
add_action('wp_ajax_feedback', 'feedback_send' );
[site-socialshare]
  • Комментарии
  • Вложения

Добавить комментарий

Пока нет комментариев. Будь первым!

Создаём корзину
Парсинг контента с различных сайтов
Рекомендации для васПарсинг контента с различных сайтовOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.