fbpx

Dzisiaj przyjrzymy się dość znanej funkcjonalności występującej głównie w sklepach internetowych. Za pomocą mechanizmu sesji w PHP wykonamy ćwiczenie, które zasymuluje proces wyboru produktu i dodania go do koszyka. Oczywiście, produkt będziemy mogli w każdej chwili z danego koszyka usunąć, a także umieszczać w koszyku wiele sztuk danego produktu. Myślę, że jest to ciekawe ćwiczenie, dla osób uczących się języka PHP, gdyż mechanizm sesji to jeden z ważniejszych jego elementów, który każdy powinien dobrze opanować. Po więcej wiadomości na temat PHP odsyłam do naszych kursów PHP.

Nie przedłużając, zabierzmy się do pracy. Jako, że będziemy korzystać z pliku z rozszerzeniem PHP, musimy oczywiście umieścić go na naszym lokalnym, bądź jak kto woli zdalnym serwerze. Ja skorzystam z serwera lokalnego. Na początku stwórzmy zwykły plik z rozszerzeniem *.php, a w nim umieśćmy standardowy szablon HTML5.

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Koszyk</title>
    <link rel="stylesheet" href="style.css">
</head>

<body>

    <header>
        <h1>Koszyk</h1>
        <div> <a href="koszyk.php">sklep</a> | <a href="koszyk.php?koszyk">koszyk</a></div>


    </header>
    <div id="container">

        <div id="left">
            <form action="" method="post">

                <table>
                    <caption>Produkty</caption>
                    <th>Nr.</th>
                    <th>Nazwa</th>
                    <th>Dodaj</th>
                </table>
            </form>

        </div>

        <div id="right">
        </div>

    </div>
</body>

</html>

Kilka słów na temat kodu – oprócz standardowego szablonu dodaliśmy dwie kolumny ‘left’ i ‘right’ – w lewej wyświetlimy sobie tabelkę z produktami, w prawej natomiast będzie się znajdował nasz koszyk. Jak widać mamy już nagłówki dla tabeli z produktami, jednak będziemy musieli resztę produktów wygenerować za pomocą języka PHP.

Stwórzmy więc plik functions.php gdzie umieścimy potrzebne nam mechanizmy.

<?php
function generate_products(){
    for($i=1;$i<21;$i++)
    {
        echo "      
    <tr>
        <td>$i</td><td>produkt$i</td><td><input type='submit' name='towar' value='produkt$i'></td>
        
    </tr>";
    }
}

Pierwsza funkcja generate_products() jak sama nazwa wskazuje ma za zadanie wygenerować 20 produktów w kolejnych wierszach. Nietypowo rozpoczynamy iterację od liczby 1. Oczywiście liczba produktów, które chcemy mieć dostępne w sklepie jest absolutnie dowolna.

function generate_cart(){
    echo "   
    <form action = '' method = 'post'>
    <table class='koszyk' border='3px solid'>
    <caption>Koszyk</caption>
    <th>Nr.</the><th>Produkt</th><th>Ilosc</th><th>Usuń</th>
    ";
    $i=0;
    foreach($_SESSION as $key=>$n)
    {
    $i++;
        echo "
        <tr>
        <td>$i</td><td>$key</td><td>$n</td>
        <td><input type='submit' name='towar-' value='$key' class='delete'></td>
        ";
    }
}

Dalej generate_cart() będzie miał za zadanie wyświetlić tabelkę z ewentualnymi produktami, które mają się znaleźć w koszyku. Widać tutaj już pewną koncepcję naszej pracy z sesjami. Będziemy tworzyć kolejne zmienne sesyjne o indeksie takim jak nazwa naszego produktu.  Wartość będzie natomiast oznaczała liczbę sztuk danego produktu.

function serve_post(){
    if(isset($_POST['towar']))
    {
        $towar = $_POST['towar'];
        if(!isset($_SESSION[$towar])) $_SESSION[$towar] = 1;
        else $_SESSION[$towar]++;
        header("Location: koszyk.php?koszyk");
    }
    if(isset($_POST['towar-']))
    {
        $towar = $_POST['towar-'];
        if($_SESSION[$towar]==1) unset($_SESSION[$towar]);
        else $_SESSION[$towar]--;
        header("Location: koszyk.php?koszyk");
    }
}

Wreszcie funkcja serve_post() będzie odpowiedzialna za obsługę danych przychodzących metodą POST. Jak widać są dwie opcję, albo dodajemy produkt do koszyka, albo go z niego usuwamy. Na koniec przekierowujemy na taki adres url, który pozwoli na wyświetlenie koszyka.

Wróćmy do naszego głównego pliku. Skoro korzystamy tutaj z mechanizmu sesji, to musimy o tym powiadomić nasz skrypt, tak by na samym początku mechanizm ten był inicjalizowany. Na samym początku pliku dodajmy więc:

<?php
session_start();
require_once('functions.php');
?>

Po pierwsze włączamy mechanizm sesji, po drugie załączamy plik z funkcjami, który oczywiście jest nam w tym przypadku niezbędny.

session_start();
require_once('functions.php');

if(!empty($_POST)){
    serve_post();
}

Już w następnych liniach możemy dodać mechanizm obsługi danych przesyłanych metodą POST. Oczywiście sprawdzamy, czy w ogóle jakieś dane takową metodą zostały przesłane.

<div id="left">
            <form action="" method="post">

                <table>
                    <caption>Produkty</caption>
                    <th>Nr.</th>
                    <th>Nazwa</th>
                    <th>Dodaj</th>
                    <?php
                    generate_products();
                     ?>
                </table>
            </form>
        </div>

W naszej lewej kolumnie możemy teraz dołączyć generowanie produktów w tabelce.

        <div id="right">
            <?php
            if((strpos($_SERVER['REQUEST_URI'], "?koszyk")))
                {
                    generate_cart();
                }
            ?>
        </div>

Podobnie postąpimy z prawą kolumną, tutaj z kolei zanim wygenerujemy nasz koszyk, musimy sprawdzić czy został dołączony odpowiedni ciąg znaków do adresu url.

Tak ostatecznie kształtuje się nasz główny plik – koszyk.php

<?php
session_start();
require_once('functions.php');

if(!empty($_POST)){
    serve_post();
}

?>
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Koszyk</title>
    <link rel="stylesheet" href="style.css">
</head>

<body>

    <header>
        <h1>Koszyk</h1>
        <div> <a href="koszyk.php">sklep</a> | <a href="koszyk.php?koszyk">koszyk</a></div>
    </header>
    <div id="container">

        <div id="left">
            <form action="" method="post">

                <table>
                    <caption>Produkty</caption>
                    <th>Nr.</th>
                    <th>Nazwa</th>
                    <th>Dodaj</th>
                    <?php
                    generate_products();
                     ?>
                </table>
            </form>
        </div>

        <div id="right">
            <?php
            if((strpos($_SERVER['REQUEST_URI'], "?koszyk")))
                {
                    generate_cart();
                }
            ?>
        </div>

    </div>
</body>

</html>

Został nam już jedynie dołączony plik ze stylami – jest ono rzecz jasna dowolne. Ja mój skrypt ostylowałem mniej więcej w ten sposób.

body {
    margin: 0 auto;
    font-family: 'consolas';

}

#container {
    display: flex;
}

header {
    background-color: #2c3e50;
    height: 150px;
    position: relative;
}

header h1 {
    color: white;
    position: absolute;
    top: 20%;
    text-align: center;
    margin: 0 auto;
    width: 100%;
}

header div {
    color: white;
    position: absolute;
    top: 70%;
    text-align: center;
    margin: 0 auto;
    width: 100%;
}

header a {
    color: white;
}

table,
td,
tr,
th {
    border: 2px solid black;
}

table {
    border-collapse: collapse;
    text-align: center;
}

caption {
    margin: 10px;
    font-weight: bold;
}

#left {
    width: 50%;
}

#right {
    width: 50%;

}

#right table {
    margin-left: auto;
}
input[type="submit"]:hover{
    cursor:pointer;
}

Myślę, że takie ćwiczenie pozwoli nam lepiej zapoznać się z mechanizmem sesji w PHP. Ciekawym udoskonaleniem tego projektu byłoby wysyłanie danych nie przez tradycyjny formularz HTML, ale na przykład za pomocą technologii AJAX. Warto postawić sobie takie zadanie w ramach własnego dopracowania projektu.