PHP - OOP webshop készítés
Szerző: BonjaskyA 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.
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:
- webshop.php
- modules/Kosar.Class.php
- modules/Termekek.Class.php
- modules/Kategoriak.Class.php
- 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:
- $_SESSION["kosaram"]
- $_SESSION["termekek"]
- $_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);
}
}
}
$_SESSION["kategoriak"][$_SESSION["termekek"][$_SESSION["kosaram"][$k]["termekId"]-1]["kategoria"]-1]["nev"]
Ehhez egy egy kis magyarázat, hogy mi is történik:
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
}
}
}
2020-02-16 17:56:48