Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00209 007881 13585828 na godz. na dobę w sumie
PHP, MySQL i MVC. Tworzenie witryn WWW opartych na bazie danych - książka
PHP, MySQL i MVC. Tworzenie witryn WWW opartych na bazie danych - książka
Autor: Liczba stron: 528
Wydawca: Helion Język publikacji: polski
ISBN: 83-246-1258-0 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> webmasterstwo >> php - programowanie
Porównaj ceny (książka, ebook, audiobook).

Duża część popularnych serwisów internetowych dostępnych obecnie w sieci działa w oparciu o relacyjne bazy danych i język PHP. Tandem ten stał się już niemal standardem w dziedzinie tworzenia rozbudowanych, dynamicznych witryn i aplikacji WWW zarówno w przypadku wielkich przedsiębiorstw, jak i hobbystów pragnących dzielić się swoimi doświadczeniami za pośrednictwem internetu. PHP i MySQL doskonale nadają się do praktycznej realizacji wzorca architektonicznego MVC, ułatwiającego opracowywanie nawet najbardziej złożonych projektów. Dzięki odseparowaniu poszczególnych komponentów aplikacji i podzieleniu jej na mniejsze elementy funkcjonalne tworzona witryna jest znacznie wygodniejsza w zarządzaniu i modyfikacji niż serwisy oparte na innych wzorcach.

Wzorzec architektoniczny MVC - choć opracowany z myślą o uproszczeniu życia programistom i twórcom witryn WWW - początkowo bardzo trudno zrozumieć, a postęp w dziedzinie tworzenia stron internetowych wymusza ciągłe dostosowywanie się do panujących na rynku trendów i stałe odświeżanie wiedzy na ten temat. Pomocą posłuży tu odpowiednia książka - z pewnością może nią być 'PHP, MySQL i MVC. Tworzenie witryn WWW opartych na bazie danych '. W przystępny sposób prezentuje ona podstawy zastosowania architektury MVC, pokazuje wykorzystanie dwóch najważniejszych rozwiązań do mapowania obiektowo-relacyjnego, podsuwa techniki tworzenia funkcjonalnych interfejsów użytkownika aplikacji WWW oraz proponuje stosowanie różnych formatów do przechowywania danych. Poszczególne zagadnienia ilustrowane są przykładami i praktycznymi projektami, dzięki czemu łatwiej zrozumieć opisywane techniki i wykorzystać je w swoich aplikacjach. Zdobytą wiedzę pomagają utrwalić liczne ćwiczenia do samodzielnego wykonania.

Poznaj w praktyce nowoczesne metody
tworzenia zaawansowanych aplikacji WWW!

Wszystkie projekty omówione w książce umieszczono na płycie dołączonej do książki. Każdy z projektów jest dostępny jako kompletne, działające rozwiązanie, dokładnie przetestowane.

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

PHP, MySQL i MVC. Tworzenie witryn WWW opartych na bazie danych Autor: W³odzimierz Gajda ISBN: 978-83-246-1258-1 Format: 158×235, stron: 528 Du¿a czêœæ popularnych serwisów internetowych dostêpnych obecnie w sieci dzia³a w oparciu o relacyjne bazy danych i jêzyk PHP. Tandem ten sta³ siê ju¿ niemal standardem w dziedzinie tworzenia rozbudowanych, dynamicznych witryn i aplikacji WWW zarówno w przypadku wielkich przedsiêbiorstw, jak i hobbystów pragn¹cych dzieliæ siê swoimi doœwiadczeniami za poœrednictwem internetu. PHP i MySQL doskonale nadaj¹ siê do praktycznej realizacji wzorca architektonicznego MVC, u³atwiaj¹cego opracowywanie nawet najbardziej z³o¿onych projektów. Dziêki odseparowaniu poszczególnych komponentów aplikacji i podzieleniu jej na mniejsze elementy funkcjonalne tworzona witryna jest znacznie wygodniejsza w zarz¹dzaniu i modyfikacji ni¿ serwisy oparte na innych wzorcach. Wzorzec architektoniczny MVC – choæ opracowany z myœl¹ o uproszczeniu ¿ycia programistom i twórcom witryn WWW – pocz¹tkowo bardzo trudno zrozumieæ, a postêp w dziedzinie tworzenia stron internetowych wymusza ci¹g³e dostosowywanie siê do panuj¹cych na rynku trendów i sta³e odœwie¿anie wiedzy na ten temat. Pomoc¹ pos³u¿y tu odpowiednia ksi¹¿ka – z pewnoœci¹ mo¿e ni¹ byæ „PHP, MySQL i MVC. Tworzenie witryn WWW opartych na bazie danych”. W przystêpny sposób prezentuje ona podstawy zastosowania architektury MVC, pokazuje wykorzystanie dwóch najwa¿niejszych rozwi¹zañ do mapowania obiektowo-relacyjnego, podsuwa techniki tworzenia funkcjonalnych interfejsów u¿ytkownika aplikacji WWW oraz proponuje stosowanie ró¿nych formatów do przechowywania danych. Poszczególne zagadnienia ilustrowane s¹ przyk³adami i praktycznymi projektami, dziêki czemu ³atwiej zrozumieæ opisywane techniki i wykorzystaæ je w swoich aplikacjach. Zdobyt¹ wiedzê pomagaj¹ utrwaliæ liczne æwiczenia do samodzielnego wykonania. (cid:129) Podstawy u¿ycia wzorca MVC (cid:129) Modu³y, akcje, widoki, szablony PHP i szablony Smarty (cid:129) Regu³y translacji przyjaznych adresów URL (cid:129) U¿ywanie baz danych w projektach WWW (cid:129) Wizualne projektowanie baz danych i mapowanie relacyjno-obiektowe (cid:129) Wykorzystanie oprogramowania Propel oraz Doctrine (cid:129) Metody zwiêkszania funkcjonalnoœci interfejsów aplikacji internetowych (cid:129) Stronicowanie wyników i przewijanie rekordów (cid:129) Chmura tagów, korzystanie z formatów TXT, XML, XLS (cid:129) Odczyt plików i wype³nianie bazy danych (cid:129) Pliki skompresowane i osadzanie danych binarnych w plikach XML Poznaj w praktyce nowoczesne metody tworzenia zaawansowanych aplikacji WWW! Wszystkie projekty omówione w ksi¹¿ce umieszczono na p³ycie do³¹czonej do ksi¹¿ki. Ka¿dy z projektów jest dostêpny jako kompletne, dzia³aj¹ce rozwi¹zanie, dok³adnie przetestowane. Spis treĈci Wstöp ............................................................................................ 13 CzöĈè I Akcje, widoki, translacje adresów URL i bazy danych, czyli podstawy uĔycia MVC ............................................ 15 Rozdziaä 1. Hello world — pierwsza aplikacja korzystajñca z MVC ..................... 17 Projekt 1.1. Hello world! ................................................................................................ 18 Krok pierwszy: utworzenie moduáu main ................................................................. 19 Krok drugi: utworzenie akcji hello w module main ................................................. 19 Krok trzeci: utworzenie ukáadu witryny WWW ....................................................... 20 Krok czwarty: reguáa translacji adresu pierwszy-projekt.html na wykonanie akcji main/hello .............................................................................. 20 Krok piąty: skrypt index.php .................................................................................... 21 Pliki, które naleĪy utworzyü ..................................................................................... 22 Uruchomienie projektu ............................................................................................. 23 Przebieg wykonania ................................................................................................. 24 Rozdziaä 2. Doäñczanie zewnötrznych zasobów .css, .jpg, .js .............................. 27 Projekt 2.1. Wlazá kotek na schody… ............................................................................ 28 Analiza ĞcieĪek zawartych w kodzie HTML .................................................................. 31 Rozdziaä 3. Bäödy 404 ...................................................................................... 35 Projekt 3.1. ĩóáta Turnia ................................................................................................. 36 Oglądanie strony báĊdu oraz nagáówka HTTP .......................................................... 38 Rozdziaä 4. Zmienne i widoki ............................................................................ 41 Projekt 4.1. Data i godzina — szablon PHP ................................................................... 42 Projekt 4.2. Data i godzina — szablon Smarty ............................................................... 45 Projekt 4.3. Ojciec i syn — szablon PHP ....................................................................... 47 Projekt 4.4. Ojciec i syn — szablony Smarty ................................................................. 49 Projekt 4.5. Stefan ĩeromski: Zmierzch — szablon PHP ............................................... 50 Projekt 4.6. Stefan ĩeromski: Zmierzch — szablony Smarty ......................................... 53 Projekt 4.7. Kolory CSS ................................................................................................. 54 Projekt 4.8. Kolory CSS — szablony Smarty ................................................................. 56 Rozdziaä 5. Pre- i postprzetwarzanie ................................................................. 59 Projekt 5.1. Fraszki ......................................................................................................... 60 Projekt 5.2. Fraszki — szablony Smarty ........................................................................ 68 6 PHP, MySQL i MVC. Tworzenie witryn WWW opartych na bazie danych Rozdziaä 6. Translacja adresów URL ................................................................. 71 Projekt 6.1. KolĊdy ......................................................................................................... 73 Analiza róĪnych rodzajów adresów URL ....................................................................... 77 DwukierunkowoĞü konwersji adresów ........................................................................... 78 Konwersje adresów w generowanych stronach WWW .................................................. 79 Wáączanie i wyáączanie translacji wyjĞciowych ............................................................. 80 Konwersja adresów URL przy uĪyciu funkcji pomocniczych ........................................ 81 Implementacja funkcji pomocniczych w postaci wtyczek Smarty .................................. 82 Kilka zmiennych w adresach URL ................................................................................. 83 Projekt 6.2. Ligi piákarskie ............................................................................................. 84 Zmienne $path_prefix oraz ###PATH_PREFIX### ................................................ 92 Rozdziaä 7. Bazy danych ................................................................................... 95 Wizualne projektowanie bazy danych ............................................................................ 95 Oprogramowanie ORM .................................................................................................. 99 Konwersja pliku .mwb do formatu Propel XML .......................................................... 100 Konwersja pliku .mwb do formatu Doctrine YML ....................................................... 101 db-frame-tool ................................................................................................................ 101 Propel — generowanie klas dostĊpu do bazy ............................................................... 102 ORM Propel — pierwsze kroki .................................................................................... 104 Zestawienie wygenerowanych klas oraz najwaĪniejszych metod ........................... 104 Podstawy uĪycia klas wygenerowanych przez Propel ............................................ 105 Doctrine — generowanie klas dostĊpu do bazy ............................................................ 106 ORM Doctrine — pierwsze kroki ................................................................................. 107 Zestawienie wygenerowanych klas oraz najwaĪniejszych metod ........................... 107 Podstawy uĪycia klas wygenerowanych przez Doctrine ........................................ 108 Projekt 7.1. Tatry (szablony PHP, Propel) .................................................................... 109 Krok pierwszy: projekt bazy danych ...................................................................... 110 Krok drugi: generowanie klas dostĊpu do bazy danych ......................................... 110 Krok trzeci: tworzenie pustej bazy danych ............................................................. 110 Krok czwarty: wypeánianie bazy danych na podstawie pliku tekstowego .............. 110 Krok piąty: zrzut wypeánionej bazy danych ........................................................... 113 Krok szósty: aplikacja prezentująca zawartoĞü bazy danych .................................. 114 Projekt 7.2. Tatry (szablony PHP, Doctrine) ................................................................ 116 Krok pierwszy: projekt bazy danych ...................................................................... 116 Krok drugi: generowanie klas dostĊpu do bazy danych ......................................... 116 Krok trzeci: tworzenie pustej bazy danych ............................................................. 117 Krok czwarty: wypeánianie bazy danych na podstawie pliku tekstowego .............. 117 Krok piąty: zrzut wypeánionej bazy danych ........................................................... 118 Krok szósty: aplikacja prezentująca zawartoĞü bazy danych .................................. 118 Projekt 7.3. Tatry (szablony Smarty, Propel) ................................................................ 119 Projekt 7.4. Tatry (szablony Smarty, Doctrine) ............................................................ 120 Rozdziaä 8. Czego powinieneĈ nauczyè siö z czöĈci pierwszej? ........................ 123 CzöĈè II Operowanie klasami wygenerowanymi przez Propel oraz Doctrine .............................................................. 129 Rozdziaä 9. Wybieranie wszystkich rekordów z tabeli w zadanym porzñdku ....... 131 Propel — sortowanie rekordów .................................................................................... 132 Doctrine — sortowanie rekordów ................................................................................. 134 Projekt 9.1. Sáownik (Propel, PHP) .............................................................................. 134 Krok pierwszy: projekt bazy danych ...................................................................... 135 Krok drugi: generowanie klas dostĊpu do bazy danych .............................................. 135 Spis treĈci 7 Krok trzeci: tworzenie pustej bazy danych ............................................................. 137 Krok czwarty: wypeánianie bazy danych na podstawie pliku tekstowego .............. 137 Krok piąty: zrzut wypeánionej bazy danych ........................................................... 138 Krok szósty: aplikacja prezentująca zawartoĞü bazy danych .................................. 138 Projekt 9.2. Sáownik (Doctrine, PHP) ........................................................................... 141 Krok pierwszy: projekt bazy danych ...................................................................... 141 Krok drugi: generowanie klas dostĊpu do bazy danych .............................................. 141 Krok trzeci: tworzenie pustej bazy danych ............................................................. 142 Krok czwarty: wypeánianie bazy danych na podstawie pliku tekstowego .............. 142 Krok piąty: zrzut wypeánionej bazy danych ........................................................... 142 Krok szósty: aplikacja prezentująca zawartoĞü bazy danych .................................. 143 Rozdziaä 10. Wybieranie pojedynczego rekordu ................................................. 145 Propel ........................................................................................................................... 145 Doctrine ........................................................................................................................ 147 Projekt 10.1. Treny (Propel, PHP) ................................................................................ 147 Identyfikacja trenu wewnątrz akcji tren/show ........................................................ 151 Projekt 10.2. Treny (Doctrine, PHP) ............................................................................. 153 Rozdziaä 11. Relacje 1:n .................................................................................. 157 Metody generowane przez Propel dla relacji 1:n .......................................................... 158 Doctrine i relacje 1:n .................................................................................................... 160 Projekt 11.1. Kontynenty, paĔstwa, miasta (Propel, PHP) ........................................... 162 Przygotowanie bazy danych ................................................................................... 163 Aplikacja ................................................................................................................ 167 Projekt 11.2. Kontynenty, paĔstwa, miasta (Doctrine, PHP) ........................................ 173 Rozszerzanie wáaĞciwoĞci klas generowanych przez Doctrine .............................. 174 Wstawianie rekordów ............................................................................................. 176 Aplikacja ................................................................................................................ 178 Rozdziaä 12. Relacje n:m ................................................................................. 181 Metody generowane przez Propel dla relacji n:m ......................................................... 182 Doctrine i relacje n:m ................................................................................................... 183 Projekt 12.1. Filmy (Propel, PHP) ................................................................................ 184 Przygotowanie bazy danych ................................................................................... 184 Aplikacja ................................................................................................................ 187 Projekt 12.2. Filmy (Doctrine, PHP) ............................................................................ 189 Propel. Sortowanie rekordów stojących w relacji n:m .................................................. 192 Projekt 12.3. Filmy (Propel, PHP, sortowanie) ............................................................. 192 Doctrine. Sortowanie rekordów stojących w relacji n:m .............................................. 193 Projekt 12.4. Filmy (Doctrine, PHP, sortowanie) ......................................................... 194 Rozdziaä 13. Zagadnienia dodatkowe dotyczñce warstw M oraz V ....................... 197 Czyszczenie zawartoĞci bazy danych ........................................................................... 197 Konwersja obiektu w napis ........................................................................................... 198 Konwersje toArray(), fromArray() ............................................................................... 198 Warunkowe wstawianie nieistniejących obiektów ....................................................... 200 Wielokrotne wykorzystanie widoku ............................................................................. 201 Projekt 13.1. Aparaty foto (Propel, PHP) ..................................................................... 202 Warstwa M ............................................................................................................. 202 Wypeánianie bazy danych ...................................................................................... 205 Aplikacja ................................................................................................................ 206 Projekt 13.2. Aparaty foto (Doctrine, PHP) .................................................................. 208 Rozszerzanie funkcjonalnoĞci klas wygenerowanych przez Doctrine .................... 209 Wstawianie rekordów do bazy danych ................................................................... 211 Aplikacja ................................................................................................................ 212 8 PHP, MySQL i MVC. Tworzenie witryn WWW opartych na bazie danych Rozdziaä 14. Zapisywanie w bazie danych obrazów i plików binarnych ............... 215 Zapisywanie w bazie danych zdjĊü JPG ....................................................................... 215 Prezentowanie zdjĊü JPG zapisanych w bazie danych na stronie WWW ..................... 216 Zapisywanie w bazie danych dowolnych plików binarnych ......................................... 218 Wysyáanie danych binarnych z bazy do przeglądarki ................................................... 220 Projekt 14.1. NotH (Propel, PHP) ................................................................................. 221 Skrypt wstaw.php ................................................................................................... 223 Aplikacja ................................................................................................................ 224 Tytuáy stron ............................................................................................................ 225 Rozwijane menu pionowe ...................................................................................... 226 WartoĞci atrybutów href oraz src w tekstach zapisanych w bazie danych .............. 227 Projekt 14.2. NotH (Doctrine, PHP) ............................................................................. 229 Skrypt wstaw.php ................................................................................................... 230 Aplikacja ................................................................................................................ 230 Rozdziaä 15. Akcje list i show, czyli publikowanie zawartoĈci bazy danych w postaci witryny WWW ............................................................... 233 Projekt 15.1. Czcionki projektów CSS Zen Garden (Propel, PHP) .............................. 234 Aplikacja ................................................................................................................ 235 Menu gáówne witryny oraz tytuáy podstron ............................................................ 240 Rozdziaä 16. Czego powinieneĈ nauczyè siö z czöĈci drugiej? ............................ 243 CzöĈè III Zwiökszanie funkcjonalnoĈci interfejsu aplikacji internetowej ................................................. 245 Rozdziaä 17. Kontekstowe hiperäñcza do stron ze szczegóäowymi informacjami .. 247 Projekt 17.1. AngaĪe (szablony PHP, Propel) .............................................................. 248 UnikatowoĞü kolumny slug .................................................................................... 248 Pliki tekstowe o bardziej záoĪonej strukturze ......................................................... 250 Rozszerzenia warstwy M ........................................................................................ 251 Filtry konwertujące generowany kod HTML ......................................................... 260 Aplikacja ................................................................................................................ 261 Hiperáącza kontekstowe ......................................................................................... 263 Menu kontekstowe ................................................................................................. 264 Rozdziaä 18. Nastöpny, poprzedni, czyli przewijanie zawartoĈci witryny WWW .... 267 Projekt 18.1. PHP. Praktyczne projekty ........................................................................ 269 Ograniczenia kluczy obcych ................................................................................... 270 WstĊpne opracowanie aplikacji .............................................................................. 271 Implementacja hiperáączy nastĊpny/poprzedni ....................................................... 276 Hiperáącza link zawarte w nagáówku strony WWW ............................................... 285 Rozdziaä 19. WskaĒnik poäoĔenia ...................................................................... 287 Projekt 19.1. Kolekcja páyt DVD z fotografiami .......................................................... 288 Rozszerzanie klas dostĊpu do bazy danych ............................................................ 291 Wypeánianie bazy danych rekordami ..................................................................... 295 Aplikacja ................................................................................................................ 302 Translacje adresów stosujących cztery zmienne URL ............................................ 304 Tabela zdjĊü wykonana bez uĪycia tabel HTML .................................................... 305 WskaĨniki nastĊpny/poprzedni do przewijania zdjĊü i kategorii ............................ 306 Efekt rollover ze wskaĨnikiem wybranej opcji ....................................................... 307 Fotografie podąĪające za wskaĨnikiem myszki ...................................................... 307 WskaĨnik breadcrumbs .......................................................................................... 310 Spis treĈci 9 Rozdziaä 20. Sortowanie tabel .......................................................................... 311 Projekt 20.1. Piáka noĪna — sezon 2002/2003 ............................................................. 312 Wielokrotne klucze obce z tej samej tabeli ............................................................ 314 Sortowanie záączeĔ dla wielokrotnych kluczy ........................................................ 314 Wypeánianie bazy danych ...................................................................................... 317 Zarys aplikacji ........................................................................................................ 320 Implementacja sortowalnych tabelek HTML ......................................................... 320 Rozdziaä 21. Stronicowanie .............................................................................. 331 Projekt 21.1. 33 ѿ ........................................................................................................ 332 Automatyczne generowanie identyfikatorów slug dla rekordów o zdublowanych tytuáach ..................................................................................... 333 Klasa Pager ............................................................................................................. 335 Widok wskaĨnika stronicowania ............................................................................ 343 Prezentacja rekordów poddanych stronicowaniu .................................................... 345 Kontekstowe stronicowanie rekordów ................................................................... 348 Rozdziaä 22. Alfabet ......................................................................................... 351 Projekt 22.1. Imiona ..................................................................................................... 351 Wybieranie alfabetu liter ........................................................................................ 352 Komponent wyĞwietlający alfabet ................................................................................ 353 Prezentacja liter rozpoczynających siĊ od wybranej litery na stronie WWW ......... 354 Umieszczanie kontrolki z listą liter w szablonie layout.html ................................. 355 Rozdziaä 23. Chmura tagów ............................................................................. 357 Projekt 23.1. Katalog Open Clipart .............................................................................. 358 Wypeánianie bazy danych ...................................................................................... 360 Waga sáów kluczowych .......................................................................................... 363 Aplikacja ................................................................................................................ 365 Rozdziaä 24. Spis treĈci ................................................................................... 371 Projekt 24.1. Artykuáy .................................................................................................. 372 Wypeánianie bazy danych rekordami ..................................................................... 373 Funkcje odpowiedzialne za odczytywanie i usuwanie fragmentów kodu HTML .....376 Funkcje odpowiedzialne za tworzenie spisu treĞci ................................................. 378 Kolorowanie skáadni .............................................................................................. 380 Aplikacja ................................................................................................................ 381 Rozdziaä 25. Czego powinieneĈ nauczyè siö z czöĈci trzeciej? ........................... 383 CzöĈè IV Formaty danych ......................................................... 385 Rozdziaä 26. Podstawy przetwarzania dokumentów XML w PHP ........................ 387 Klasa SimpleXML ........................................................................................................ 387 Tworzenie obiektu SimpleXMLElement ................................................................ 388 DostĊp do wĊzáów drzewa ...................................................................................... 389 Lista identycznych elementów ............................................................................... 390 DostĊp do atrybutów .............................................................................................. 391 Przetwarzanie wszystkich elementów i ich atrybutów ........................................... 391 Wielokrotne zagnieĪdĪenia .................................................................................... 392 JĊzyk XPath ............................................................................................................ 395 Przykáadowe dokumenty XML dostĊpne w internecie ................................................. 395 Kursy walut ............................................................................................................ 395 KsiąĪki wydawnictwa Helion ................................................................................. 397 Projekt 26.1. Turniej Czterech Skoczni ........................................................................ 398 Aplikacja ................................................................................................................ 400 10 PHP, MySQL i MVC. Tworzenie witryn WWW opartych na bazie danych Rozdziaä 27. Generowanie dokumentów XML w PHP ......................................... 403 Statyczne pliki XML .................................................................................................... 403 Generowanie dokumentu XML w PHP ........................................................................ 405 Echo — drukowanie kodu XML .................................................................................. 406 Generowanie XML na podstawie tablicy ..................................................................... 407 Generowanie XML na podstawie pliku tekstowego ..................................................... 408 Zapisywanie kodu XML do pliku ................................................................................. 409 Konwersja pliku tekstowego do formatu XML ............................................................ 409 Dane w formacie XML opisujące witrynĊ WWW ........................................................ 410 Mapa witryny: sitemap.xml .................................................................................... 410 Kanaá RSS .............................................................................................................. 411 Projekt 27.1. Kursy walut ............................................................................................. 412 Ustalanie adresów dokumentów XML z kursami walut ......................................... 412 Projekt bazy danych ............................................................................................... 413 Wypeánianie bazy danych rekordami ..................................................................... 413 Aplikacja ................................................................................................................ 415 Kanaá RSS .............................................................................................................. 415 Mapa witryny ......................................................................................................... 416 Wykresy kursów walut ........................................................................................... 418 Rozdziaä 28. XML_Serializer, XML_Unserializer — dwukierunkowe transformacje tablic w XML ........................... 423 XML_Serializer ............................................................................................................ 423 Konwersja tablicy w kod XML .............................................................................. 423 Tablica asocjacyjna ................................................................................................ 424 Opcje ...................................................................................................................... 425 Tablica opcji ........................................................................................................... 426 Jednowymiarowa tablica indeksowana ................................................................... 426 Wielowymiarowe tablice indeksowane .................................................................. 427 Atrybuty ................................................................................................................. 428 Wybiórcze stosowanie atrybutów ........................................................................... 429 Przeksztaácenia ....................................................................................................... 430 XML_Serializer — przykáady ...................................................................................... 431 Projekt 28.1. Konwersja pliku nobel.txt ....................................................................... 431 Projekt 28.2. Konwersja pliku mecze.txt ...................................................................... 432 Projekt 28.3. Konwersja pliku tcs.txt ............................................................................ 434 Klasa XML_Unserializer .............................................................................................. 436 Podstawowe uĪycie ................................................................................................ 436 Odczyt pliku ........................................................................................................... 437 Parsing atrybutów ................................................................................................... 437 Konwersja formatu XML ............................................................................................. 439 Projekt 28.4. Konwersja jeden-w-wiele ........................................................................ 439 Projekt 28.5. Konwersja wiele-w-jeden ........................................................................ 440 Projekt 28.6. Klasyfikacja zwierząt .............................................................................. 441 Wypeánianie bazy danych rekordami ..................................................................... 442 Moduáy i akcje aplikacji ......................................................................................... 443 Akcja main/drzewo ................................................................................................ 444 Kanaá RSS .............................................................................................................. 444 Generowanie statycznego dokumentu sitemap.xml ................................................ 447 Rozdziaä 29. Arkusze kalkulacyjne MS Excel XLS ............................................. 449 Odczyt pliku XLS ......................................................................................................... 449 Odczyt kilku arkuszy .............................................................................................. 451 Tworzenie pliku XLS ................................................................................................... 452 Spis treĈci 11 Wysyáanie arkusza do przeglądarki .............................................................................. 453 Konwersja pliku tekstowego do formatu XLS ....................................................... 453 Konwersja pliku XLS do formatu tekstowego .............................................................. 454 Projekt 29.1. Generowanie danych autokomisu ............................................................ 455 Projekt 29.2. Autokomis ............................................................................................... 460 Wypeánianie bazy danych rekordami ..................................................................... 460 Aplikacja ................................................................................................................ 465 Rozdziaä 30. Konwersja plików z danymi ......................................................... 467 Format danych tekstowych ........................................................................................... 467 Format danych XML .................................................................................................... 469 Format danych XLS ..................................................................................................... 470 Projekt 30.1. Konwersja formatu TXT do formatu XML ............................................. 470 Projekt 30.2. Konwersja formatu TXT do formatu XLS .............................................. 474 Projekt 30.3. Konwersja formatu XML do formatu TXT ............................................. 476 Projekt 30.4. Konwersja formatu XML do formatu XLS ............................................. 477 Projekt 30.5. Konwersja formatu XLS do formatu TXT .............................................. 478 Projekt 30.6. Konwersja formatu XLS do formatu XML ............................................. 480 Projekt 30.7. Zestawienia artykuáów „Magazynu INTERNET” ................................... 480 Aplikacja ................................................................................................................ 483 Akcja list prezentująca sortowalną i stronicowaną tabelkĊ HTML ........................ 484 Akcja show prezentująca sortowalną i stronicowaną tabelkĊ HTML ..................... 486 Rozdziaä 31. Skompresowane dokumenty XML zawierajñce dane binarne ........... 489 Kodowanie base64 ........................................................................................................ 490 Dekodowanie base64 .................................................................................................... 490 Kompresja danych ........................................................................................................ 491 Dekompresja danych .................................................................................................... 492 Projekt 31.1. Format danych systemu do publikowania artykuáów .............................. 493 Umieszczanie ilustracji, listingów, ramek i tabel w treĞci artykuáu ........................ 495 Projekt 31.2. Konwersja artykuáu z formatu tekstowego do spakowanego pliku XML .......................................................................................................................... 495 Projekt 31.3. System publikacji artykuáów w postaci witryny WWW .......................... 498 Baza danych ........................................................................................................... 499 Propel i dostĊp tylko do wybranych kolumn tabeli ................................................ 499 Wypeánianie bazy danych ...................................................................................... 501 Aplikacja ................................................................................................................ 508 Rozdziaä 32. Czego powinieneĈ nauczyè siö z czöĈci czwartej? ......................... 511 Skorowidz .................................................................................... 513 Rozdziaä 21. Stronicowanie CzĊstym problemem, który pojawia siĊ podczas tworzenia witryn internetowych, jest prezentacja duĪej liczby rekordów. Powszechnie stosowanym rozwiązaniem jest stro- nicowanie, czyli podziaá liczby prezentowanych wyników na mniejsze grupy. WskaĨnik nawigacji zawierający numer strony oraz odsyáacze do stron sąsiednich uáatwia nawi- gowanie na witrynie stosującej stronicowanie. Stronicowanie wyników opiszĊ na przykáadzie internetowego katalogu páyt, wykonawców i piosenek. ZaáóĪmy, Īe w tabeli song zawierającej teksty piosenek znajduje siĊ 1005 rekordów. Przyjmijmy, Īe chcemy wyĞwietlaü 10 rekordów na stronie. Otrzymamy 101 stron, które bĊdą prezentowaáy rekordy:  strona 1: rekordy od 1 do 10;  strona 2: rekordy od 11 do 20;  …  strona 100: rekordy od 991 do 1000;  strona 101: rekordy od 1001 do 1005. SzerokoĞü wskaĨnika bieĪącej strony bĊdzie ustalaáa liczbĊ prezentowanych numerów stron. JeĞli szerokoĞü wskaĨnika ustalimy na 7, to na pierwszej stronie naleĪy wy- Ğwietliü numery stron: 1 2 3 4 5 6 7 JeĞli szerokoĞü wskaĨnika wyniesie 3, to na stronie ostatniej wyĞwietlimy numery: 99 100 101 Parametrami wskaĨnika bĊdą wiĊc:  liczba wszystkich rekordów;  liczba rekordów na stronie;  szerokoĞü wskaĨnika. 332 CzöĈè III i Zwiökszanie funkcjonalnoĈci interfejsu aplikacji internetowej Postaü wskaĨnika ma zaleĪeü od numeru bieĪącej strony. WskaĨnik wyĞwietlamy w taki sposób, by, jeĞli to tylko moĪliwe, numer bieĪącej strony znajdowaá siĊ w Ğrodku. JeĞli szerokoĞü wskaĨnika wyniesie 5, to na stronie 13 zaprezentujemy numery: 11 12 13 14 15 a na stronie 39: 37 38 39 40 41 Na stronach początkowych, tj. pierwszej, drugiej i trzeciej, wyĞwietlimy identyczny wskaĨnik o numerach: 1 2 3 4 5 Innymi sáowy, jeĞli numer strony jest mniejszy od poáowy szerokoĞci wskaĨnika, to wyĞwietlamy wskaĨnik zadanej szerokoĞci rozpoczynający siĊ od strony 1. Podobna sytuacja wystąpi dla stron, których numery bĊdą bliskie numerowi ostatniej strony. JeĞli szerokoĞü wskaĨnika wyniesie 11, to na ostatnich piĊciu stronach, tj. na stronach o numerach 97, 98, 99, 100, 101, wyĞwietlimy wskaĨnik: 91 92 93 94 95 96 97 98 99 100 101 Jedynym przypadkiem, gdy wyĞwietlimy wskaĨnik krótszy od zadanej szerokoĞci, bĊdzie sytuacja, w której liczba otrzymanych stron jest mniejsza od szerokoĞci wskaĨnika. JeĞli w bazie danych umieĞcimy 20 rekordów oraz ustalimy liczbĊ rekordów na stronie na 10, a szerokoĞü wskaĨnika na 5, to wskaĨnik i tak bĊdzie zawieraá tylko dwa numery: 1 2 Projekt 21.1. 33 ѿ Wykonaj internetowy katalog páyt winylowych pt. 33 ̃. W interfejsie aplikacji uwzglĊd- nij fakt, Īe baza danych bĊdzie zawieraáa setki rekordów. Wszelkie listy rekordów prezentowanych na stronie WWW poddaj stronicowaniu. PracĊ nad projektem rozpoczynamy od wykonania bazy danych przedstawionej na ry- sunku 21.1. W omawianych do tej pory projektach mogliĞmy przyjąü, Īe identyfikatory slug, tworzone na podstawie nazw, tytuáów, imion czy nazwisk, są unikalne. W omawianym projekcie takiego zaáoĪenia przyjąü nie moĪemy. Piosenka o tym samym tytule moĪe pojawiü siĊ na wielu páytach. Na przykáad utwór pt. Good Times, Bad Times wystĊpuje na pierw- szej páycie zespoáu Led Zeppelin oraz na krąĪku pt. 12 X 5 grupy The Rolling Stones. Powielenie tytuáów wystąpi takĪe w przypadku skáadanek The Best of… utworów wy- branego zespoáu. W celu rozwiązania tego problemu nadpiszemy metodĊ setSlug() ustalającą wartoĞci kolumn slug. Rozdziaä 21. i Stronicowanie 333 Rysunek 21.1. Baza danych z projektu 21.1 Automatyczne generowanie identyfikatorów slug dla rekordów o zdublowanych tytuäach W jaki sposób rozwiąĪemy problem dublowania identyfikatorów slug? Kolejne zdu- blowane wartoĞci bĊdziemy numerowali. Pierwsza piosenka o tytule Good Times, Bad Times, którą wstawimy do bazy danych, otrzyma slug: good_times_bad_times Za drugim razem uĪyjemy wartoĞci good_times_bad_times2 Kolejne utwory, których tytuáy po przeksztaáceniu string2slug() dają napis good_ ´times_bad_times, otrzymają wartoĞci slug oznaczone kolejnymi liczbami: good_times_bad_times3 good_times_bad_times4 good_times_bad_times5 ... itd. Proces numeracji zdublowanych slugów zaimplementujemy w metodzie setSlug() klasy Song. Metoda ta jest przedstawiona na listingu 21.1. 334 CzöĈè III i Zwiökszanie funkcjonalnoĈci interfejsu aplikacji internetowej Listing 21.1. Metoda setSlug() klasy Song public function setSlug($slug) { if (trim($slug) == ) { $slug = nieznany ; } $next_slug = $slug; $c = new Criteria(); $c- add(SongPeer::SLUG, $next_slug); $ile = SongPeer::doCount($c); $unikatowy = ($ile == 0); $min = 2; $max = 4; while (!$unikatowy) { $next_slug = $slug . $min; $min++; if ($min $max + 1) { die( ****** ERROR Song::setSlug({$next_slug}) ); }; $c- clear(); $c- add(SongPeer::SLUG, $next_slug); $ile = SongPeer::doCount($c); $unikatowy = ($ile == 0); } parent::setSlug($next_slug); } PracĊ rozpoczynamy od sprawdzenia, czy napis slug jest niepusty. JeĞli wartoĞcią pa- rametru $slug jest napis skáadający siĊ z biaáych znaków, to jako wartoĞü slug przyj- mujemy napis nieznany: if (trim($slug) == ) { $slug = nieznany ; } WartoĞü zmiennej $slug przypisujemy do zmiennej $next_slug, po czym metodą doCount() zliczamy rekordy tabeli Song, które mają identyczną wartoĞü slug. Liczba ele- mentów o tej samej wartoĞci kolumny slug zostaje zapamiĊtana w zmiennej $ile: $next_slug = $slug; $c = new Criteria(); $c- add(SongPeer::SLUG, $next_slug); $ile = SongPeer::doCount($c); Rozdziaä 21. i Stronicowanie 335 Zmienna $poprawny przyjmuje wartoĞü logiczną informującą nas o tym, czy wartoĞü slug zawarta w zmiennej $next_slug jest unikatowa. JeĞli liczba znalezionych rekor- dów wynosi zero, to zmienna $unikatowy przyjmuje wartoĞü true: $unikatowy = ($ile == 0); Przygotowanie iteracji koĔczymy, ustalając maksymalny oraz minimalny numer do- dawany na koĔcu adresu slug: $min = 2; $max = 10000; Gáównym fragmentem przetwarzania w metodzie setSlug() jest pĊtla while. Przetwa- rzanie powtarzamy, dopóki zmienna $unikatowy przyjmuje wartoĞü false: while (!$unikatowy) { } czyli dopóki adres zawarty w zmiennej $next_slug nie jest unikatowy. W refrenie pĊtli najpierw tworzymy adres $next_slug, dodając na koĔcu adresu $slug kolejną liczbĊ: $next_slug = $slug . $min; $min++; JeĞli przekroczyliĞmy wartoĞü maksymalną, to dziaáanie skryptu koĔczymy, drukując informacjĊ o báĊdzie: if ($min $max + 1) { die( ****** ERROR Song::setSlug({$next_slug}) ); } JeĞli liczba dodana na koĔcu zmiennej $next_slug mieĞci siĊ w ustalonym zakresie, to przechodzimy do sprawdzenia, czy otrzymany adres slug jest unikatowy: $c- clear(); $c- add(SongPeer::SLUG, $next_slug); $ile = SongPeer::doCount($c); $unikatowy = ($ile == 0); JeĞli w którymkolwiek obrocie pĊtli while zmienna $unikatowy przyjmie wartoĞü true, oznaczaü to bĊdzie, Īe w bazie danych nie ma jeszcze rekordu o wartoĞci slug takiej jak zmienna $next_slug. Po zakoĔczeniu pĊtli wywoáujemy oryginalna metodĊ setSlug(), przekazując do niej zmienną $next_slug: parent::setSlug($next_slug); Klasa Pager Implementacja stronicowania sprowadza siĊ do przygotowania jednej klasy Pager. DziĊki wykorzystaniu klas generowanych przez Propel oraz kryteriów pojedyncza klasa Pager moĪe sáuĪyü do stronicowania rekordów z dowolnych tabel. TreĞü klasy Pager jest przedstawiona na listingu 21.2. 336 CzöĈè III i Zwiökszanie funkcjonalnoĈci interfejsu aplikacji internetowej Listing 21.2. Klasa Pager class Pager { private $klasa = ; private $klasaPeer = ; private $liczba_wszystkich_rekordow = 0; private $liczba_rekordow_na_stronie = 12; private $liczba_stron = 0; private $numer_strony = 0; private $numer_pierwszego_rekordu = 0; private $szerokosc = 11; private $base_url; private $rekordy; private $criteria = null; public function __construct( $klasa, $liczba_rekordow_na_stronie = 10, $criteria = null, $szerokosc = 11 ) { if (is_null($criteria)) { $this- criteria = new Criteria(); } else { $this- criteria = clone $criteria; } $this- klasa = $klasa; $this- klasaPeer = $klasa . Peer ; $this- liczba_rekordow_na_stronie = $liczba_rekordow_na_stronie; $this- przeliczLiczbeRekordow(); $this- przeliczLiczbeStron(); $this- szerokosc = $szerokosc; } public function przeliczLiczbeRekordow() { $this- liczba_wszystkich_rekordow = call_user_func($this- klasaPeer . ::doCount , $this- criteria); } public function przeliczLiczbeStron() { $this- liczba_stron = (int)ceil( $this- liczba_wszystkich_rekordow / $this- liczba_rekordow_na_stronie ); } public function isValidPage($page) { return str_ievpifr($page, 1, $this- liczba_stron); } public function setPage($page) { if ($this- isValidPage($page)) { Rozdziaä 21. i Stronicowanie 337 $this- numer_strony = $page; $this- numer_pierwszego_rekordu = ($page - 1) * $this- ´liczba_rekordow_na_stronie; } } public function getPages($szerokosc = false) { if ($szerokosc) { $this- setWidth($szerokosc); } $polowa = (int)floor($this- szerokosc / 2); $minimum = $this- numer_strony; $minimum = $minimum - $polowa; $minimum = max($minimum, 1); $maksimum = $minimum + $this- szerokosc - 1; $za_duzo = $maksimum - $this- liczba_stron; if ($za_duzo 0) { $minimum = $minimum - $za_duzo; $minimum = max($minimum, 1); } $maksimum = min($minimum + $this- szerokosc - 1, $this- liczba_stron); $pages = array(); for ($i = $minimum; $i = $maksimum; $i++) { $pages[] = $i; } return $pages; } public function assignRecords() { $this- criteria- setLimit($this- liczba_rekordow_na_stronie); $this- criteria- setOffset($this- numer_pierwszego_rekordu); $tmp = call_user_func($this- klasaPeer . ::doSelect , $this- criteria); $i = $this- numer_pierwszego_rekordu + 1; $this- rekordy = array(); foreach ($tmp as $obj) { $this- rekordy[$i] = $obj; $i++; } } public function getRecords() { return $this- rekordy; } public function setBaseURL($url) { 338 CzöĈè III i Zwiökszanie funkcjonalnoĈci interfejsu aplikacji internetowej return $this- base_url = $url; } public function getPageURL($page) { if ($page !== false) { return $this- base_url . $page; } else { return ; } } public function getPage() { return $this- numer_strony; } public function getFirstPage() { if ($this- liczba_stron 0) { return 1; } else { return false; } } public function getLastPage() { if ($this- liczba_stron 0) { return $this- liczba_stron; } else { return false; } } public function getPreviousPage() { if ($this- numer_strony 1) { return $this- numer_strony - 1; } else { return false; } } public function getNextPage() { if ($this- numer_strony $this- liczba_stron) { return $this- numer_strony + 1; } else { return false; } } public function getFirstPageURL() { return $this- getPageURL($this- getFirstPage()); } Rozdziaä 21. i Stronicowanie 339 public function getPreviousPageURL() { return $this- getPageURL($this- getPreviousPage()); } public function getNextPageURL() { return $this- getPageURL($this- getNextPage()); } public function getLastPageURL() { return $this- getPageURL($this- getLastPage()); } public function isPager() { return ($this- liczba_stron 1); } public function isCurrentPage($strona) { return ($strona == $pager- getPage()); } public function getNbPages() { return $this- liczba_stron; } public function leftDots($szerokosc = false) { if ($szerokosc) { $this- setWidth($szerokosc); } $polowa = (int)floor($this- szerokosc / 2); $minimum = $this- numer_strony; $minimum = $minimum - $polowa; $minimum = max($minimum, 1); $maksimum = $minimum + $this- szerokosc - 1; $za_duzo = $maksimum - $this- liczba_stron; if ($za_duzo 0) { $minimum = $minimum - $za_duzo; $minimum = max($minimum, 1); } return ($minimum 1); } public function rightDots($szerokosc = false) { ... } } 340 CzöĈè III i Zwiökszanie funkcjonalnoĈci interfejsu aplikacji internetowej Parametrami konstruktora klasy Pager są nazwa klasy poddawanej stronicowaniu, liczba rekordów na stronie, dodatkowe kryteria oraz szerokoĞü wskaĨnika. Wywoáanie: $pager = new Pager( Song ); umoĪliwi stronicowanie wszystkich rekordów z tabeli song. Liczba rekordów na stro- nie wyniesie 10, a szerokoĞü wskaĨnika (mierzona liczbą numerów stron) bĊdzie rów- na 11. JeĞli chcesz stronicowaü tylko piosenki rozpoczynające siĊ na literĊ A, w taki sposób by na stronie pojawiaáo siĊ 7 rekordów, a szerokoĞü wskaĨnika wynosiáa trzy numery stron, to wywoáaj konstruktor klasy Pager nastĊpująco: $c = new Criteria(); $c- add(SongPeer::TYTUL, A , Criteria::LIKE); $pager = new Pager( Song , 7, $c, 3); W konstruktorze najpierw w razie potrzeby klonujemy kryteria, a nastĊpnie we wáa- ĞciwoĞciach $this- klasa, $this- klasaPeer zapamiĊtujemy nazwĊ klasy oraz nazwĊ klasy Peer tabeli poddawanej stronicowaniu. Oprócz zapamiĊtania w odpowiednich wáaĞciwoĞciach otrzymanych parametrów konstruktor odpowiada za przeliczenie rekordów i stron. Zadanie to realizują dwie metody: przeliczLiczbeRekordow() oraz przeliczLiczbeStron(). Metoda przeliczLiczbeRekordow() musi wyznaczyü liczbĊ rekordów pasujących do zadanych kryteriów. W treĞci metody musimy wywoáaü metodĊ doCount() odpowied- niej klasy Peer. Przeliczenie liczby rekordów w tabeli Song z wykorzystaniem metody doCount() przyjmuje postaü: $c = New Criteria(); $x = SongPeer::doCount($c); NazwĊ klasy Peer ustaliliĞmy we wáaĞciwoĞci $this- klasaPeer, a kryteria — we wáaĞciwoĞci $this- criteria. W celu wywoáania metody o nazwie x dla klasy y z pa- rametrem z naleĪy uĪyü funkcji call_user_func(): $wynik = call_user_func(y, x, z); TreĞü metody przeliczLiczbeRekordow() sprowadza siĊ wiĊc do jednej instrukcji: $this- liczba_wszystkich_rekordow = call_user_func($this- klasaPeer . ::doCount , $this- criteria); Liczba stron jest zaokrąglonym w górĊ wynikiem dzielenia liczby rekordów przez liczbĊ rekordów na stronie: $this- liczba_stron = (int)ceil( $this- liczba_wszystkich_rekordow / $this- liczba_rekordow_na_stronie ); W ten sposób mamy ustaloną liczbĊ wszystkich rekordów oraz liczbĊ stron. Numeracja stron bĊdzie zawsze rozpoczynaáa siĊ od 1 i koĔczyáa na numerze ostatniej strony. Zatem walidacja numeru strony realizowana w metodzie isValidPage() bĊ- dzie wykonana przy uĪyciu funkcji str_ievpifr(): return str_ievpifr($page, 1, $this- liczba_stron); Rozdziaä 21. i Stronicowanie 341 Numer bieĪącej strony ustalamy metodą setPage(). Metoda ta otrzymany parametr $page poddaje walidacji, po czym w razie powodzenia zapamiĊtuje numer strony oraz wyznacza numer pierwszego rekordu. Numer pierwszego rekordu wynika z liczby re- kordów na stronie: $this- numer_pierwszego_rekordu = ($page - 1) * $this- liczba_rekordow_na_stronie; Kolejna metoda, getPages(), zwraca numery stron, które naleĪy wyĞwietliü na bieĪą- cej, tj. ustalonej metodą setPage(), stronie. W metodzie tej ustalamy dwie zmienne: $minimum oraz $maksimum. Zwracanym wynikiem jest tablica wartoĞci caákowitych od minimum do maksimum. WartoĞü minimum jest numerem pierwszej strony przesuniĊtym o poáowĊ szerokoĞci wskaĨnika, jednak nigdy nie mniejszym od 1: $minimum = $this- numer_strony; $minimum = $minimum - $polowa; $minimum = max($minimum, 1); WartoĞü maksimum otrzymujemy przez dodanie szerokoĞci wskaĨnika do minimum: $maksimum = $minimum + $this- szerokosc - 1; Musimy sprawdziü, czy wartoĞü maksimum nie wyskoczyáa poza numer ostatniej strony. W zmiennej $za_duzo ustalamy, o ile wartoĞü maksimum przekracza numer bieĪącej strony: $za_duzo = $maksimum - $this- liczba_stron; JeĞli otrzymamy liczbĊ dodatnią, to musimy przesunąü wartoĞü minimalną w lewo o otrzymaną nadwyĪkĊ, ciągle gwarantując, Īe minimum nie jest mniejsze od 1: if ($za_duzo 0) { $minimum = $minimum - $za_duzo; $minimum = max($minimum, 1); } Ostatnim etapem jest ustalenie maksimum dla nowej wartoĞci minimum. Tym razem wartoĞü maksimum ustalamy tak, by nie przekroczyü liczby stron: $maksimum = min($minimum + $this- szerokosc - 1, $this- liczba_stron); Wyznaczone wartoĞci maksimum i minimum podlegają wymogom opisanym we wstĊpie:  numeracja stron zawsze rozpoczyna siĊ od 1 i dochodzi do numeru ostatniej strony;  numery stron są podawane w taki sposób, by — jeĞli to moĪliwe — numer bieĪącej strony byá w Ğrodku;  jeĞli liczba wszystkich stron jest wiĊksza od szerokoĞci, to liczba podawanych stron jest zawsze równa szerokoĞci wskaĨnika;  jeĞli szerokoĞü wskaĨnika jest wiĊksza lub równa liczbie dostĊpnych stron, to podajemy numery wszystkich stron. 342 CzöĈè III i Zwiökszanie funkcjonalnoĈci interfejsu aplikacji internetowej Wynikiem funkcji getPages() jest tablica zawierająca numery stron. Kolejnymi waĪnymi metodami są metody assignRecords() oraz getRecords(). Metody te zapewniają dostĊp do rekordów, które naleĪy wyĞwietliü na bieĪącej stronie. Metoda getRecords() najpierw modyfikuje kryteria wyboru rekordów, doáączając ogra- niczenia iloĞciowe: $this- criteria- setLimit($this- liczba_rekordow_na_stronie); $this- criteria- setOffset($this- numer_pierwszego_rekordu); PowyĪsze kryteria gwarantują, Īe z bazy danych pobierzemy co najwyĪej liczba_ ´rekordow_na_stronie rekordów oraz Īe numer pierwszego pobieranego rekordu wynie- sie numer_pierwszego_rekordu. Rekordy pobieramy, wywoáując metodĊ doSelect() klasy Peer, której nazwa jest za- warta we wáaĞciwoĞci $this- klasaPeer: $tmp = call_user_func($this- klasaPeer . ::doSelect , $this- criteria); Otrzymane rekordy przepisujemy do tablicy $this- rekordy: $i = $this- numer_pierwszego_rekordu + 1; $this- rekordy = array(); foreach ($tmp as $obj) { $this- rekordy[$i] = $obj; $i++; } ZauwaĪ, Īe indeksacja w tablicy $this- rekordy rozpoczyna siĊ od wartoĞci numer_ ´pierwszego_rekordu + 1. DziĊki temu tabelka HTML prezentująca rekordy na stro- nie WWW bĊdzie mogáa zawieraü numeracjĊ rekordów. Zadaniem metody getRecords() jest tylko udostĊpnienie prywatnej tablicy $this- ´rekordy. Metody setBaseURL() oraz getPageURL uáatwiają operowanie adresami URL do kolej- nych stron. Metodą setBaseURL() ustalamy adres bazowy kolejnych stron. Adresy stron powstają przez dopisanie na koĔcu adresu bazowego numeru bieĪącej strony. Wywo- áanie metody getPageURL(5) z parametrem 5 zwróci adres URL piątej strony. Metody getPage(), getFirstPage(), getPreviousPage(), getNextPage() oraz getLast ´Page() zwracają numer bieĪącej, pierwszej, poprzedniej, nastĊpnej oraz ostatniej strony. Odpowiadające im metody getFirstPageURL(), getPreviousPageURL(), getNextPageURL() oraz getLastPageURL() udostĊpniają ich adresy URL. Metody pomocnicze isPager() oraz isCurrentPage() uáatwiają operowanie wskaĨni- kiem stronicowania. Pierwsza z nich odpowiada, czy liczba stron jest wiĊksza od 1, a druga, czy podany numer strony jest identyczny jak numer strony bieĪącej. Metoda getNbPages() udostĊpnia liczbĊ stron. Rozdziaä 21. i Stronicowanie 343 Ostatnimi metodami pomocniczymi są metody leftDots() oraz rightDots(). Zwra- cają one informacjĊ logiczną mówiącą o tym, czy znajdujemy siĊ przy lewej lub pra- wej krawĊdzi wskaĨnika. JeĞli leftDots() zwraca wartoĞü true, to oznacza, Īe numer minimalnej strony jest wiĊkszy od 1 i w widoku wskaĨnika stronicowania naleĪy umieĞciü wykropkowanie postaci: ...7 8 9 W podobny sposób funkcja rightDots() stwierdza koniecznoĞü wyĞwietlania wykrop- kowania z prawej strony: 7 8 9... Widok wskaĒnika stronicowania DziĊki sparametryzowaniu wskaĨnika stronicowania nazwą klasy, kryteriami, szero- koĞcią, liczbą rekordów na stronie oraz bazowym adresem URL ten sam widok czĊ- Ğciowy _pager.html bĊdzie wykorzystany do stronicowania dowolnych rekordów. Widok czĊĞciowy _pager.html jest przedstawiony na listingu 21.3. Listing 21.3. Widok czĊĞciowy _pager.html ?php if (isset($pager) $pager- isPager()): ? div class= pager ?php if ($pager- getPreviousPage()): ? a href= ?php echo $pager- getFirstPageURL(); ? FIRST /a a href= ?php echo $pager- getPreviousPageURL(); ? PREV /a ?php else: ? FIRST PREV ?php endif; ? ?php if ($pager- leftDots()): ? ... ?php endif; ? ?php foreach ($pager- getPages(8) as $strona): ? ?php if (!$pager- isCurrentPage($strona)): ? a href= ?php echo $pager- getPageURL($strona); ? ?php echo $strona; ? /a ?php else: ? strong ?php echo $strona; ? /strong ?php endif; ? ?php endforeach; ? ?php if ($pager- rightDots()): ? ... ?php endif; ? ?php if ($pager- getNextPage()): ? a href= ?php echo $pager- getNextPageURL(); ? NEXT /a a href= ?php echo $pager- getLastPageURL(); ? LAST /a ?php else: ? 344 CzöĈè III i Zwiökszanie funkcjonalnoĈci interfejsu aplikacji internetowej NEXT LAST ?php endif; ? /div ?php endif; ? Widok rozpoczynamy od sprawdzenia, czy wskaĨnik stronicowania jest konieczny. WskaĨnik wyĞwietlamy tylko wówczas, gdy liczba stron jest wiĊksza od 1: ?php if (isset($pager) $pager- isPager()): ? ... ?php endif; ? Caáy wskaĨnik jest zawarty w elemencie div o identyfikatorze pager. Umieszczamy w nim piĊü grup elementów:  wskaĨniki do pierwszego i poprzedniego rekordu;  lewy wielokropek;  numery stron;  prawy wielokropek;  wskaĨnik nastĊpnego i ostatniego rekordu. Odsyáacze do pierwszego i poprzedniego rekordu wyĞwietlamy pod warunkiem, Īe po- przednia strona jest dostĊpna. JeĞli tak, to widok bĊdzie zawieraá dwa hiperáącza, a jeĞli nie — napisy: ?php if ($pager- getPreviousPage()): ? a href= ?php echo $pager- getFirstPageURL(); ? FIRST /a a href= ?php echo $pager- getPreviousPageURL(); ? PREV /a ?php else: ? FIRST PREV ?php endif; ? Adresy URL zawarte w hiperáączach są zwracane przez metody getFirstPageURL() oraz getPreviousPageURL(), co uniezaleĪnia widok _pager.html od postaci adresów URL. O wyĞwietlaniu lewego wielokropka decyduje metoda leftDots(): ?php if ($pager- leftDots()): ? ... ?php endif; ? Najbardziej skomplikowanym fragmentem widoku _pager.html jest pĊtla foreach produkująca numery stron. PĊtla ta przetwarza numery stron zwracane przez metodĊ getPages(). Parametrem tej metody jest szerokoĞü wskaĨnika. JeĞli podamy wartoĞü 7, to otrzymamy wskaĨnik o szerokoĞci 7: ?php foreach ($pager- getPages(7) as $strona): ? ?php if (!$pager- isCurrentPage($strona)): ? strong ?php echo $strona; ? /strong ?php else: ? Rozdziaä 21. i Stronicowanie 345 a href= ?php echo $pager- getPageURL($strona); ? ?php echo $strona; ? /a ?php endif; ? ?php endforeach; ? W pĊtli foreach przetwarzamy numery stron zwrócone przez metodĊ getPages(). Sprawdzamy, czy numer kolejnej strony jest równy numerowi strony bieĪącej. JeĞli tak, to drukujemy numer strony bieĪącej ujĊty w znaczniki strong /strong , a jeĞli nie, drukujemy hiperáącze do strony o zadanym numerze. Drukowanie prawego wielokropka, podobnie jak wielokropka z lewej strony, jest za- bezpieczone instrukcją if: ?php if ($pager- rightDots()): ? ... ?php endif; ? a wydruk hiperáączy do nastĊpnej i ostatniej strony realizujemy analogicznie jak wy- druk hiperáączy FIRST i PREV. OczywiĞcie w miejsce napisów FIRST, PREV, NEXT, LAST moĪemy uĪyü wskaĨni- ków graficznych. KaĪdy wskaĨnik naleĪy wykonaü w dwóch wersjach: jako aktywny i jako nieaktywny. JeĞli obrazy dla opcji FIRST zapiszemy w plikach first.png oraz first-brak.png w folderze aplikacja/www/img/, wówczas wydruk hiperáącza do pierw- szego rekordu przyjmie postaü: a href= ?php echo $pager- getFirstPageURL(); ? img src= ?php echo $path_prefix; ? img/first.png alt= / /a a etykietĊ FIRST prezentowaną, gdy przycisk FIRST jest nieaktywny, wykonamy jako: img src= ?php echo $path_prefix; ? img/first-brak.png alt= / W identyczny sposób wykonujemy graficzne wersje odsyáaczy PREV, NEXT, LAST. Prezentacja rekordów poddanych stronicowaniu Omawiana aplikacja zawiera tabele artist, rekord, song oraz year. Stronicowanie re- kordów umieĞcimy najpierw w akcjach prezentujących zestawienie wszystkich rekor- dów, czyli w akcjach:  artist/list,  rekord/list,  song/list,  year/list. Metoda akcji artist/list jest przedstawiona
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

PHP, MySQL i MVC. Tworzenie witryn WWW opartych na bazie danych
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: