jQuery(document).ready(function($) { // Открытие/закрытие модалки // $(document).on('click', '.cart-contents, .continue-shopping, .modal__close', function(e) { // e.preventDefault(); // $('#modal-basket').toggleClass('active'); // }); // Обновление количества через input $(document).on('change', '.counter__input', function () { const $input = $(this); const key = $input.data('key'); const quantity = parseInt($input.val(), 10); if (quantity > 0) { updateCart(key, quantity, false); const $item = $input.closest('.modal-basket-item__control'); const $priceElement = $item.find('.woocommerce-Price-amount'); const currentPriceText = $priceElement.text().replace(/[^\d,]/g, '').replace(',', '.'); const currentTotal = parseFloat(currentPriceText); // Защита от деления на 0 if (!isNaN(currentTotal) && currentTotal > 0) { const oldQuantity = parseInt($input.prop('defaultValue'), 10); const unitPrice = currentTotal / oldQuantity; const newTotal = unitPrice * quantity; // Получаем текущий символ валюты из разметки const currencySymbol = $priceElement.find('.woocommerce-Price-currencySymbol').text().trim(); // Формируем новую цену с тем же символом $priceElement.find('bdi').html( newTotal.toLocaleString('ru-RU', { minimumFractionDigits: 0 }) + ' ' + currencySymbol + '' ); // Обновить значение по умолчанию (чтобы расчёт unitPrice был корректен в следующий раз) $input.prop('defaultValue', quantity); } } else { removeItem(key); } }); $(document).on('click', '.modal__basket .counter__button.plus', function(e) { e.preventDefault(); const key = $(this).data('key'); const input = $(this).siblings('.counter__input'); const quantity = parseInt(input.val()) + 1; input.val(quantity).trigger('change'); }); // // Уменьшение количества $(document).on('click', '.modal__basket .counter__button.minus', function(e) { e.preventDefault(); const key = $(this).data('key'); const input = $(this).siblings('.counter__input'); let quantity = parseInt(input.val()) - 1; if (quantity <= 0) { removeItem(key); // Вызываем удаление, если количество становится 0 } else { input.val(quantity).trigger('change'); // Обновляем количество, если больше 0 } }); $(document).on('click', '.remove-item', function() { const key = $(this).data('key'); removeItem(key); }); // Удаление товара function formatMoney(amount) { if (typeof woocommerce_params !== 'undefined' && woocommerce_params.currency_format) { const format = woocommerce_params.currency_format; return format .replace('%1$s', woocommerce_params.currency_symbol) .replace('%2$s', parseFloat(amount).toFixed(2)); } return woocommerce_params.currency_symbol + parseFloat(amount).toFixed(2); } // Хранилище временно удалённых товаров const removedItemsStorageKey = 'woocommerce_removed_items'; function restoreRemovedItems() { const removedItems = JSON.parse(localStorage.getItem(removedItemsStorageKey)) || []; if (removedItems.length === 0) return; $('#modal-basket').addClass('loading'); // Создаем копию массива для работы let itemsToRemove = [...removedItems]; function processNextItem() { if (itemsToRemove.length === 0) { // Все элементы обработаны localStorage.removeItem(removedItemsStorageKey); updateCartFragment(); $('#modal-basket').removeClass('loading'); return; } const element = itemsToRemove.shift(); // Берем первый элемент $.ajax({ type: 'POST', url: woocommerce_params.ajax_url, data: { action: 'remove_cart_item', cart_item_key: element.key }, success: function(response) { if (response.success) { // Обновляем localStorage, удаляя только что обработанный элемент const currentItems = JSON.parse(localStorage.getItem(removedItemsStorageKey)) || []; const updatedItems = currentItems.filter(item => item.key !== element.key); localStorage.setItem(removedItemsStorageKey, JSON.stringify(updatedItems)); } // Обрабатываем следующий элемент processNextItem(); }, error: function() { // Продолжаем даже при ошибке processNextItem(); } }); } // Начинаем обработку processNextItem(); } // Инициализация при загрузке restoreRemovedItems(); // Функция удаления товара с возможностью восстановления function removeItem(key) { const $item = $(`[data-key="${key}"]`); const productId = $item.data('product_id'); const variationId = $item.data('variation_id') || 0; const quantity = parseInt($item.find('.counter__input').val()); $('#modal-basket').addClass('loading'); $.ajax({ type: 'POST', url: woocommerce_params.ajax_url, data: { action: 'remove_cart_item', cart_item_key: key }, complete: function() { $('#modal-basket').removeClass('loading'); }, success: function(response) { if (response.success) { // Удаляем из временного хранилища const removedItems = JSON.parse(localStorage.getItem(removedItemsStorageKey)) || []; const updatedItems = removedItems.filter(item => !(item.product_id === productId && item.variation_id === variationId) ); localStorage.setItem(removedItemsStorageKey, JSON.stringify(updatedItems)); updateCartFragment(); // $('[data-key="' + key + '"]').remove() } } }); } // Восстановление товара function restoreItem(key, productId, variationId, quantity) { $('#modal-basket').addClass('loading'); $.ajax({ type: 'POST', url: woocommerce_params.ajax_url, data: { action: 'restore_cart_item', product_id: productId, variation_id: variationId, quantity: quantity }, complete: function() { $('#modal-basket').removeClass('loading'); }, success: function(response) { if (response.success) { // Удаляем из временного хранилища const removedItems = JSON.parse(localStorage.getItem(removedItemsStorageKey)) || []; const updatedItems = removedItems.filter(item => !(item.product_id === productId && item.variation_id === variationId) ); localStorage.setItem(removedItemsStorageKey, JSON.stringify(updatedItems)); // Показываем кнопку Proceed to checkout $('.proceed-to-checkout').css('display', ''); updateCartFragment(); } } }); } // --- Работа с cookie --- function setCookie(name, value, days) { let expires = ''; if (days) { const date = new Date(); date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); expires = '; expires=' + date.toUTCString(); } document.cookie = name + '=' + (value || '') + expires + '; path=/'; } function getCookie(name) { const nameEQ = name + '='; const ca = document.cookie.split(';'); for(let i=0;i < ca.length;i++) { let c = ca[i]; while (c.charAt(0)==' ') c = c.substring(1,c.length); if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); } return null; } // --- Конец работы с cookie --- // Открытие корзины при первом добавлении товара function openBasketOnFirstAdd() { if (!getCookie('basket_popup_shown')) { console.log('[openBasketOnFirstAdd] Срабатывает открытие корзины'); // Выбираем только модалку, в которой находится корзина var $basket = $('#modal-basket'); var $modal = $basket.closest('.modal'); var $aside = $modal.find('.modal__aside'); var device = window.screen.width; // Сброс только внутри этой модалки var $items = $modal.find('.modal__item'); console.log('[openBasketOnFirstAdd] modal:', $modal.get(), 'modal__item:', $items.get()); $items.removeClass('active').attr('style', ''); $modal.addClass('active').show(); $basket.addClass('active').css({opacity: 1, filter: 'blur(0px)'}); console.log('[openBasketOnFirstAdd] basket:', $basket.get()); var width = $basket[0] ? $basket[0].clientWidth : 600; setTimeout(function() { if (device <= 720) { $aside.css('width', device + 'px'); console.log('[openBasketOnFirstAdd] aside width:', device + 'px'); } else { $aside.css('width', width + 'px'); console.log('[openBasketOnFirstAdd] aside width:', width + 'px'); } }, 10); setCookie('basket_popup_shown', '1', 30); } else { console.log('[openBasketOnFirstAdd] Куки уже установлены, попап не открывается'); } } // Обновление корзины при добавлении товара $(document.body).on('added_to_cart', function() { updateCartFragment(); openBasketOnFirstAdd(); }); // Функция обновления количества function updateCart(key, quantity, update_full = true) { $.ajax({ type: 'POST', url: '/wp-admin/admin-ajax.php', // Используем стандартный параметр WooCommerce data: { action: 'update_cart_quantity', cart_item_key: key, quantity: quantity }, beforeSend: function() { $('#modal-basket').addClass('loading'); }, complete: function() { $('#modal-basket').removeClass('loading'); }, success: function(response) { if (response.success) { updateCartFragment(update_full); } else { console.error('Ошибка при обновлении корзины'); } }, error: function(xhr, status, error) { console.error('AJAX ошибка:', error); } }); } // Обновление фрагментов корзины function updateCartFragment(update_full=true) { $.ajax({ type: 'POST', url: woocommerce_params.ajax_url, data: { action: 'get_cart_fragment' }, beforeSend: function() { $('#modal-basket').addClass('loading'); }, complete: function(response) { $('#modal-basket').removeClass('loading'); console.log(response) }, success: function(response) { console.log(response); if (response.success) { if (update_full){ $('#modal-basket-content').html(response.data.contents); } $('.modal-block-price__price').html(response.data.total); $('#modal-basket-footer').html(response.data.cart_bottom) $('.mini-profile__button--counter').text(response.data.count); if (response.data.count > 0) { $('.mini-profile__button--counter').removeClass('disabled'); } else { $('.mini-profile__button--counter').addClass('disabled'); } } }, error: function(xhr, status, error) { console.error('AJAX error:', error); } }); } // Добавляем спиннер на кнопку 'Добавить в корзину' в корзине $('body').on('click', '.add_to_cart_button', function() { var btn = $(this); if (!btn.hasClass('loading')) { btn.addClass('loading'); btn.data('original-text', btn.html()); btn.css('position', 'relative'); btn.html(''); } }); // Убираем спиннер после завершения ajax WooCommerce $(document.body).on('added_to_cart', function(e, fragments, cart_hash, $button) { if ($button && $button.length) { $button.removeClass('loading'); if ($button.data('original-text')) { $button.html($button.data('original-text')); $button.removeData('original-text'); } } }); $('.detail form.cart').on('submit', function(e) { e.preventDefault(); var $form = $(this); product_id = $form.find('button[name=add-to-cart]').val(), quantity = $form.find('input.qty').val() || 1; console.log(product_id); $.ajax({ url: wc_add_to_cart_params.ajax_url, type: 'POST', data: { action: 'woocommerce_ajax_add_to_cart', product_id: product_id, quantity: quantity, }, success: function(response) { if (response.error && response.product_url) { window.location = response.product_url; return; } updateCartFragment(); openBasketOnFirstAdd(); }, error: function(xhr) { console.log('AJAX Error:', xhr.responseText); alert('Ошибка добавления товара.'); } }); }); }); jQuery(function($){ $('form.cart').on('submit', function(e){ e.preventDefault(); var $form = $(this); var $button = $form.find('button[type="submit"]'); var product_id = $button.val(); var quantity = $form.find('input.qty').val() || 1; $.ajax({ type: 'POST', url: wc_add_to_cart_params.ajax_url, data: { action: 'woocommerce_ajax_add_to_cart', product_id: product_id, quantity: quantity, }, beforeSend: function() { $button.addClass('loading'); }, success: function(response) { if (response.error && response.product_url) { window.location = response.product_url; return; } $(document.body).trigger('added_to_cart', [response.fragments, response.cart_hash, $button]); $button.removeClass('loading'); } }); }); });