W poprzednim artykule pokazałem jak napisać własny mechanizm sesji, natomiast teraz spróbujemy rozbudować go tak, aby stał się koszykiem na zakupy.
Aby osiągnąć cel potrzebujemy zdefiniować dwie klasy, pierwsza z nich będzie odpowiedzialna za pojedyncze produkty natomiast druga będzie zajmować się resztą.
Zacznijmy od pierwszej z nich.
class Product { var $intId; var $intQuantity; var $strType; } |
W zasadzie nie ma co tu opisywać, klasa zawiera trzy zmienne, pierwsza przechowuje ID produktu, druga ilość zamówionych produktów, a trzecia w zasadzie może być opcjonalna odpowiada za typ zamówionego produktu. Co ciekawe nasz obiekt nie zawiera żadnych metod, więc w zasadzie jego jedynym zastosowaniem (zgodnym z przeznaczeniem) jest przechowywanie zmiennych.
Teraz zajmijmy się drugą klasą, jakie będą jej możliwości? No cóż nie będzie tego wiele, ale jak na prawdziwy koszyk przystało będzie pozwalać na: dodawanie, usuwanie i modyfikowanie zamówionych produktów, teraz zobaczmy krótką część kodu.
define( ‘DELETE_ALL’, ‘DELETE_ALL’ );
class shoppingCart extends session function create( &$objSession ) |
Na samym początku definiujemy jedną stałą DELETE_ALL o wartości DELETE_ALL, może się to wydawać dziwne, ale ta stała przyda się w metodzie removeFromCart(), która będzie opisana na samym końcu, tymczasem zajmijmy się resztą naszego kodu. Pierwsza linijka mówi, że klasa shoppingCart jest rozszerzeniem klasy session (oczywiście, aby skorzystać z dobrodziejstw klasy session należy ją dołączyć do za pomocą funkcji include() tak samo ma się sprawa z klasą Produkt), to znaczy, że wewnątrz niej możemy korzystać z wszystkich metod i zmiennych klasy session. Zmienna $arrProduct będzie przechowywać tablice zawierającą wszystkie zamówione produkty.
Ten kto czytał poprzedni artykuł na pewno zauważy, że metoda create() jest niemal identyczna jak funkcja create() w klasie session, różnica polega na tym, że zamiast zajmować się obiektem typu session, zajmiemy się obiektem typu shoppingCart. Zostaje jeszcze pytanie co z metodą create() skoro w każdej z klas istnieją funkcje o takich nazwach? Otóż odpowiedź jest prosta, starsza z nich zostanie nadpisana przez nowszą, tak dzieje się zawsze przy dziedziczeniu.
Sama zasada działania tej metody została opisana wcześniej, więc nie ma sensu pisać tego ponownie, jednak pokrótce przypomnę do czego ona służy: A więc nasza metoda służy do tworzenia lub odserializowania sesji, wywołujemy ją za każdym razem przed użyciem jakiejkolwiek innej metody lub zmiennej.
Możemy już ‘odpalić’ nasz skrypt jednak wcześniej napiszmy kilka metod, które przydadzą się do obsługi koszyka, pierwszą z nich będzie addToCart().
function addToCart( $intId, $intQuantity, $strType ) { // 1 $intProductsNum = sizeof( $this -> arrProduct ); for( $i = 0; $i < $intProductsNum; $i++ ){ if ( $this -> arrProduct[$i] -> intId == $intId ) { return false; } } // 2 $this -> arrProduct[$intProductsNum] = new Product; // 3 $this -> arrProduct[$intProductsNum] -> intId = $intId; $this -> arrProduct[$intProductsNum] -> intQuantity = $intQuantity; $this -> arrProduct[$intProductsNum] -> strType = $strType; return true; } |
Jak sama nazwa wskazuje, za pomocą tej metody będziemy dodawać produkty do koszyka. Przy wywoływaniu metody podajemy trzy zmienne: $intId oznacza numer zamówionego produktu, $intQuantity to cyfra całkowita, która określa ilość zamówionych produktów natomiast $strType to ciąg znaków który określa typ produktu.
(1) Na początku sprawdzamy ile jest produktów w koszyku, a następnie przeglądamy tablice, jeżeli w koszyku znajdziemy produkt którego Id jest równe Id podanemu przy odwołaniu do metody zwracamy false, ponieważ taki produkt już jest w koszyku, a przecież nie chcemy ich dublować. (2) Skoro wiemy, że możemy dodać nasz towar do koszyka to tworzymy nową instancję klasy Produkt, (3) a następnie wypełniamy wszystkie zmienne podanymi wcześniej argumentami i zwracamy true co oznacza, że wszystko poszło dobrze.
Możemy już dodawać, produkty jednak nieraz zachodzi potrzeba zmiany czegoś, a więc napiszmy metodę która będzie modyfikować zamówienia.
function updateCart( $intId, $intQuantity = 0, $strType = 0 ) { // 1 $blnChangeMade = false; $intSize = sizeof( $this -> arrProduct ); // 2 for( $i = 0; $i < $intSize; $i++ ) { if ( $this -> arrProduct[$i] -> intId == $intId ) { // 3 if ( $intQuantity != 0 ) { $this -> arrProduct[$i] -> intQuantity = $intQuantity; $blnChangeMade = true; } // 4 if ( $strType != 0 ) { $this -> arrProduct[$i] -> strType = $strType; $blnChangeMade = true; } } // end if } // end for return $blnChangeMade; } |
Podobnie jak w poprzedniej funkcji tu również podajemy te same trzy argumenty, z tym, że dwa ostatnie są opcjonalne i w przypadku gdy nie będą podane otrzymają wartość 0. (1) Na początek ustawiamy $blnChangeMade na false oraż sprawdzamy ilość produktów w koszyku. (2) Pętla for przeszukuje całą tablicę, jeżeli znajdzie produkt, którego id jest równe id podanemu przy wywołaniu metody to sprawdza następne warunki. (3) Jeżeli $intQuantity jest różne od 0 to zmieniamy ilość zamówionych produktów na $intQuantity oraz $blnChangeMade ustawiamy na true, co oznacza, że zmiana została dokonana. (4) Tak samo postępujemy dla $strType, na koniec zwracamy $blnChangeMade.
Na koniec zostało nam usuwanie produktów, może od razu zobaczmy kod?
function removeFromCart( $intId = DELETE_ALL ) { // 1 if ( $intId == DELETE_ALL ) { unset( $this -> arrProduct ); $this -> arrProduct = array(); } else { $intSize = sizeof( $this -> arrProduct ); // 2 for( $i = 0; $i < $intSize; $i++ ) { if ( $this -> arrProduct[$i] -> intId == $intId ) { unset( $this -> arrProduct[$i] ); } } } } |
Jak widać funkcja pobiera jeden argument, który jest opcjonalny (warto zwrócić uwagę, że tutaj korzystamy ze wcześniej zdefiniowanej stałej DELETE_ALL). (1) Jeżeli argument nie zostanie podany usuwamy cały koszyk, w przeciwnym wypadku (2) przeglądamy całą tablicę w poszukiwaniu określonego produktu i jeżeli zostanie znaleziony to usuwamy go.
I to już wszystko, zostało jedynie pokazać jak z tego korzystać, co prawda było to już w poprzednim artykule, ale na wszelki wypadek podam jakiś prosty przykład raz jeszcze.
shoppingCart :: create( $objCart );
/** // dodawanie produktow do koszyka // usuwanie produktow z koszyka // serializuje sesje |
No cóż na koniec zostaje mi tylko pochwalić się, że skrypt opisany w obydwu artykułach był jedną z trzech nagrodzonych prac w konkursie „Obiektowość dla początkujących” w portalu php.pl, więc mam nadzieję, że ten artykuł pomoże wyjaśnić istotę programowania obiektowego.