{% extends 'nav.html.twig' %}
{% block title %}Корзина{% endblock %}
{% block content %}
<div class="container d-flex pt-5" style="max-width: 1500px">
<div class="d-flex align-items-center p-3 text-white-50 bg-purple rounded box-shadow">
</div>
<div class="my-5 p-3 bg-white rounded box-shadow" style="width: 70%">
<h6 class="pb-2 mb-0 h4">Корзина</h6>
{% if cartPositions != null %}
<div class="form-check border-bottom border-gray">
<input class="form-check-input" type="checkbox" value="" id="selectAllCheck" onchange="selectAllCheckBox()" checked>
<label class="form-check-label" for="flexCheckDefault">
Выбрать все
</label>
</div>
{% for cartPosition in cartPositions %}
<div class="media pt-3 border-bottom border-gray" id="cartPositionItem">
{% if cartPosition.size.count == 0 %}
<div class="form-check">
<input class="form-check-input" style="margin-top: 50%" type="checkbox" value="" id="" disabled>
</div>
{% else %}
<div class="form-check">
<input class="form-check-input" style="margin-top: 50%" type="checkbox" onchange="calculatePurchaseInfo()" value="" id="cartPositionCkeck" checked>
<span style="display: none" id="cartPositionId">{{ cartPosition.id }}</span>
<span style="display: none" id="cartPositionProductSizeId">{{ cartPosition.size.id }}</span>
<span style="display: none" id="cartPositionProductId">{{ cartPosition.product.id }}</span>
</div>
{% endif %}
<img data-src="holder.js/32x32?theme=thumb&bg=007bff&fg=007bff&size=1" alt="45x45"
style="width: 45px; height: 45px;"
src="assets/images/{{ cartPosition.product.images[0].path }}"
data-holder-rendered="true" class="mr-2 rounded">
<div class="media-body pb-3 mb-0lh-125">
<div class="d-flex justify-content-between align-items-center w-100 h-100">
{% if cartPosition.size.count == 0 %}
<div>
<div>
<span class="text-gray-dark text-muted">{{ cartPosition.product.title }}</span>
<span class="text-gray-dark text-muted"> {{ cartPosition.size.size.title }}</span>
</div>
<div>
<span class="text-gray-dark">Товар закончился на складе</span>
</div>
</div>
{% else %}
<div>
<span class="text-gray-dark" id="cartItemTitle">{{ cartPosition.product.title }}</span>
<span class="text-gray-dark" id="cartItemSize"> {{ cartPosition.size.size.title }}</span>
</div>
{% endif %}
<form>
<div class="d-flex justify-content-between align-items-center w-100 h-100">
{% if cartPosition.size.count < cartPosition.count %}
<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">
{% else %}
<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">
{% endif %}
<div class="mr-3 h5">
<span class="text-gray-dark" id="cartItemPrice" style="width: 100px">{{ cartPosition.product.price }}</span>
₽ /шт
</div>
{% if cartPosition.id is not null %}
<button onclick="deleteItemFromCart({{ cartPosition.id }})" type="button" class="btn btn-danger">Удалить</button>
{% else %}
<button onclick="deleteItemFromLocalCart({{ loop.index }})" type="button" class="btn btn-danger">Удалить</button>
{% endif %}
</div>
</form>
</div>
</div>
</div>
{% endfor %}
{% endif %}
<small class="d-block text-right mt-3">
<a href="#">All suggestions</a>
</small>
</div>
{% if cartPositions != null %}
<div class="ml-auto my-5 p-3 bg-white rounded box-shadow" style="max-height: 170px">
<div class="d-flex" style="flex-direction: column;">
<div class="border-bottom border-gray">
{% if app.user %}
<button type="button" id="submitPurchaseBtn" class="btn btn-success btn-lg btn-block mt-1 w-100 mb-2" onclick="buyProductForUser()">Перейти к оформлению заказа</button>
{% else %}
<button type="button" id="submitPurchaseBtn" class="btn btn-success btn-lg btn-block mt-1 w-100 mb-2" onclick="buyProductForGuest()" >Перейти к оформлению заказа</button>
{% endif %}
</div>
<div class="d-flex flex-column">
<h4>Ваша корзина</h4>
<div class="d-flex justify-content-between">
<span class="font-weight-bold" id="purchaseInfoCount"></span>
<span class="font-weight-bold" id="purchaseInfoPrice" style="color: #1b9448"></span>
</div>
</div>
</div>
</div>
{% endif %}
</div>
{% endblock %}
{% block pagescripts %}
<script>
/**
* Выводит продукты пользователя из localStorage на страницу
*/
document.addEventListener('DOMContentLoaded', function () {
loadCartItems();
});
/**
* Отправляет запрос на получение позиций из корзины, для отображения их на странице
*/
function loadCartItems() {
let cart = localStorage.getItem('cart');
let data = JSON.stringify({'cartArray': cart});
let url = '/cart';
sendPostRequest(url, data)
.then(function (response) {
document.body.innerHTML = response;
calculatePurchaseInfo();
});
}
/**
* Удаляет товар из localStorage
*
* @param index
*/
function deleteItemFromLocalCart (index) {
let cart = localStorage.getItem('cart');
let itemsInCart = JSON.parse(cart);
itemsInCart.forEach(function (item, i) {
if (i === index-1)
itemsInCart.splice(i, 1);
});
localStorage.setItem('cart', JSON.stringify(itemsInCart));
loadCartItems();
}
/**
* Отправляет запрос на удаление товара из корзины в бд
*
* @param cartPositionId
*/
function deleteItemFromCart (cartPositionId) {
let url = '/deleteProductFromCart/' + cartPositionId;
sendGetRequest(url)
.then(function () {
loadCartItems()
})
}
/**
* Выбирает или снимает выделение со всех чекбоксов в корзине
*/
function selectAllCheckBox() {
let check = document.getElementById('selectAllCheck');
let cartPositionsChecks = document.querySelectorAll('input[id="cartPositionCkeck"]');
cartPositionsChecks.forEach(function (item) {
item.checked = check.checked;
});
calculatePurchaseInfo()
}
/**
* Рассчитывает общую стоимость и количество товаров в корзине
*/
function calculatePurchaseInfo() {
let items = document.querySelectorAll('div[id="cartPositionItem"]')
let data = { count: 0, price: 0 };
items.forEach(function (item) {
let check = item.querySelector('input[id="cartPositionCkeck"]');
if (check && check.checked) {
let { value: itemCount } = item.querySelector('input[type="number"]');
let { textContent: itemPrice } = item.querySelector('span[id="cartItemPrice"]');
data.count += parseInt(itemCount);
data.price += parseInt(itemCount) * parseInt(itemPrice);
}
})
updatePurchaseInfo(data);
checkSelectedAll();
}
/**
* Обновляет отображение общей стоимости и количества товаров в корзине
*
* @param data
*/
function updatePurchaseInfo(data) {
let count = document.querySelector('span[id="purchaseInfoCount"]')
let price = document.querySelector('span[id="purchaseInfoPrice"]')
count.innerHTML = 'Товары(' + data.count + ')';
price.innerHTML = data.price + 'Р';
}
/**
* Проверяет, выбраны ли все чекбоксы в корзине, и обновляет состояние кнопки "Перейти к оформлению заказа"
*/
function checkSelectedAll() {
let cartPositionsChecks = document.querySelectorAll('input[id="cartPositionCkeck"]');
let selectAllCheck = document.querySelector('input[id="selectAllCheck"]');
let submitPurchaseBtn = document.getElementById('submitPurchaseBtn');
let allChecked = Array.from(cartPositionsChecks).every(function(item) {
return item.checked;
});
let anyChecked = Array.from(cartPositionsChecks).some(function(item) {
return item.checked;
});
selectAllCheck.checked = allChecked;
submitPurchaseBtn.disabled = !anyChecked;
}
/**
* Собирает в массив данные со страницы для отправки их в запросе
*
* @param user
* @returns {*[]}
*/
function collectDataFromPageForCheckout(user) {
let items = document.querySelectorAll('div[id="cartPositionItem"]');
if (user) {
let cartItemIds = [];
items.forEach(function (item) {
let check = item.querySelector('input[id="cartPositionCkeck"]');
if (check && check.checked) {
cartItemIds.push(parseInt(item.querySelector('span[id="cartPositionId"]').textContent));
}
});
return cartItemIds;
} else {
let data = [];
items.forEach(function (item) {
let check = item.querySelector('input[id="cartPositionCkeck"]');
if (check && check.checked) {
let obj = {};
obj['count'] = parseInt(item.querySelector('input[id="cartPositionCountInput"]').value);
obj['sizeId'] = parseInt(item.querySelector('span[id="cartPositionProductSizeId"]').textContent);
obj['productId'] = parseInt(item.querySelector('span[id="cartPositionProductId"]').textContent);
data.push(obj);
}
});
return data;
}
}
/**
* Загружает страницу покупки товара для неавторизованного пользователя
*/
function buyProductForGuest() {
let data = JSON.stringify(collectDataFromPageForCheckout(false));
let url = '/cart/buyProduct';
sendPostRequest(url, data)
.then(function (response) {
document.body.innerHTML = response;
})
}
/**
* Загружает страницу покупки для авторизованного пользователя
*/
function buyProductForUser() {
let cartItemIds = JSON.stringify(collectDataFromPageForCheckout(true));
let url = '/cart/buyProduct';
sendPostRequest(url, cartItemIds)
.then(function (response) {
document.body.innerHTML = response;
});
}
/**
* Проверяет авторизован ли пользователь
*
* @param User
*/
function checkCheckoutForm(User) {
if (User) submitFormForAuthorizedUser()
else checkRegisteredUser();
}
/**
* Забирает данные из формы и отправляет их в следующую функцию
*/
function submitFormForAuthorizedUser() {
let form = document.getElementById('mainPurchaseForm');
let formData = new FormData(form);
confirmPurchase(formData);
}
/**
* Отправляет запрос на проверку наличия пользователя в бд
* Если такой пользователь есть, то заносит заказ в бд
* Если пользователя нет, то отправляет данные в функцию регистрации
*/
function checkRegisteredUser() {
let url = '/checkRegisteredUser';
let form = document.getElementById('mainPurchaseForm');
let formData = new FormData(form);
let email = {
'email': formData.get('purchaseForm[email]')
};
sendPostRequest(url, JSON.stringify(email))
.then(function (response) {
let responseData = JSON.parse(response)
if (responseData.resultCode === 0) registerUser(formData)
else confirmPurchase(formData)
});
}
/**
* Отправляет запрос на регистрацию пользователя
*
* @param data
*/
function registerUser (data) {
let registerData = new FormData();
let cart = localStorage.getItem('cart');
registerData.append('registration_form_buyer[name]', data.get('purchaseForm[firstName]'));
registerData.append('registration_form_buyer[email]', data.get('purchaseForm[email]'));
registerData.append('registration_form_buyer[agreeTerms]', '1');
registerData.append('registration_form_buyer[_token]', data.get('token'));
registerData.append('withOrder', true);
registerData.append('localStorageDataBuyer', cart);
let url = '/register';
sendPostRequest(url, registerData)
.then(function () {
confirmPurchase(data);
});
}
/**
* Отправляет запрос на добавление заказа в бд
*
* @param data
*/
function confirmPurchase(data) {
let url = '/cart/confirmPurchase';
sendPostRequest(url, data)
.then(function (response) {
setTimeout(function (){
showSuccessAlert('Заказ успешно сформирован')
loadCartItems()
}, 1000)
});
}
</script>
{% endblock %}