PHP - OOP webshop készítés

Szerző: Bonjasky

A következő cikkben megmutatom, hogyan lehet weboldalunkra egy nagyon egyszerű kis webshopot készíteni, hogy az OOP legyen. 

A webshop csak egy példa lesz az objektum orientált programozása, tehát nem fog valódi webshopként funlcionálni, csak a nagyon alap dolgokat csináltam meg benne, amik a következők: Termék kategória létrehozása, termékek hozzáadása a kategóriákhoz, termék hozzáadássa a kosárhoz, termékek törlése.

Mivel tényleg csak egy példáról lesz szó, ezért a webshop nem kapott tényleges adatbázist, csak SESSION munkamenetekben fogom tárolni az adatokat. Ezeket viszont könnyen át lehetne írni, hogy egy tényleges SQL adatbázis legyen mögöttük, de ez a cikk csak a legegyszerűbb OOP elveket kívája bemutatni, egy kis magyarázattal. A tényleges program letölthető a cikk alján a .zip fájlban. 

 

php oop webshop

Egyelőre nem a szépségéről lesz híres :) 

Lássuk tehát a fájlokat, objektumokat:

A webshop fájlai a következők lettek:

  1. webshop.php
  2. modules/Kosar.Class.php
  3. modules/Termekek.Class.php
  4. modules/Kategoriak.Class.php
  5. modules/Menu.Class.php

webshop.php

Ebben a fájlban példányosítunk, és ide hívjuk meg az összes többi fájlz a modules mappából, valamint itt hoztam létre a tömböket, amikben az adatokat tároljuk:

  1. $_SESSION["kosaram"]
  2. $_SESSION["termekek"]
  3. $_SESSION["kategoriak"]

 

modules/Kosar.Class.php

Ebben a fájlban van a Kosar nevű osztály, amiben minden olyan funkciót belepakoltam, ami a webshop "kosárhoz adás", "kosárból törlés" funkciójához is kell, valamint a következő függvényeket:

  • Add() - Termék hozzáadása a kosárhoz
  • Remove() - Termék törlése a kosárból
  • Show() - egy bizonyos elem megjelenítése a kosárból (csak ellenörzés céljából hoztam létre, a végleges webshop nem használja)
  • ShowAll() - A kosár elemeinek megjelenítése

 

modules/Termekek.Class.php

  • AddTermekForm() - "új termék hozzáadása" a webshophoz funkció űrlapját jelenítni meg
  • AddTermek() - Ez dolgozza fel, és adja hozzá a terémket a webshop kínálatához
  • TermekLista() - Kilistázza a webshopban található összes terméket, és az alapvető adataikat
  • RemoveTermek() - Ez az űrlap arra szolgál, hogy megjelenítse, az itemeket, és lehetőséget ad a törlésre
  • Remove() - Ez dolgozza fel a RemoveTermek() által átadott itemeket, és törli a kínálatból

 

modules/Kategoriak.Class.php

  • AddKategoriaForm() - megjeleníti a "kategória hozzáadása" űrlapját
  • AddKategoria() - ez dolgozza fel az AddKategoriaForm()-ból kapott értékeket, majd létrehozza az új kategóriát
  • ShowAllKategoria() - Létrehoz egy legördülő menüt, ami kilistázza az összes kategóriát, ezt használja az AddTermkekekForm() nevű objektum is

 

modules/Menu.Class.php

  • Fomenu() - Ez jeleníti meg a főmenüt a "webshopban", a navigációs linkeket
  • MenuSelector() - Ez a függvény tölti be a kiválasztott aloldalt a menü alatt

 

 

És most lássuk, hogy mi is van a konkrét fájlokban: 

webshop.php

ob_start();

session_start(); //elindítjuk a sessiont, ez nagyon fontos, mert az összes adatot ezekben a tömbökben fogjuk tárolni

if(!$_SESSION["kosaram"]) 

$_SESSION["kosaram"] = array(); //kosár tartalma


  if(!$_SESSION["termekek"]) //a termékek ebbe kerülnek bele

$_SESSION["termekek"] = array();

  if(!$_SESSION["kategoriak"]) // a kategóriákat itt tároljuk

$_SESSION["kategoriak"] = array();

  //a szükséges php fájlokat behívjuk

require_once("modules/Menu.Class.php");

require_once("modules/Termekek.Class.php");

require_once("modules/Kategoriak.Class.php");

require_once("modules/Kosar.Class.php");

    //példányosítjuk az osztályokat

$kosar = new Kosar;

$termek = new Termekek;

$kategoria = new Kategoriak;

$menu = new Menu;

  //kiírjuk a főmenüt

$menu->Fomenu();


    //Ezeket a kikommentezett részeket nyugodtan ki lehet próbálni, hogy mit csinálnak

//$kategoria->AddKategoriaForm();

  //$kategoria->ShowAllKategoria();

  //unset($_SESSION["termekek"]);

//unset($_SESSION["kategoriak"]);

//unset($_SESSION["kosaram"]);

    //$termek->AddTermekForm();

  //$termek->TermekLista();

  //print_r($_SESSION["termekek"]);

//print_r($_SESSION["kosaram"]);

//print_r($_SESSION["kategoriak"]);

//session_destroy();

//$kosar->Remove(1);

//$kosar->Show(0);

//$kosar->ShowAll();

//print count($kosaram);

 

Nézzük meg a következő sorokat: 

if(!$_SESSION["kosaram"]) 
$_SESSION["kosaram"] = array(); //kosár tartalma

itt az az if feltétel azért kell, mert ha nem lenne ott, az oldal újratöltődésénél, tehát bármilyen linkre kattintásnál, újra létrehozná a tömböt - üresen. 

Tehát ennek ez a fájl fogja létrehozni a tömböket(array()), amik tárolják az adatokat, és az összes aloldalon elérhetőek lesznek. 

 

modules/Kosar.Class.php

class Kosar
{


public function Add($termekId, $nev, $darab) //ez a függvény fogja hozzáadni a terméket a kosárhoz

{

$create_id = count($_SESSION["kosaram"]) +1; //Erre azért van szükség, hogy minden itemnek legyen egy egyedi Id értéke, ezt úgy hozza létre, hogy megszáolja, hogy mennyi item van most a tömbbe, ls hozzáad 1-et

$NewData = array("id" => $create_id, "termekId" => $termekId, "nev" => $nev, "darab" => $darab);

array_push($_SESSION["kosaram"], $NewData); //array_push-al hozzáadjuk a kétdimenziós tömbhöz az új itemet

echo '<br>sikeresen hozzáadva a kosárhoz!<br>';

}

public function Remove($id)

{

unset($_SESSION["kosaram"][$id]); //unset-el töröljük az itemet a tömbböl, méghozzá az általunk létrehozott id alapján

}

public function Show() //kiírja, hogy hány darab termék van a kosarunkban

{

print('a kosárban ennyi item van: '.count($_SESSION["kosaram"]).'<br>');

}

public function ShowAll()

{

print '<br> Kosaram:<br><table border="1"> <tr> <td>Id</td> <td>Név</td> <td>Kategória</td> <td> Ár </td> <td> Db </td> <td>Végleges ár </td> <td> </td> <tr> ';

foreach($_SESSION["kosaram"] as $k => $v) //foreach-el járjuk be a kétdimenziós tömbünket

{

print '<tr> <form id="" action="" method="POST">';

print '<input type="hidden" name="id" value="'.$_SESSION["kosaram"][$k]["id"].'">';

print '<td>'.$_SESSION["kosaram"][$k]["id"].' </td>';

print '<td>'.$_SESSION["kosaram"][$k]["nev"].' </td>';

print '<td> '.$_SESSION["kategoriak"][$_SESSION["termekek"][$_SESSION["kosaram"][$k]["termekId"]-1]["kategoria"]-1]["nev"].' </td>';

print '<td> '.$_SESSION["termekek"][$_SESSION["kosaram"][$k]["termekId"]-1]["ar"].' </td>';

print '<td>'.$_SESSION["kosaram"][$k]["darab"].'</td>';

print '<td>'.$_SESSION["kosaram"][$k]["darab"] * $_SESSION["termekek"][$_SESSION["kosaram"][$k]["termekId"]-1]["ar"].'</td>';

print '<td><input type="submit" name="torol" value="töröl"> </form> </td></tr>';

}

print '</table>';

if(count($_SESSION["kosaram"]) ===0)

{

print 'A kosár üres';

}

if(isset($_POST["torol"]))

{

$this->Remove($_POST["id"]-1);

}

}

}
 
 
array_push($_SESSION["kosaram"], $NewData);
array_push-al hozzáadjuk a kétdimenziós tömbhöz az új itemet, ennek a tömb, így néz ki jelenleg: 
 
(
    [0] => Array 
        (
            [id] => 1
            [termekId] => 1
            [nev] => Windows 10 Pro
            [darab] => 1
        )
 
    [1] => Array
        (
            [id] => 2
            [termekId] => 2
            [nev] => iPhone 11 Pro
            [darab] => 1
        )
 
    [2] => Array
        (
            [id] => 3
            [termekId] => 1
            [nev] => Windows 10 Pro
            [darab] => 1
        )
 
)
 
Én jobban szeretem, ha egy "adatbázisban" nem 0-val, hanem 1-el kezdjük az indexelést, ezért kell az a +1, de persze enélkül is működne, csak akkor minden helyről törölni kellene, ahol használjuk.
 
Láthatunk egy ilyen ronda sort: 
$_SESSION["kategoriak"][$_SESSION["termekek"][$_SESSION["kosaram"][$k]["termekId"]-1]["kategoria"]-1]["nev"] Ehhez egy egy kis magyarázat, hogy mi is történik: 
Ez a sor a kategóriák tömbből id index alapján írja ki a kategória nevét, mégpedig a kosár tömbben lévő termekId és kategória segítségével.
Ez azért van így, hogy a kategória nevét csak 1 helyen tároljuk el, és az egész webshop onnan szedi a nevét. 
 
 

modules/Termekek.Class.php

Ebben az osztályban valósítjuk meg, a termékekhez kapcsolódó műveleteket:

  • Termékek hozzáadása a termékek tömbbhöz, array_push() függvénnyel.
  • A teljes kínálat kiírássa, és lehetőséged adása a kosárba helyezésre.
  • Egy termék eltávolítás a kínálatból, mind a feldolgozó, mind a megjelenítés része ebben az osztáyban van.
class Termekek
{

public function AddTermek($nev, $kategoria, $ar)

{

$create_id = count($_SESSION["termekek"]) +1; //itt is azért szükséges az +1, hogy 1-tól kezdődjön az indexelés a tömbben

$NewData = array("id" => $create_id, "nev" => $nev, "kategoria" => $kategoria, "ar" => $ar);

array_push($_SESSION["termekek"], $NewData); //új item hozzáadása a termekek tömbbhöz, a módszer ugyaz az, mint a kosárnál volt

}



public function AddTermekForm()

{

print '<br>Új termék hozzáadása a kínálathoz <br><table border="1">';

print '<form action="" method="POST">';

print '<tr><td>Név:</td> <td><input type="text" name="nev"></td></tr>'; print (new Kategoriak)->ShowAllKategoria(); //ez a rész azért kell, mert itt is példányosítani kell a Kategoriak osztályt, ha fel akarunk használni onnan egy objektumot

print '<tr><td>Ár:</td> <td><input type="text" name="ar"></td></tr>';

print '<tr><td><input type="submit" name="kuldes"> </td></tr>';

print '</form>';

print '</table>';

if(isset($_POST['kuldes']))

{

$this->AddTermek($_POST["nev"], $_POST["kategoria"], $_POST["ar"]); //$this-el hívunk meg egy, az osztályon belül lévő objektumot, itt éppen az AddTermek-et

}

}



public function TermekLista() //termékek kiírása

{

print '<br> Termékek:<br><table border="1"> <tr> <td>Id</td> <td>Név</td> <td>Kategória</td> <td> Ár </td> <td>Db </td> <td> </td><tr> ';

foreach($_SESSION["termekek"] as $k => $v) // a termekek tömb bejárása foreach-el

{

print '<tr> <form id="'.$_SESSION["termekek"][$k]["id"].'" action="" method="POST">';

print '<input name="id" value="'.$_SESSION["termekek"][$k]["id"].'" type="hidden">';

print '<input name="nev" value="'.$_SESSION["termekek"][$k]["nev"].'" type="hidden">';

print '<td>'.$_SESSION["termekek"][$k]["id"].'</td>';

print '<td>'.$_SESSION["termekek"][$k]["nev"].'</td>';

print '<td>'.$_SESSION["kategoriak"][$_SESSION["termekek"][$k]["kategoria"]-1]["nev"].'</td>';

print '<td>'.$_SESSION["termekek"][$k]["ar"].'</td>';

print '<td> <input type"text" name="db" value="1"></td>';

print '<td> <input type="submit" value="Kosárba" name="kuld"> </td> </form> </tr>';

}

print '</table>';

if(isset($_POST["kuld"]))

{

(new Kosar)->Add($_POST["id"],$_POST["nev"],$_POST["db"]);

}

if(count($_SESSION["termekek"]) ===0)

{

print 'Jelenleg nem található termék';

}

}

public function Remove($id)

{

unset($_SESSION["termekek"][$id]); //egy termék törlése a tömbből, id alapján

}

public function RemoveTermek()

{

print '<br> Termékek:<br><table border="1"> <tr> <td>Id</td> <td>Név</td> <td>Kategória</td> <td> Ár </td> <td>Db </td> <td> </td><tr> ';

foreach($_SESSION["termekek"] as $k => $v) //itt is foreach-el jártjuk be a termekek tömböt

{

print '<tr> <form id="'.$_SESSION["termekek"][$k]["id"].'" action="" method="POST">';

print '<input name="id" value="'.$_SESSION["termekek"][$k]["id"].'" type="hidden">';

print '<input name="nev" value="'.$_SESSION["termekek"][$k]["nev"].'" type="hidden">';

print '<td>'.$_SESSION["termekek"][$k]["id"].'</td>';

print '<td>'.$_SESSION["termekek"][$k]["nev"].'</td>';

print '<td>'.$_SESSION["kategoriak"][$_SESSION["termekek"][$k]["kategoria"]-1]["nev"].'</td>';

print '<td>'.$_SESSION["termekek"][$k]["ar"].'</td>';

print '<td> <input type"text" name="db" value="1"></td>';

print '<td> <input type="submit" value="töröl" name="termektorol"> </td> </form> </tr>';

}

print '</table>';

if(isset($_POST["termektorol"]))

{

$this->Remove($_POST["id"]); // az osztályon belüli Remove() függvény meghívása a $this-el

}

if(count($_SESSION["termekek"]) ===0)

{

print 'Jelenleg nem található termék';

}

}
 

modules/Kategoriak.Class.php

Ebben az osztályban valósul meg, minden olyan művelet, ami a webshopban a kategóriákkal kapcsolatos, tehát:

Új kategória létrehozása

Kategórialista létrehozása, így ezt a SELECT menüt bárhol használhatjuk a webshopon belül.

class Kategoriak
{


public function AddKategoria($nev)

{

$create_id = count($_SESSION["kategoriak"]) +1;

$NewData = array("id" => $create_id, "nev" => $nev);

array_push($_SESSION["kategoriak"], $NewData);

} public function AddKategoriaForm()

{

print '<br>Új kategória hozzáadása <br><table border="1"><form action="" method="POST">';

print '<tr><td> Kategória neve: </td> <td> <input type="text" name="nev"> </td></tr>';

print '<tr><td><input type="submit" value="Hozzáad" name="katkuldes"></td></tr>';

print '</form></table>';

if(isset($_POST['katkuldes']))

{ $this->AddKategoria($_POST['nev']);

}

}

public function ShowAllKategoria()

{

print '<tr><td>Kategória </td>';

print '<td><select name="kategoria">';

foreach($_SESSION["kategoriak"] as $k => $v)

{

print '<option value="'.$_SESSION["kategoriak"][$k]["id"].'">'.$_SESSION["kategoriak"][$k]["nev"].'</option>';

}

print '</select></td></tr>';

}

}
 

modules/Menu.Class.php

Ebben az osztályban vannak elhelyezve a menü megjelenítéséért, és vezérléséért felelős objektumok

Class Menu
{

public function Fomenu() //főmenü kiírása

{

print '<a href="webshop.php">Termékek</a> | <a href="webshop.php?oldal=kategoria_hozzaadasa">Új termék kategória</a> | <a href="webshop.php?oldal=termek_hozzaadasa">Új termék hozzáadása</a> | <a href="webshop.php?oldal=termek_torlese">Termék törlése a kínálatból</a> | <a href="webshop.php?oldal=kosaram">Kosaram('.count($_SESSION["kosaram"]).')</a>';

$this->MenuSelector(); //Menü vezérlő behívása a $this segítségével

}

public function MenuSelector()

{

if(isset($_GET["oldal"])) //mivel GET-et használunk, így ellenőrizzük az értékét, ha üres, a főoldalon vagyunk, így kiírjuk a termékek listáját

{

switch(($_GET["oldal"]))

{
case 'kategoria_hozzaadasa':
(new Kategoriak)->AddKategoriaForm(); //példányosítani kell minden case elágazásban, mivel különböző osztályokból szeretnénk hibatkozni
break;
case 'termek_hozzaadasa ':
(new Termekek)->AddTermekForm(); // Termékek hozzáadása oldal
break;
case 'termek_torlese':
(new Termekek)->RemoveTermek(); //Termék törlése
break;
case 'kosaram':
(new Kosar)->ShowAll(); //Kosár tartalmanák kiírása
break;
default:
(new Termekek)->TermekLista(); //Teljes terméklista kiírása

}
}
else
{
(new Termekek)->TermekLista(); //ha nincs GET, Teljes terméklista kiírása
}


}

}
 
Ennyi lett volna, egy tényleg nagyon egyszerű, OOP webshop  készítése, nagyon alap funkciókkal, tömb adatbázissal. 
A következőkben, ezt az a kis alap webshopot fogjuk továbbfejleszteni. 
 

2020-02-16 17:56:48

Értékelés 0.0 /5