Корзина и заказы

Карточка товара

В карточку товара добавляем кнопку покупки с ссылкой наскрипт помещающий товар в корзину.

<a href="/catalog/add_to_cart.php" data-id="<?=$item['id'];?>" class="btn btn-default add-to-cart"><i class="fa fa-shopping-cart"></i>Add to cart</a>

Js для отправки POST запроса на добавление товара

Чтобы кнопка работала без перезагрузки, давайте добавим на неё js скрипт перехватывающий событие клика и отправляющий POST запрос по указанному адресу.

Обратите внимание, что класс features_items – это класс который у меня весит на обёртке вокруг всех товаров в категории. У вас этот класс может быть другим.

Саму функцию обработчик повесим на класс add-to-cart.

let productList = document.getElementsByClassName('features_items');
// добавление товара в корзину
if (productList[0]) {
    productList[0].addEventListener('click', addToBasket);
}

function addToBasket(event) {
    if (event.target.classList.contains('add-to-cart')) {
        event.preventDefault();
        serverRequest(
            '/catalog/add_to_cart.php', //event.target.href,
            'add',
            {id: event.target.dataset.id}
        ).then(
            request => {
                event.target.outerHTML = request;
            },
            error => console.log(error)
        );
    }
}

async function serverRequest(url, action, data = {}) {
    data['action'] = action;
    
    let response = await fetch(
        url, 
        {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8',
            },
            body: objectJoin(data, '=', '&')
        }
    );
    
    return await response.text();
}

function objectJoin(obj, delimitterKeyValue = '->', delimitterPair = ';') {
    let result = '';
    for (key in obj) {
        if (result != '') result += delimitterPair;
        result += '' + key + delimitterKeyValue + obj[key];
    }
    return result;
}

Скрипт добавления товара в корзину

По сути корзина – это массив в сессии $_SESSION[‘cart’]; где ключи – это ид добавленных товаров, значение – количество этого товара в корзине.

require_once('../setting.php');
if ($_POST['id']) {
    $_SESSION['cart'][$_POST['id']] = $_SESSION['cart'][$_POST['id']] ? $_SESSION['cart'][$_POST['id']] + 1: 1;
    
    echo '<p class="btn btn-default" style="margin-bottom: 25px;">Товар добавлен в корзину</p>';
}

Страница корзины

Выберем из БД те товары, id которых хранятся в сессии пользователя.

require_once('../setting.php');
require_once($setting['TEMPLATE_PATH'] . 'head.php');

$data = [];
if (isset($_SESSION['cart']) && !empty($_SESSION['cart'])) {
    $productIds = array_keys($_SESSION['cart']);
    $idsStr = implode(',', $productIds);
    $query = 'SELECT * FROM wshop_product 
        WHERE id IN ('.$idsStr.')';

    $result = $pdo -> prepare($query);
    $result->execute([]);
    $data = $result->fetchAll();
}

И просто выведем их на экран. Над суммарной стоимостью и скриптом её изменения при нажатии на кнопки “+” “-” предлагаю подумать читателю самостоятельно.

<?foreach($data as $key => $item) {?>
<tr>
    <td class="cart_product">
        <a href=""><img src="/images/<?=$item['image'];?>" alt="" height="100"></a>
    </td>
    <td class="cart_description">
        <h4><a href=""><?=$item['name'];?></a></h4>
    </td>
    <td class="cart_price">
        <p><?=$item['price'];?> р</p>
    </td>
    <td class="cart_quantity">
        <div class="cart_quantity_button">
            <a class="cart_quantity_up" href=""> + </a>
            <input class="cart_quantity_input" type="text" name="quantity" value="<?=$_SESSION['cart'][$item['id']];?>" autocomplete="off" size="2">
            <a class="cart_quantity_down" href=""> - </a>
        </div>
    </td>
    <td class="cart_total">
        <p class="cart_total_price">$59</p>
    </td>
    <td class="cart_delete">
        <a class="cart_quantity_delete" href=""><i class="fa fa-times"></i></a>
    </td>
</tr>
<?}?>

Остаётся только завернуть этот вывод в разметку вашего шаблона. Вот и всё дело осталось за малым.

Создать заказ

Страница вывода заказов пользователя

Делается аналогично любой странице выводящей какой либо список.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *