Darmowy fragment publikacji:
IDZ DO
IDZ DO
PRZYK£ADOWY ROZDZIA£
PRZYK£ADOWY ROZDZIA£
SPIS TREĎCI
SPIS TREĎCI
KATALOG KSI¥¯EK
KATALOG KSI¥¯EK
KATALOG ONLINE
KATALOG ONLINE
ZAMÓW DRUKOWANY KATALOG
ZAMÓW DRUKOWANY KATALOG
TWÓJ KOSZYK
TWÓJ KOSZYK
DODAJ DO KOSZYKA
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
CENNIK I INFORMACJE
ZAMÓW INFORMACJE
ZAMÓW INFORMACJE
O NOWOĎCIACH
O NOWOĎCIACH
ZAMÓW CENNIK
ZAMÓW CENNIK
CZYTELNIA
CZYTELNIA
FRAGMENTY KSI¥¯EK ONLINE
FRAGMENTY KSI¥¯EK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
PHP i MySQL. Tworzenie
sklepów internetowych
Autorzy: Daniel Bargie³, Sebastian Marek
ISBN: 83-7361-359-5
Format: B5, stron: 244
Coraz wiêcej firm oferuje swoje towary w internecie. Taka metoda prezentowania
oferty umo¿liwia dotarcie do wiêkszej liczby klientów i zredukowanie kosztów
wynikaj¹cych z prowadzenia tradycyjnej dzia³alnoġci handlowej. Rozwój handlu
elektronicznego spowodowa³ zwiêkszenie zainteresowania us³ugami zwi¹zanymi
z tworzeniem sklepów internetowych.
Do realizacji sklepu internetowego wielu programistów wykorzystuje duet PHP i MySQL.
PHP jest najpopularniejszym jêzykiem skryptowym interpretowanym po stronie serwera.
Ci¹gle rozwijany i rozbudowywany PHP jest wykorzystywany przez tysi¹ce autorów
dynamicznych aplikacji WWW korzystaj¹cych z baz danych. Rolê zaplecza
bazodanowego doskonale spe³ni baza MySQL — prosta i wydajna, a co najwa¿niejsze,
dostêpna nieodp³atnie podobnie, jak PHP. Napisanie efektywnego i bezpiecznego
sklepu internetowego to ciekawe wyzwanie dla programisty. Mo¿e i Ty spróbujesz siê
z nim zmierzyæ?
Jeġli myġlisz o podjêciu tego wyzwania, to ksi¹¿ka „PHP i MySQL. Tworzenie sklepów
internetowych” jest dla Ciebie idealn¹ lektur¹. Zawiera wszystkie informacje, jakich
potrzebujesz, by zaprojektowaæ i napisaæ funkcjonalny, wydajny i bezpieczny sklep
internetowy, korzystaj¹c z jêzyka PHP i bazy danych MySQL.
• Konfiguracja ġrodowiska projektowego i uruchomieniowego
• Szablony Smarty, biblioteka PEAR i narzêdzia kontroli sesji
• Projekt aplikacji z rozbiciem na modu³y
• Zagadnienia zwi¹zane z bezpieczeñstwem sklepu i transakcji
• Obs³uga formularzy
• Zastosowanie s³owników
• Katalog produktów
• Wykonanie modu³u koszyka na zakupy
• Modu³ administracyjny
• Obs³uga zamówieñ
• Wyszukiwarka towarów
Spis treści
Wstęp ...................................................z...................................................z........... 7
Rozdział 1. Koncepcja sklepu internetowego...................................................z... 11
Część publiczna...................................................l...................................................l...........11
Część administracyjna...................................................l...................................................l.12
Rozdział 2. Co należy wiedzieć...................................................z........................ 15
Środowisko pracy — Windows i Linux...................................................l.........................15
System operacyjny ...................................................l...................................................l15
Serwer WWW...................................................l...................................................l.......17
PHP: Hypertext Preprocessor ...................................................l..................................19
MySQL ...................................................l...................................................l.................19
Podstawowa konfiguracja środowiska...................................................l.....................21
Smarty — oddzielenie kodu PHP od HTML-a ...................................................l..............24
Instalacja systemu szablonów Smarty ...................................................l.....................25
Konfiguracja systemu szablonów Smarty...................................................l................26
Pierwszy szablon...................................................l...................................................l...27
Złożone szablony ...................................................l...................................................l..29
Komunikacja z bazą danych...................................................l...........................................31
Standaryzacja interfejsu dostępu do danych ...................................................l............31
PEAR oraz pakiet Database ...................................................l.....................................32
Mechanizmy obsługi i raportowania błędów ...................................................l.................38
Typy błędów ...................................................l...................................................l.........38
Obsługa błędów poprzez standardowe funkcje języka PHP.......................................40
Obsługa błędów w zbiorze bibliotek PEAR ...................................................l............46
Mechanizmy autoryzacji użytkownika i sesje...................................................l................50
Identyfikacja użytkownika...................................................l.......................................50
Mechanizmy sesji...................................................l...................................................l..63
XML jako narzędzie konfiguracji aplikacji ...................................................l...................69
Cele korzystania z plików konfiguracyjnych...................................................l...........69
Dane konfiguracyjne w dokumentach XML...................................................l............70
Dane informacyjne w plikach XML ...................................................l........................72
Rozdział 3. Projekt aplikacji ...................................................z........................... 75
Interfejs użytkownika...................................................l...................................................l..76
Nagłówek strony ...................................................l...................................................l...77
Menu główne sklepu ...................................................l................................................78
Część centralna sklepu...................................................l.............................................78
Stopka strony ...................................................l...................................................l........80
4
PHP i MySQL. Tworzenie sklepów internetowych
Struktura i konfiguracja aplikacji...................................................l...................................80
Struktura katalogowa ...................................................l...............................................80
Konfiguracja serwisu ...................................................l...............................................83
Przetwarzanie żądań...................................................l.................................................84
Struktura bazy danych...................................................l...................................................l.85
Użytkownicy i klienci sklepu...................................................l...................................86
Produkty...................................................l...................................................l................87
Kategorie...................................................l...................................................l...............90
Producenci...................................................l...................................................l.............91
Zamówienia...................................................l...................................................l...........92
Słowniki ...................................................l...................................................l................94
Biblioteka zdjęć ...................................................l...................................................l....95
Budowa modułowa aplikacji...................................................l..........................................96
Rdzeń aplikacji...................................................l...................................................l......97
Przykładowy prosty moduł aplikacji ...................................................l.......................98
Rozdział 4. Bezpieczeństwo ...................................................z.......................... 103
Bezpieczeństwo systemu operacyjnego oraz serwera WWW.........................................103
Cel instalacji serwera ...................................................l.............................................104
Tylko potrzebne usługi ...................................................l..........................................104
Bezpieczna konfiguracja serwera WWW ...................................................l..............105
Bezpieczeństwo wykorzystywanego oprogramowania...................................................l105
Instalacja PHP jako pliku wykonywalnego CGI ...................................................l...105
Instalacja PHP jako modułu Apache...................................................l......................107
Opcja register_globals ...................................................l...........................................108
Raportowanie błędów ...................................................l............................................110
Ukrywanie PHP ...................................................l...................................................l..111
Aktualizacje ...................................................l...................................................l........111
Bezpieczeństwo własnej aplikacji...................................................l................................112
Brak walidacji danych...................................................l............................................112
Nieskuteczne mechanizmy kontroli dostępu i autoryzacji........................................113
Nieprawidłowe zarządzanie kontami oraz sesjami użytkowników ..........................115
Ataki typu Cross-Site Scripting (XSS) ...................................................l..................116
Wstrzykiwanie kodu ...................................................l..............................................117
Przechowywanie niezabezpieczonych danych ...................................................l......119
Bezpieczeństwo bazy danych...................................................l.......................................119
Zarządzanie hasłami...................................................l...................................................l..120
Rozdział 5. Obsługa formularzy ...................................................z..................... 121
Format dokumentu XML definiującego formularz...................................................l......121
Pola formularza i reguły walidacyjne ...................................................l....................122
Dokument form.xml...................................................l...............................................124
Moduł formularza...................................................l...................................................l......128
Metody obiektów klasy Forms...................................................l...............................128
Konfiguracja obiektu formularza w skryptach PHP .................................................130
Wyświetlanie formularza w szablonach Smarty...................................................l....132
Testowanie aplikacji z formularzem...................................................l......................134
Rozdział 6. Słowniki i ich zastosowanie...................................................z......... 139
Object — klasa bazowa dla obiektów ...................................................l..........................140
Dane adresowe — klasa State, Country oraz AddressType............................................141
Słowniki wykorzystywane przy składaniu zamówień
— klasa DeliveryType, PaymentType, OrderStatus...................................................l..145
Waluty i stawki podatku VAT — klasa Currency oraz TaxRate....................................146
Parametry asortymentu — klasa Parameter ...................................................l.................147
Spis treści
5
Producenci produktów — klasa Producer...................................................l....................148
Biblioteka zdjęć — klasa Image...................................................l...................................148
Przesyłanie zdjęć na serwer — pakiet HTTP_Upload..............................................150
Zapisywanie zdjęć w bazie danych...................................................l........................153
Pobieranie zdjęć z bazy danych ...................................................l.............................153
Rozdział 7. Kategorie i produkty ...................................................z................... 155
Asortyment i produkt — różnice i zastosowania ...................................................l.........155
Asortyment sklepu — klasa Item...................................................l...........................155
Dodawanie nowego asortymentu do sklepu ...................................................l..........158
Produkty dostępne w ofercie sklepu — klasa Product................................................162
Produkty w promocji...................................................l...................................................l.167
Obsługa promocji — moduł Special...................................................l......................168
Zarządzanie promocjami...................................................l........................................170
Kategorie produktów...................................................l...................................................l.171
Struktura katalogowa — klasa Catalog...................................................l..................172
Wyświetlanie struktury katalogowej...................................................l......................173
Zarządzanie kategoriami...................................................l........................................174
Rozdział 8. Koszyk ...................................................z....................................... 177
Sesja jako podstawowy mechanizm realizacji koncepcji koszyka..................................178
Moduł koszyka — klasa Basket ...................................................l...................................179
Operacje na produktach w koszyku ...................................................l.......................180
Operacje na sumarycznych wartościach cen produktów w koszyku ........................182
Składanie zamówienia ...................................................l...........................................182
Wyświetlanie koszyka w szablonie TPL...................................................l......................184
Rozdział 9. Rejestracja i zarządzanie klientami ................................................. 189
Koncepcja użytkowników aplikacji ...................................................l.............................190
Klasy użytkownika –— User oraz CustomUser ...................................................l....190
Rejestracja nowego użytkownika...................................................l.................................193
Pierwszy etap rejestracji — wypełnienie formularzy rejestracyjnych......................194
Drugi etap rejestracji — aktywacja konta użytkownika.................................................208
Proces gromadzenia danych za pomocą wielu formularzy .............................................210
Zarządzanie klientami ...................................................l..................................................211
Rozdział 10. Obsługa zamówień ...................................................z...................... 213
Warunki złożenia zamówienia ...................................................l.....................................213
Moduł zamówienia — klasa Order ...................................................l..............................216
Właściwości i metody obiektów klasy Order ...................................................l........216
Zarządzanie zamówieniami ...................................................l...................................218
Rozdział 11. Wyszukiwanie informacji ...................................................z............. 221
Formularz wyszukiwarki...................................................l..............................................221
Analizator danych ...................................................l...................................................l.....222
Wyszukiwanie informacji — klasa Search ...................................................l..................225
Stworzenie i wysłanie zapytania do bazy danych — metoda makeSQLQuery() .....226
Pobieranie wyników wyszukiwania — metoda fetchQueryResult() ........................229
Rozdział 12. Instalacja sklepu internetowego...................................................z.. 231
Instalacja sklepu od strony serwera WWW ...................................................l.................231
Instalacja sklepu od strony bazy danych ...................................................l......................232
Plik konfiguracyjny sklepu internetowego...................................................l...................232
Skorowidz ...................................................z...................................................z.. 235
Rozdział 8.
Koszyk
Koncepcja koszyka w sklepie internetowym została zapożyczona z rzeczywistości.
Podczas wizyty w zwykłym sklepie przeglądamy półki sklepowe w poszukiwaniu in-
teresujących nas towarów. Towar, który znajduje się na półkach, nie jest rozłożony na
nich dowolnie, lecz pogrupowany według pewnych kryteriów. Na przykład nabiał
może znajdować się w lodowce, a soki owocowe na górnekj półce pod ścianą.
W hipermarketach całe działy zorganizowane są w ten sposób. Rozłożenie towaru
(odpowiadającego produktom w naszym sklepie internetowym) w odpowiednim miej-
scu sklepu, które dodatkowo może być stosownie opisane, odpowiada kategoriom
w naszym wirtualnym sklepie.
Wyobraźmy sobie teraz, że klient zauważa interesujący go towar, który chce kupić.
Chwyta towar, biegnie do kasy, płaci, zostawia za sklepem (daje komuś, ewentualnie
wiezie do domu), po czym wraca po następny. Łatwo sobie wyobrazić, że zrobienie
nieco większych zakupów w takim przypadku zabrałoby kkilka dni lub nawet tygodni.
Dlatego też klienci sklepów i hipermarketów używają koszyków lub wózków, do któ-
rych mogą powkładać produkty. Gdy już umieszczą w koszykach wszystko, co chcą
kupić, niosą je do kasy, gdzie towar jest podliczany i gdzie następuje zapłata (gotów-
ką, kartą, czekiem).
Mechanizm koszyka jest również wykorzystywany w sklepie internetowym. Dzięki
takiemu rozwiązaniu internauta odwiedzający sklep internetowy, gdy znajdzie jakiś
interesujący go produkt, może dodać go do koszyka, a następnie powrócić do dalszego
przeglądania asortymentu sklepu. Koszyk będzie „pamiętał”, jakie produkty wybrał
klient. Z kolei sam klient może następnie zamówić wszystkie produkty znajdujące się
w koszyku.
Koszyk zakupów w sklepie internetowym ma jeszcze tę przewagę nad koszykiem
zakupów w rzeczywistym sklepie, że użytkownik może zwiększać lub zmniejszać
liczbę sztuk produktów w koszyku bez potrzeby ponownego odwiedzania kategorii,
które zawierają te produkty.
178
PHP i MySQL. Tworzenie sklepów internetowych
Przykładowa zawartość koszyka w aplikacji sklepu internetowego dodanego do książki
została pokazana na rysunku 8.1.
Rysunek 8.1.
Zawartość koszyka
w aplikacji sklepu
internetowego
dołączonego do książki
Sesja jako podstawowy mechanizm
realizacji koncepcji koszyka
Koszyk ma to do siebie, że powinien „pamiętać” swoją zawartość niezależnie od tego,
na której stronie sklepu w danym momencie znajduje się użytkownik. Co więcej, je-
żeli opuści on serwis sklepu internetowego, a po pewnym czasie powróci do niego, to
koszyk wciąż powinien zawierać produkty, które użytkkownik do niego dodał.
Idealnym rozwiązaniem jest przechowywanie obiektu koszyka w zmiennej sesyjnej. Dzięki
temu wszystkie opisane powyżej problemy rozwiązujemky za jednym zamachem.
W sklepie internetowym, który został dołączony do książki, klasę obiektu koszka ($C
UMGV) można znaleźć w pliku modułu koszyka o nazwie basket.inc.php.
Pliki aplikacji sklepu internetowego dołączonego do książki można znaleźć na CD-
-ROM-ie, w katalogu sklepinternetowy. Skrypt modułu koszyka znajduje się w kata-
logu sklepinternetowy/modules/basket/.
W naszym sklepie internetowym moduł koszyka jest jawnie określany w pliku konfi-
guracyjnym, tak jak zostało to pokazane na listinguk 8.1.
Listing 8.1. Plik module.cfg.xml
!ZONXGTUKQPGPEQFKPIWVH!
EQPHKI
Rozdział 8. ♦ Koszyk
179
UGEVKQPKFOQFWNGU
RCTCOKF$CUMGVRCVJOQFWNGUDCUMGVHKNGDCUMGVKPERJR
UGEVKQP
EQPHKI
W głównym pliku części publicznej (mindex.php) moduł koszyka jest ładowany przez
metodę NQCF/QFWNG rdzenia aplikacji (listing 8.2):
Listing 8.2. Ładowanie modułu koszyka przez metodę loadModule obiekktu rdzenia aplikacji
KH
2 #4KU TTQT
GTTCRR QTG NQCF/QFWNG
$CUMGV ]
GEJQ
CRR QTG IGV.CUV TTQT/GUUCIG
GZKV
_
Moduł koszyka powinien być załadowany jeszcze przed rozpoczęciem sesji (UGU
UKQPAUVCTV), ponieważ sesja przechowuje obiekt koszyka, a więc definicja klasy
obiektu musi już być znana interpreterowi PHP.
Obiekt koszyka tworzony jest tylko jeden raz w czasie trwania konkretnej sesji
(listing 8.3).
Listing 8.3. Tworzenie obiektu koszyka w skrypcie mindex.php
!RJR
4QRQEúEKGUGULK
UGUUKQPAUVCTV
1DKGMVMQU[MCVYQTQP[LGUVPCRQEæVMW
KH
KUUGV
A5 55+10= $CUMGV ?]
UGUUKQPATGIKUVGT
$CUMGV
A5 55+10= $CUMGV ?PGY$CUMGV
_
!
Od tej pory koszyk może być używany przez internautę, kktóry robi zakupy w sklepie.
Moduł koszyka — klasa Basket
Jak większość tego typu obiektów w sklepie internetowym również moduł koszyka nie
stanowi samodzielnego modułu. Współpracuje ściśle z modułem produktu (2TQFWEV)
oraz z modułem zamówień (1TFGT), dlatego też na początku pliku definiującego klasę
$CUMGV znajduje się kod dołączający pliki obu modułów.
180
PHP i MySQL. Tworzenie sklepów internetowych
Ponieważ moduł 1TFGT również korzysta z modułu 2TQFWEV, można by pominąć
w skrypcie modułu $CUMGV fragment kodu ładującego moduł 2TQFWEV. Jednak po-
nieważ w pliku modułu $CUMGV mamy bezpośrednie odwołania do obiektów klasy
2TQFWEV, dobrze jest jawnie określić, jakie moduły są wykorpzystywane przez obiekt.
Moduł zawierający definicję obiektu klasy 2TQFWEV został opisany w poprzednim
rozdziale, natomiast moduł zawierający definicję obiektu klasy 1TFGT zostanie opi-
sany w rozdziale „Obsługa zamówień”.
Obiekty klasy $CUMGV posiadają jedynie dwie właściwości:
ARTQFWEVU — jest to tablica, która zawiera obiekty produktów dokdanych
do koszyka;
AOCZSWCPVKV[ — limit sztuk jednego produktu w koszyku (wartość dokmyślnie
jest ustawiana na 10).
Metody obiektów klasy $CUMGV można podzielić na trzy grupy:
Metody bezpośrednio operujące na zawartości koszyka, kczyli na produktach,
które się w koszyku znajdują: IGV$CUMGV, CFF2TQFWEV, EJCPIG2TQFWEV QWPV,
IGV2TQFWEV(TQO$CUMGV, ENGCT$CUMGV.
Metody operujące na wartościach cen netto i brutto pkroduktów znajdujących się
w koszyku: IGV6QVCN2TKEG, IGV6QVCN2TKEG0GVVQoraz IGV6QVCN2TKEG$TWVVQ.
Metoda składająca wykonująca proces składania zamówkienia: RNCEG1TFGT.
Opis poszczególnych metod obiektów klasy $CUMGV, lista ich atrybutów oraz rodzaj
zawracanej wartości zostały opisane w pliku modułu kopszyka basket.inc.php.
Operacje na produktach w koszyku
Korzystając z metod wymienionych powyżej, w pierwszej grupie programista może
dodać produkt do koszyka poprzez proste wywołanie metody CFF2TQFWEV. Musi jedynie
dysponować 32-znakowym identyfikatorem produktu (wynikk działania funkcji OF).
Jeżeli dodanie produktu do koszyka się nie powiedzie (bo np. produkt o podanym identy-
fikatorze nie istnieje), metoda CFF2TQFWEV zwróci obiekt klas 2 #4A TTQT. W skrypcie
realizującym operację dodawania produktu do koszyka stosowny fragment kodu wy-
gląda jak na listingu 8.4 (plik sklepinternetowy/www/public/basket/addtobasket.php):
Listing 8.4. Fragment pliku addtobasket.php — dodanie produktu do koszyka
!RJR
5RTCYFGPKGE[RQFCPQOKGPPæV[RW) 6UVCPQYKæEæKFGPV[HKMCVQTUQDKGMVWRTQFWMVW
KH
KUUGV
A) 6= RTQFKF ?]
KH
2 #4KU TTQT
A5 55+10= $CUMGV ? CFF2TQFWEV
A) 6= RTQFKF ?]
1RGTCELCFQFCPKCRTQFWMVWFQMQU[MCPKGRQYKQFđCUKUú
Rozdział 8. ♦ Koszyk
181
9[ħYKGVNGPKGMQOWPKMCVWQDđúFKG
_GNUG]
1RGTCELCFQFCPKCRTQFWMVWFQMQU[MCRQYKQFđCUKú
9[ħYKGVNGPKGKPHQTOCELKRQVYKGTFCLæEGLFQFCPKGRTUQFWMVWFQMQU[MC
_
_
!
Jak widać, z punktu widzenia programisty korzystającego z interfejsu obiektu koszy-
ka dodanie produktu do koszyka jest naprawdę banalne. Cała praca sprowadza się do
wyświetlenia odpowiedniego komunikatu informującego użytkownika o tym, czy opera-
cja dodania produktu do koszyka powiodła się czy też nie.
Jeżeli wystąpił błąd (czyli metoda CFF2TQFWEV zwróciła obiekt klasy 2 #4A TTQT), kom-
pletną treść komunikatu o tym błędzie można uzyskać poprzez wywołanie CRR QTG
IGV.CUV TTQT/GUUCIG
.
Metoda CFF2TQFWEV sama sprawdzi, czy produkt, który ma być dodany, nie znajduje
się już w koszyku i, jeżeli tak jest, zamiast dodawać nowy obiekt do koszyka (czyli
tworzyć nowy obiekt klasy 2TQFWEV) zwiększy jedynie liczbę sztuk tego produktu.
Operacja ta jest powtarzana, dopóki liczba sztuk danego produktu w koszyku nie
osiągnie wartości maksymalnej (określonej we właściwości AOCZSWCPVKV[ obiektu
koszyka).
Modyfikacja zawartości koszyka oznacza zmianę liczby produktów znajdujących się
koszyku lub też usunięcie ich. Za realizację tego zadania odpowiedzialna jest metoda
EJCPIG2TQFWEV QWPV obiektów klasy $CUMGV.
Przykładowy kod wykorzystujący tę metodę wygląda jak na listingu 8.5 (patrz plik
sklepinternetowy/www/public/basket/displaybasket.phcp):
Listing 8.5. Fragment pliku displaybasket.php — zmiana liczby sztuk danego produktu w koszyku
!RJR
KH
2 #4KU TTQT
A5 55+10= $CUMGV ? EJCPIG2TQFWEV QWPV
A) 6= RTQFKF ?
A) 6= CEV ?]
9[UVæRKđDđæFŌPKGOQľPCOQF[HKMQYCèCYCTVQħEKUđQYPKMC
_
!
Jak widać w powyższym przykładzie, metoda EJCPIG2TQFWEV QWPV przyjmuje dwa pa-
rametry: identyfikator obiektu produktu (obiektu klasy 2TQFWEV), którego liczba sztuk
ma zostać zmieniona, oraz nowa liczba sztuk wybranego produktu. Jeżeli nowa liczba
sztuk produktu wynosi zero, produkt jest usuwany z kkoszyka.
Jeżeli internauta będzie chciał wyczyścić koszyk zakupów, to programista obsługujący
akcje użytkownika może to zrobić, wywołując metodę ENGCT$CUMGV obiektu koszyka.
Metoda nie przyjmuje żadnych parametrów.
182
PHP i MySQL. Tworzenie sklepów internetowych
Operacje na sumarycznych wartościach
cen produktów w koszyku
Ponieważ wyświetlając internaucie zawartość koszyka, należy również pokazać suma-
ryczną wartość cen produktów w koszyku, w klasie $CUMGV zostały zdefiniowane dwie
bardzo przydatne metody.
Te metody to: IGV6QVCN2TKEG0GVVQ
oraz IGV6QVCN2TKEG
. Pierwsza z nich sumuje
wszystkie ceny netto produktów znajdujących się w koszyku przemnożone przez liczbę
sztuk każdego z produktów, natomiast druga robi dokładnie to samo z tą różnicą, że
bierze pod uwagę ceny brutto produktów, czyli do ceny każdego z produktów dolicza
odpowiednią stawkę podatku VAT.
Obie metody uwzględniają fakt, że produkty znajdujące się w koszyku mogą mieć
obowiązujące ceny promocyjne. W takim przypadku cena wliczana do sumy cen (za-
równo netto, jak i brutto) jest oczywiście ceną promocyjną produktu znajdującego się
w koszyku.
Stawki podatku VAT są zdefiniowane w słowniku stawek podatku VAT. Każdy pro-
dukt posiada odwołanie do odpowiedniej wartości w słowniku stawek podatku
VAT. Mechanizm słowników oraz ich zastosowanie w sklepie internetowym zostało
omówione w rozdziale „Słowniki i ich zastosowanie”.
Mechanizm promocji został omówiony w rozdziale „Kategorie i produkty” w pod-
rozdziale „Produkty w promocji”.
W przypadku sklepu internetowego obie metody są wywoływane jedynie w szablonach
Smarty, czyli w plikach TPL. O samym szablonie TPL wykorzystywanym do wyświe-
tlania kodu HTML koszyka powiemy w dalszej części rozdziału.
Składanie zamówienia
Z punktu widzenia programisty PHP obsługującego moduł koszyka składanie zamówień
jest najtrudniejszą procedurą do oprogramowania. Dzieje się tak ponieważ, aby złożyć
zamówienie, trzeba zebrać dodatkowe dane od internauty wypełniającego zamówienie.
W przypadku aplikacji sklepu internetowego dołączonego do książki są to dane adre-
sowe klienta, dzięki którym wiadomo, na jaki adres wyksłać zamówienie.
Z punktu widzenia obiektu koszyka sposób, w jaki owe dane zostaną zgromadzone, nie
jest istotny. Ważny jest sposób dostarczenia tych danych do obiektu koszyka. Operacja
składania zamówienia sprowadza się do wywołania metody RNCEG1TFGT
QTF#FFT
obiektu koszyka. Atrybut QTF#FFT (adres zamówienia) musi być tablicą asocjacyjną
zawierającą następujące pola:
Rozdział 8. ♦ Koszyk
183
FV (rodzaj dostawy) — identyfikator pola słownikowego GNKXGT[6[RG. Słownik
GNKXGT[6[RG zawiera informacje o tym, w jaki sposób zawartość zamkówienia
powinna być dostarczona do klienta;
RV (rodzaj płatności) — identyfikator pola słownikowegok 2C[OGPV6[RG. Słownik
2C[OGPV6[RG zawiera informacje o tym, w jaki sposób klient zamiekrza dokonać
płatności w sklepie internetowym;
CUVTPO (nazwa ulicy) — nazwa ulicy, na którą towar ma zostakć dostarczony;
CUVTPWO (numer domu) — numer domu, do którego towar ma zostakć
dostarczony;
CJQOGPWO (numer lokalu) — opcjonalny numer lokalu, do któregok towar ma
zostać dostarczony;
CEKV[ (miasto) — miasto, do którego towar ma zostać dostarckzony;
CUVCVG (województwo, stan, okręg) — identyfikator pola słownikkowego
5VCVG. Słownik 5VCVG zawiera listę województw (stanów lub obszarów)
danego kraju;
CEQWPVT[ (kraj) — identyfikator pola słownikowego QWPVT[. Słownik QWPVT[
zawiera listę krajów.
W przypadku aplikacji sklepu internetowego dołączonej do książki wszystkie te dane
są gromadzone w trakcie składania zamówienia przez kformularz (rysunek 8.2).
Rysunek 8.2.
Moment składania
zamówienia przez
klienta sklepu
internetowego
Ponieważ tylko użytkownicy zarejestrowani w sklepie internetowym mogą złożyć zamó-
wienie, dlatego też pola formularza z rysunku 8.2 wstępnie zostają wypełnione danymi
adresowymi, które użytkownik zarejestrowany (klient)k podaje w trakcie rejestracji.
184
PHP i MySQL. Tworzenie sklepów internetowych
O procesie rejestracji użytkownika w systemie i aktywacji konta użytkownika można
przeczytać więcej w rozdziale „Rejestracja i zarządzpanie klientami”.
Dane te mogą być zmodyfikowane przez użytkownika lub pozostawione bez zmian.
Formularz jest wygenerowany i obsługiwany przez moduł (QTOU, który został dokład-
nie opisany w rozdziale „Obsługa formularzy”.
Po złożeniu zamówienie jest zapisywane w bazie danykch z odpowiednim statusem.
Koszyk sklepu internetowego ściśle współpracuje z obiektem zamówień. Żeby jednak
użytkownik mógł złożyć zamówienie, musi się wcześniej zarejestrować w sklepie
internetowym. Kolejny rozdział „Rejestracja i zarządzanie klientami” prezentuje
sposób, w jaki w aplikacji sklepu internetowego dołączonej do książki rozwiązano
ten problem.
Po złożeniu zamówienia koszyk jest czyszczony, a użytkownik może ponownie przy-
stąpić do zakupów.
Wyświetlanie koszyka w szablonie TPL
Mimo że do obiektu klasy $CUMGV (o nazwie $CUMGV), który jest przechowywane w sesji,
w samym szablonie TPL można się dostać poprzez konstrukcje ]UOCTV[UGUUKQP
$CUMGV_, to dla wygody w głównym pliku części publicznej (mindex.php) obiekt ten
jest przekazywany przez referencję do szablonów Smarty pod nazwą $CUMGVUOCTV[
CUUKIPAD[ATGH
$CUMGV A5 55+10= $CUMGV ?
Dzięki temu w szablonach TPL do koszyka można się już odwoływać poprzez nazwę
$CUMGV.
Wyświetlanie informacji w koszyku możemy podzielić na dwie główne sekcje: pod-
sumowanie oraz szczegółowa zawartość koszyka.
W przytoczonych poniżej listingu szablonu basket.tpl (listing 8.6) pominęliśmy
większość znaczników kodu HTML, aby nie komplikować samego kodu szablonu
Smarty. Odpowiednie fragmenty kodu zostały odpowiednio skompentowane.
Listing 8.6. Kod (wycięto znaczniki HTML) szablonu basket.tpl
] CđMQYKVCYCTVQħèMQU[MC_
] GPCPGVVQ_]$CUMGV IGV6QVCN2TKEG0GVVQ
^UVTKPIAHQTOCVH_
] GPCDTWVVQ_]$CUMGV IGV6QVCN2TKEG$TWVVQ
^UVTKPIAHQTOCVH_
Sekcja podsumowania zawiera sumaryczną wartość cen netto oraz brutto z koszyka.
Do ich uzyskania wystarczy skorzystać z metod IGV6QVCN2TKEG0GVVQ
oraz IGV6QVCN
2TKEG$TWVVQ
. Ponieważ jednak nie możemy zagwarantować, że wartości zwrócone
Rozdział 8. ♦ Koszyk
185
przez obie funkcję będą poprawnymi wartościami walutowymi (precyzja do 2. miejsca
po przecinku), szczególnie w przypadku wartości brutto, która jest obliczana przez doda-
nie do wartości netto stawki podatku VAT, należy skorzystać z modyfikatorów Smarty.
Modyfikator zmiennej UVTKPIAHQTOCV pozwala na określenie formatu wyświetlania
wartości, której dotyczy. W powyższym przypadku nakazujemy wyświetlanie wartości
zmienno-pozycyjnych z dokładnością do dwóch miejsc kpo przecinku (po zaokrągleniu).
W sekcji przedstawiającej zawartość koszyka stworzona jest pętla HQTGCEJ, która wy-
konuje iteracje po tablicy produktów z koszyka. Tablica zwracana jest przez metodę
IGV$CUMGV obiektu koszyka.
]HQTGCEJHTQO$CUMGV IGV$CUMGV
KVGORTQFWEV_
Nazwa produktu znajdującego się w koszyku jest jednocześnie łączem do strony pre-
zentacyjnej produktu. W szablonie TPL została zdefiniokwana następująco:
]0CYCRTQFWMVWYMQU[MW_
CJTGH!RTQFKF]RTQFWEV=? IGV+F
_ ]RTQFWEV=? A+VGO IGV0COG
_C
Jako łącze, które tworzy zmienną typu ) 6 o nazwie RTQFKF zawierającą identyfikator
obiektu produktu, jest wyświetlana nazwa obiektu asortymentu powiązanego z pro-
duktem.
Następnie definiowana jest lista rozwijana, z której można wybrać liczbę sztuk danego
produktu:
].KUVCTQYKLCPCCYKGTCLæECNKEDúUVWMRTQFWMVW_
UGNGEVQP JCPIGEJCPIG$CUMGV
VJKU ]RTQFWEV=? IGV+F
_
]CUUKIPXCTOCZSWCPVKV[XCNWG$CUMGV IGV/CZ3WCPVKV[
_
]UGEVKQPPCOGNKENQQROCZSWCPVKV[
UVCTVOCZOCZSWCPVKV[
_
QRVKQPXCNWG]UOCTV[UGEVKQPNKEKVGTCVKQP_
]KHUOCTV[UGEVKQPNKEKVGTCVKQPRTQFWEV=?_UGNGEVGF]KH_
]UOCTV[UGEVKQPNKEKVGTCVKQP_
QRVKQP
]UGEVKQP_
UGNGEV
Do wygenerowanie listy rozwijanej zawierającej liczbę sztuk, które można wybrać,
został wykorzystany element UGEVKQP. Maksymalna liczba sztuk, która zostanie wygene-
rowana na liście, jest uzyskiwana przez metodę IGV/CZ3WCPVKV[
obiektu MQU[MC.
Jak widać element UGNGEV (element formularza HTML) zawiera atrybut QP JCPIG, który
powoduje, że po zmianie elementu wyświetlanego na liście rozwijanej wywoływana
jest funkcja JavaScript o nazwie EJCPIG$CUMGV. Sama funkcja wygląda następująco:
UETKRV
]NKVGTCN_
(WPMELCTQRQE[PCLæECRTQEGUOQF[HKMCELKCYCTVQħEKMQU[MC
186
PHP i MySQL. Tworzenie sklepów internetowych
HWPEVKQPEJCPIG$CUMGV
UTERTQFKF]
FQEWOGPVNQECVKQPJTGH !OGPWGDDEFGGGUHERTQFKF
RTQFKF
CEV
UTEXCNWG
_
]NKVGTCN_
UETKRV
Funkcja NKVGTCN języka szablonów Smarty powoduje, że kod, który znajduje się między
znacznikami ]NKVGTCN_ oraz ]NKVGTCN_, jest nie jest interpretowany w trakcie kompila-
cji szablonu. Gdybyśmy nie użyli tego elementu, kompilacja nie przebiegłaby pomyślnie,
ponieważ klamrowy nawias ] otwierający ciało funkcji EJCPIG$CUMGV zostałby zinter-
pretowany jako rozpoczęcie funkcji Smarty.
Pozostały fragment kodu szablonu TPL jest odpowiedzialny za wygenerowanie infor-
macji o cenach produktu. Jeżeli produkt jest objęty promocją, należy wyświetlić ceny,
tak jak zostało to pokazane na rysunku 8.3.
Rysunek 8.3.
Wyświetlanie ceny detalicznej
produktu znajdującego się w koszyku.
Produkt jest objęty promocją
Aby sprawdzić, czy produkt jest objęty promocją, należy skorzystać z metody JCU
2TQFWEV#XCN5RGEKCN
obiektu klasy 2TQFWEV. Metoda ta zwraca wartość 647 , jeżeli
produkt jest objęty promocją, oraz (#.5 w przeciwnym razie. Ponieważ obiekty pro-
duktów dodane do koszyka są, podobnie jak cały koszykk, przechowywane w zmiennej
sesyjnej, podczas wywołania metody JCU2TQFWEV#XCN5RGEKCN podajemy jako argument
wartość 647 . Dzięki temu na obiekcie klasy 2TQFWEV zostaje wymuszone odświeżenie
informacji o promocjach (informacje te są wtedy pobierane bezpośrednio z bazy da-
nych — uaktualniana jest wartość właściwości A5RGEKCN obiektu klasy 2TQFWEV).
Więcej o metodach obiektu klasy 2TQFWEV można przeczytać w rozdziale „Kategorie
i produkty”.
] GPCCUVWMú_
]KHRTQFWEV=? JCU2TQFWEV#XCN5RGEKCN
647 _
Jeżeli produkt jest objęty promocją, wyświetlamy najpierw ceny detaliczne. Wyko-
rzystujemy tutaj metody obiektu klasy 2TQFWEV, takie jak: IGV2TKEG0GVVQ
i IGV5RG
EKCN2TKEG0GVVQ
, aby wyświetlić ceny netto, oraz IGV2TKEG$TWVVQ
i IGV5RGEKCN
2TKEG$TWVVQ
, aby wyświetlić ceny brutto:
] GP[RTQOQE[LPGFGVCNKEPG_
] GPCPGVVQRTQFWMVWDGRTQOQELK
RTGMTGħNQPC_
]RTQFWEV=? IGV2TKEG0GVVQ
_
] GPCRTQOQE[LPCPGVVQRTQFWMVW
PCEGTYQPQ_
]RTQFWEV=? IGV5RGEKCN2TKEG0GVVQ
_
Rozdział 8. ♦ Koszyk
187
] GPCDTWVVQRTQFWMVWDGRTQOQELK
RTGMTGħNQPC_
]RTQFWEV=? IGV2TKEG$TWVVQ
^UVTKPIAHQTOCVH_
GPCRTQOQE[LPCDTWVVQRTQFWMVW
PCEGTYQPQ_
]RTQFWEV=? IGV5RGEKCN2TKEG$TWVVQ
^UVTKPIAHQTOCVH_
Jeżeli produkt nie jest objęty promocją, wyświetlane ceny są uzyskiwane tylko przez
metody IGV2TKEG0GVVQ
oraz IGV2TKEG$TWVVQ
(rysunek 8.4):
Rysunek 8.4.
Wyświetlanie ceny detalicznej
produktu znajdującego się w koszyku.
Produkt nie jest objęty promocją
]GNUG_
] GP[DGRTQOQELK_
] GPCPGVVQRTQFWMVW_
]RTQFWEV=? IGV2TKEG0GVVQ
_
] GPCDTWVVQRTQFWMVW_
]RTQFWEV=? IGV2TKEG$TWVVQ
^UVTKPIAHQTOCVH_
Następnie w koszyku jest wyświetlana łączna wartość cenowa produktu, która zależy
od liczby sztuk danego produktu w koszyku:
].KEDCUVWMRTQFWMVW_
]RTQFWEV=?_
Jeżeli produkt jest objęty promocją, ceny powinny być wyświetlane tak, jak zostało to
pokazane na rysunku 8.5.
Rysunek 8.5.
Wyświetlanie łącznej wartości
cenowej produktu w koszyku,
produkt jest objęty promocją
]KHRTQFWEV=? JCU2TQFWEV#XCN5RGEKCN
_
Jak widać, tym razem metoda JCU2TQFWEV#XCN5RGEKCN
obiektu klasy 2TQFWEV nie
posiada żadnego argumentu. Nie trzeba odświeżać informacji o promocji, ponieważ
zostało to zrobione wcześniej w tym samym szablonie kTPL.
Aby wyświetlić wartość sumaryczną liczby sztuk danego produktu w koszyku, korzy-
stamy ze znanych nam już metod klasy 2TQFWEV oraz z funkcji OCVJ szablonów Smarty:
]ĐæEPCYCTVQħèRTQFWMVWYRTQOQELK_
]9CTVQħèPGVVQYU[UVMKEJUVWMRTQFWMVWDGRTQOQELK
RTGMTGħNQPC_
]OCVJGSWCVKQPZ[ZRTQFWEV=? IGV2TKEG0GVVQ
[RTQFWEV=?HQTOCVH_
] GPCPGVVQYU[UVMKEJUVWMRTQFWMVWYRTQOQELK
PCEGTYQPQ_
]OCVJGSWCVKQPZ[ZRTQFWEV=? IGV5RGEKCN2TKEG0GVVQ
[RTQFWEV=?HQTOCVH_
] GPCDTWVVQYU[UVMKEJUVWMRTQFWMVWDGRTQOQELK
RTGMTGħNQPC_
]OCVJGSWCVKQPZ[ZRTQFWEV=? IGV2TKEG$TWVVQ
[RTQFWEV=?HQTOCVH_
188
PHP i MySQL. Tworzenie sklepów internetowych
] GPCDTWVVQYU[UVMKEJUVWMRTQFWMVWYRTQOQELK
PCEGTYQPQ_
]OCVJGSWCVKQPZ[ZRTQFWEV=? IGV5RGEKCN2TKEG$TWVVQ
[RTQFWEV=?HQTOCVH_
Funkcja OCVJ pozwala wyliczyć dowolne wyrażenie matematyczne, a także sformatować
jego wynik. W powyższym przypadku wykonujemy działanie Z[ (atrybut GSWCVKQP),
gdzie wartość Z to odpowiednia cena, a wartość [ liczba sztuk danego produktu w ko-
szyku. Całość jest formatowana tak, aby wynik był zaokrąglony z dokładnością do dwóch
miejsc po przecinku.
Jeżeli produkt nie jest objęty promocją, wyświetlane jest jego podstawowa cena (ry-
sunek 8.6).
Rysunek 8.6.
Wyświetlanie łącznej wartości
cenowej produktu w koszyku.
Produkt nie jest objęty promocją
]GNUG_
] GP[RTQFWMVWDGRTQOQELK_
] GPCPGVVQYU[UVMKEJUVWMRTQFWMVW_
]OCVJGSWCVKQPZ[ZRTQFWEV=? IGV2TKEG0GVVQ
[RTQFWEV=?HQTOCVH_
] GPCDTWVVQYU[UVMKEJUVWMRTQFWMVW_
]OCVJGSWCVKQPZ[ZRTQFWEV=? IGV2TKEG$TWVVQ
[RTQFWEV=?HQTOCVH_
]KH_
]HQTGCEJ_
W ten oto sposób w szablonie TPL wyświetlana jest zawartość koszyka. Kompletny
plik szablonu basket.tpl można znaleźć w pliku sklepinternetowy/www/templates/public/
basket.tpl.
Pobierz darmowy fragment (pdf)