templates/shop/cart.html.twig line 1

Open in your IDE?
  1. {% extends 'nav.html.twig' %}
  2. {% block title %}Корзина{% endblock %}
  3. {% block content %}
  4.     <div class="container d-flex pt-5" style="max-width: 1500px">
  5.         <div class="d-flex align-items-center p-3 text-white-50 bg-purple rounded box-shadow">
  6.         </div>
  7.         <div class="my-5 p-3 bg-white rounded box-shadow" style="width: 70%">
  8.             <h6 class="pb-2 mb-0 h4">Корзина</h6>
  9.             {% if cartPositions != null %}
  10.                 <div class="form-check border-bottom border-gray">
  11.                     <input class="form-check-input" type="checkbox" value="" id="selectAllCheck" onchange="selectAllCheckBox()" checked>
  12.                     <label class="form-check-label" for="flexCheckDefault">
  13.                         Выбрать все
  14.                     </label>
  15.                 </div>
  16.                 {% for cartPosition in cartPositions %}
  17.                     <div class="media pt-3 border-bottom border-gray" id="cartPositionItem">
  18.                         {% if cartPosition.size.count == 0 %}
  19.                             <div class="form-check">
  20.                                 <input class="form-check-input" style="margin-top: 50%" type="checkbox" value="" id="" disabled>
  21.                             </div>
  22.                         {% else %}
  23.                             <div class="form-check">
  24.                                 <input class="form-check-input" style="margin-top: 50%" type="checkbox" onchange="calculatePurchaseInfo()" value="" id="cartPositionCkeck" checked>
  25.                                  <span style="display: none" id="cartPositionId">{{ cartPosition.id }}</span>
  26.                                  <span style="display: none" id="cartPositionProductSizeId">{{ cartPosition.size.id }}</span>
  27.                                  <span style="display: none" id="cartPositionProductId">{{ cartPosition.product.id }}</span>
  28.                             </div>
  29.                         {% endif %}
  30.                         <img data-src="holder.js/32x32?theme=thumb&amp;bg=007bff&amp;fg=007bff&amp;size=1" alt="45x45"
  31.                              style="width: 45px; height: 45px;"
  32.                              src="assets/images/{{ cartPosition.product.images[0].path }}"
  33.                              data-holder-rendered="true" class="mr-2 rounded">
  34.                         <div class="media-body pb-3 mb-0lh-125">
  35.                             <div class="d-flex justify-content-between align-items-center w-100 h-100">
  36.                                 {% if cartPosition.size.count == 0 %}
  37.                                     <div>
  38.                                         <div>
  39.                                             <span class="text-gray-dark text-muted">{{ cartPosition.product.title }}</span>
  40.                                             <span class="text-gray-dark text-muted"> {{ cartPosition.size.size.title }}</span>
  41.                                         </div>
  42.                                         <div>
  43.                                             <span class="text-gray-dark">Товар закончился на складе</span>
  44.                                         </div>
  45.                                     </div>
  46.                                 {% else %}
  47.                                     <div>
  48.                                         <span class="text-gray-dark" id="cartItemTitle">{{ cartPosition.product.title }}</span>
  49.                                         <span class="text-gray-dark" id="cartItemSize"> {{ cartPosition.size.size.title }}</span>
  50.                                     </div>
  51.                                 {% endif %}
  52.                                 <form>
  53.                                     <div class="d-flex justify-content-between align-items-center w-100 h-100">
  54.                                         {% if cartPosition.size.count < cartPosition.count %}
  55.                                             <input id="cartPositionCountInput" class="form-control mr-4" style="max-width: 150px" type="number" value="{{ cartPosition.size.count}}" min="1" max="{{ cartPosition.size.count }}" onchange="calculatePurchaseInfo()" onkeypress="return false">
  56.                                         {% else %}
  57.                                             <input id="cartPositionCountInput" class="form-control mr-4" style="max-width: 150px" type="number" value="{{ cartPosition.count }}" min="1" max="{{ cartPosition.size.count }}" onchange="calculatePurchaseInfo()" onkeypress="return false">
  58.                                         {% endif %}
  59.                                         <div class="mr-3 h5">
  60.                                             <span class="text-gray-dark" id="cartItemPrice" style="width: 100px">{{ cartPosition.product.price }}</span>
  61.                                             ₽ /шт
  62.                                         </div>
  63.                                         {% if cartPosition.id is not null %}
  64.                                                 <button onclick="deleteItemFromCart({{ cartPosition.id }})" type="button" class="btn btn-danger">Удалить</button>
  65.                                         {% else %}
  66.                                             <button onclick="deleteItemFromLocalCart({{ loop.index }})" type="button" class="btn btn-danger">Удалить</button>
  67.                                         {% endif %}
  68.                                     </div>
  69.                                 </form>
  70.                             </div>
  71.                         </div>
  72.                     </div>
  73.                 {% endfor %}
  74.             {% endif %}
  75.             <small class="d-block text-right mt-3">
  76.                 <a href="#">All suggestions</a>
  77.             </small>
  78.         </div>
  79.         {% if cartPositions != null %}
  80.             <div class="ml-auto my-5 p-3 bg-white rounded box-shadow" style="max-height: 170px">
  81.                 <div class="d-flex" style="flex-direction: column;">
  82.                     <div class="border-bottom border-gray">
  83.                         {% if app.user %}
  84.                                 <button type="button" id="submitPurchaseBtn" class="btn btn-success btn-lg btn-block mt-1 w-100 mb-2" onclick="buyProductForUser()">Перейти к оформлению заказа</button>
  85.                         {% else %}
  86.                                 <button type="button" id="submitPurchaseBtn" class="btn btn-success btn-lg btn-block mt-1 w-100 mb-2" onclick="buyProductForGuest()" >Перейти к оформлению заказа</button>
  87.                         {% endif %}
  88.                     </div>
  89.                     <div class="d-flex flex-column">
  90.                         <h4>Ваша корзина</h4>
  91.                         <div class="d-flex justify-content-between">
  92.                             <span class="font-weight-bold" id="purchaseInfoCount"></span>
  93.                             <span class="font-weight-bold" id="purchaseInfoPrice" style="color: #1b9448"></span>
  94.                         </div>
  95.                     </div>
  96.                 </div>
  97.             </div>
  98.         {% endif %}
  99.     </div>
  100. {% endblock %}
  101. {% block pagescripts %}
  102.     <script>
  103.         /**
  104.          * Выводит продукты пользователя из localStorage на страницу
  105.          */
  106.         document.addEventListener('DOMContentLoaded', function () {
  107.             loadCartItems();
  108.         });
  109.         /**
  110.          *  Отправляет запрос на получение позиций из корзины, для отображения их на странице
  111.          */
  112.         function loadCartItems() {
  113.             let cart = localStorage.getItem('cart');
  114.             let data = JSON.stringify({'cartArray': cart});
  115.             let url = '/cart';
  116.             sendPostRequest(url, data)
  117.                 .then(function (response) {
  118.                     document.body.innerHTML = response;
  119.                     calculatePurchaseInfo();
  120.                 });
  121.         }
  122.         /**
  123.          * Удаляет товар из localStorage
  124.          *
  125.          * @param index
  126.          */
  127.         function deleteItemFromLocalCart (index) {
  128.             let cart = localStorage.getItem('cart');
  129.             let itemsInCart = JSON.parse(cart);
  130.             itemsInCart.forEach(function (item, i) {
  131.                 if (i === index-1)
  132.                     itemsInCart.splice(i, 1);
  133.             });
  134.             localStorage.setItem('cart', JSON.stringify(itemsInCart));
  135.             loadCartItems();
  136.         }
  137.         /**
  138.          * Отправляет запрос на удаление товара из корзины в бд
  139.          *
  140.          * @param cartPositionId
  141.          */
  142.         function deleteItemFromCart (cartPositionId) {
  143.             let url = '/deleteProductFromCart/' + cartPositionId;
  144.             sendGetRequest(url)
  145.                 .then(function () {
  146.                     loadCartItems()
  147.                 })
  148.         }
  149.         /**
  150.          * Выбирает или снимает выделение со всех чекбоксов в корзине
  151.          */
  152.         function selectAllCheckBox() {
  153.             let check = document.getElementById('selectAllCheck');
  154.             let cartPositionsChecks = document.querySelectorAll('input[id="cartPositionCkeck"]');
  155.             cartPositionsChecks.forEach(function (item) {
  156.                 item.checked = check.checked;
  157.             });
  158.             calculatePurchaseInfo()
  159.         }
  160.         /**
  161.          * Рассчитывает общую стоимость и количество товаров в корзине
  162.          */
  163.         function calculatePurchaseInfo() {
  164.             let items = document.querySelectorAll('div[id="cartPositionItem"]')
  165.             let data = { count: 0, price: 0 };
  166.             items.forEach(function (item) {
  167.                 let check = item.querySelector('input[id="cartPositionCkeck"]');
  168.                 if (check && check.checked) {
  169.                     let { value: itemCount } = item.querySelector('input[type="number"]');
  170.                     let { textContent: itemPrice } = item.querySelector('span[id="cartItemPrice"]');
  171.                     data.count += parseInt(itemCount);
  172.                     data.price += parseInt(itemCount) * parseInt(itemPrice);
  173.                 }
  174.             })
  175.             updatePurchaseInfo(data);
  176.             checkSelectedAll();
  177.         }
  178.         /**
  179.          * Обновляет отображение общей стоимости и количества товаров в корзине
  180.          *
  181.          * @param data
  182.          */
  183.         function updatePurchaseInfo(data) {
  184.             let count = document.querySelector('span[id="purchaseInfoCount"]')
  185.             let price = document.querySelector('span[id="purchaseInfoPrice"]')
  186.             count.innerHTML = 'Товары(' + data.count + ')';
  187.             price.innerHTML = data.price + 'Р';
  188.         }
  189.         /**
  190.          * Проверяет, выбраны ли все чекбоксы в корзине, и обновляет состояние кнопки "Перейти к оформлению заказа"
  191.          */
  192.         function checkSelectedAll() {
  193.             let cartPositionsChecks = document.querySelectorAll('input[id="cartPositionCkeck"]');
  194.             let selectAllCheck = document.querySelector('input[id="selectAllCheck"]');
  195.             let submitPurchaseBtn = document.getElementById('submitPurchaseBtn');
  196.             let allChecked = Array.from(cartPositionsChecks).every(function(item) {
  197.                 return item.checked;
  198.             });
  199.             let anyChecked = Array.from(cartPositionsChecks).some(function(item) {
  200.                 return item.checked;
  201.             });
  202.             selectAllCheck.checked = allChecked;
  203.             submitPurchaseBtn.disabled = !anyChecked;
  204.         }
  205.         /**
  206.         * Собирает в массив данные со страницы для отправки их в запросе
  207.         *
  208.         * @param user
  209.         * @returns {*[]}
  210.         */
  211.         function collectDataFromPageForCheckout(user) {
  212.             let items = document.querySelectorAll('div[id="cartPositionItem"]');
  213.             if (user) {
  214.                 let cartItemIds = [];
  215.                 items.forEach(function (item) {
  216.                     let check = item.querySelector('input[id="cartPositionCkeck"]');
  217.                     if (check && check.checked) {
  218.                         cartItemIds.push(parseInt(item.querySelector('span[id="cartPositionId"]').textContent));
  219.                     }
  220.                 });
  221.                 return cartItemIds;
  222.             } else {
  223.                 let data = [];
  224.                 items.forEach(function (item) {
  225.                     let check = item.querySelector('input[id="cartPositionCkeck"]');
  226.                     if (check && check.checked) {
  227.                         let obj = {};
  228.                         obj['count'] = parseInt(item.querySelector('input[id="cartPositionCountInput"]').value);
  229.                         obj['sizeId'] = parseInt(item.querySelector('span[id="cartPositionProductSizeId"]').textContent);
  230.                         obj['productId'] = parseInt(item.querySelector('span[id="cartPositionProductId"]').textContent);
  231.                         data.push(obj);
  232.                     }
  233.                 });
  234.                 return data;
  235.             }
  236.         }
  237.         /**
  238.         * Загружает страницу покупки товара для неавторизованного пользователя
  239.         */
  240.         function buyProductForGuest() {
  241.             let data = JSON.stringify(collectDataFromPageForCheckout(false));
  242.             let url = '/cart/buyProduct';
  243.             sendPostRequest(url, data)
  244.                 .then(function (response) {
  245.                     document.body.innerHTML = response;
  246.                 })
  247.         }
  248.         /**
  249.         * Загружает страницу покупки для авторизованного пользователя
  250.         */
  251.         function buyProductForUser() {
  252.             let cartItemIds = JSON.stringify(collectDataFromPageForCheckout(true));
  253.             let url = '/cart/buyProduct';
  254.             sendPostRequest(url, cartItemIds)
  255.                 .then(function (response) {
  256.                     document.body.innerHTML = response;
  257.                 });
  258.         }
  259.         /**
  260.         * Проверяет авторизован ли пользователь
  261.         *
  262.         * @param User
  263.         */
  264.         function checkCheckoutForm(User) {
  265.             if (User) submitFormForAuthorizedUser()
  266.             else checkRegisteredUser();
  267.         }
  268.         /**
  269.         * Забирает данные из формы и отправляет их в следующую функцию
  270.         */
  271.         function submitFormForAuthorizedUser() {
  272.             let form = document.getElementById('mainPurchaseForm');
  273.             let formData = new FormData(form);
  274.             confirmPurchase(formData);
  275.         }
  276.         /**
  277.         * Отправляет запрос на проверку наличия пользователя в бд
  278.         * Если такой пользователь есть, то заносит заказ в бд
  279.         * Если пользователя нет, то отправляет данные в функцию регистрации
  280.         */
  281.         function checkRegisteredUser() {
  282.             let url = '/checkRegisteredUser';
  283.             let form = document.getElementById('mainPurchaseForm');
  284.             let formData = new FormData(form);
  285.             let email = {
  286.                 'email': formData.get('purchaseForm[email]')
  287.             };
  288.             sendPostRequest(url, JSON.stringify(email))
  289.                 .then(function (response) {
  290.                     let responseData = JSON.parse(response)
  291.                     if (responseData.resultCode === 0) registerUser(formData)
  292.                         else confirmPurchase(formData)
  293.                 });
  294.         }
  295.         /**
  296.         * Отправляет запрос на регистрацию пользователя
  297.         *
  298.         * @param data
  299.         */
  300.         function registerUser (data) {
  301.             let registerData = new FormData();
  302.             let cart = localStorage.getItem('cart');
  303.             registerData.append('registration_form_buyer[name]', data.get('purchaseForm[firstName]'));
  304.             registerData.append('registration_form_buyer[email]', data.get('purchaseForm[email]'));
  305.             registerData.append('registration_form_buyer[agreeTerms]', '1');
  306.             registerData.append('registration_form_buyer[_token]', data.get('token'));
  307.             registerData.append('withOrder', true);
  308.             registerData.append('localStorageDataBuyer', cart);
  309.             let url = '/register';
  310.             sendPostRequest(url, registerData)
  311.                 .then(function () {
  312.                     confirmPurchase(data);
  313.                 });
  314.         }
  315.         /**
  316.         * Отправляет запрос на добавление заказа в бд
  317.         *
  318.         * @param data
  319.         */
  320.         function confirmPurchase(data) {
  321.             let url = '/cart/confirmPurchase';
  322.             sendPostRequest(url, data)
  323.                 .then(function (response) {
  324.                     setTimeout(function (){
  325.                         showSuccessAlert('Заказ успешно сформирован')
  326.                         loadCartItems()
  327.                     }, 1000)
  328.             });
  329.             }
  330.     </script>
  331. {% endblock %}