Naucz się korzystać z pełni możliwości biblioteki MVC!
Co to jest model MVC i dlaczego warto z niego korzystać?
Jak programować z użyciem biblioteki MVC?
Jak stworzyć aplikację internetową lub stronę WWW dzięki Symfony?
Symfony, framework stworzony w języku PHP i mający na celu uproszczenie oraz przyspieszenie tworzenia aplikacji internetowych, znajduje zastosowanie w coraz większej liczbie projektów. Jego wykorzystanie wiąże się ze znacznie efektywniejszym programowaniem, a także pozwala uniknąć wielu błędów i powtarzających się, nużących czynności. Symfony opiera się na modelu MVC i posiada wiele wbudowanych funkcji - między innymi ochronę przed atakami CSRF oraz XSS. Ten framework nie ogranicza się do wykorzystania własnej biblioteki, lecz zapewnia także możliwość integracji z innymi. Jeśli chcesz nauczyć się, jak to działa w praktyce, trzymasz w rękach właściwą pozycję!
Książka 'Symfony w przykładach' jest możliwie najbardziej skondensowaną instrukcją obsługi Symfony. Żeby ją zrozumieć, nie musisz dysponować oszałamiającą wiedzą - wystarczą podstawy PHP i XHTML/CSS. Jej autor poprowadzi Cię od najprostszych projektów ('Hello world'), przez nieco bardziej zaawansowane zagadnienia, dotyczące zewnętrznych zasobów, połączenia projektu z bazą danych, publikacji projektu na serwerze hostingowym, aż po tworzenie różnego typu paneli administracyjnych. Krótko mówiąc, na samych konkretnych przykładach przejdziesz drogę do stworzenia własnej, niezawodnie działającej aplikacji internetowej.
Pierwszy projekt w Symfony i praca w środowisku NetBeans
Wymiana szablonu XHTML/CSS i dołączanie zewnętrznych zasobów
Hiperłącza i strona błędu 404
Publikowanie projektu na serwerze hostingowym
Dostosowywanie klas generowanych przez Propel
Wyświetlanie danych rekordu i identyfikacja rekordów na podstawie wartości slug
Artykuły na temat HTML/CSS
Umieszczanie w bazie danych plików binarnych
Pliki do pobrania i komponent menu
Relacje 1:n oraz n:m i widoki częściowe
Panele administracyjne i tłumaczenie interfejsu witryny
Zbiór zadań C++
Administracja kontami użytkowników i generowanie paneli administracyjnych
Zabezpieczanie paneli administracyjnych protokołem HTTPS
I Ty możesz ułatwić sobie tworzenie doskonałych aplikacji internetowych!
Darmowy fragment publikacji:
Idź do
Symfony w przykładach
• Spis treści
• Przykładowy rozdział
Autor: Włodzimierz Gajda
ISBN: 978-83-246-2788-2
Format: 158×235, stron: 384
Katalog książek
• Katalog online
• Zamów drukowany
katalog
Twój koszyk
• Dodaj do koszyka
Cennik i informacje
• Zamów informacje
o nowościach
• Zamów cennik
Czytelnia
• Fragmenty książek
online
Kontakt
Helion SA
ul. Kościuszki 1c
44-100 Gliwice
tel. 32 230 98 63
e-mail: helion@helion.pl
© Helion 1991–2011
Naucz się korzystać z pełni możliwości biblioteki MVC!
• Co to jest model MVC i dlaczego warto z niego korzystać?
• Jak programować z użyciem biblioteki MVC?
• Jak stworzyć aplikację internetową lub stronę WWW dzięki Symfony?
Symfony, framework stworzony w języku PHP i mający na celu uproszczenie oraz przyspieszenie
tworzenia aplikacji internetowych, znajduje zastosowanie w coraz większej liczbie projektów.
Jego wykorzystanie wiąże się ze znacznie efektywniejszym programowaniem, a także pozwala
uniknąć wielu błędów i powtarzających się, nużących czynności. Symfony opiera się na modelu
MVC i posiada wiele wbudowanych funkcji – między innymi ochronę przed atakami CSRF oraz
XSS. Ten framework nie ogranicza się do wykorzystania własnej biblioteki, lecz zapewnia także
możliwość integracji z innymi. Jeśli chcesz nauczyć się, jak to działa w praktyce, trzymasz w rękach
właściwą pozycję!
Książka „Symfony w przykładach” jest możliwie najbardziej skondensowaną instrukcją obsługi
Symfony. Żeby ją zrozumieć, nie musisz dysponować oszałamiającą wiedzą – wystarczą podstawy
PHP i XHTML/CSS. Jej autor poprowadzi Cię od najprostszych projektów ( Hello world ), przez
nieco bardziej zaawansowane zagadnienia, dotyczące zewnętrznych zasobów, połączenia
projektu z bazą danych, publikacji projektu na serwerze hostingowym, aż po tworzenie różnego
typu paneli administracyjnych. Krótko mówiąc, na samych konkretnych przykładach przejdziesz
drogę do stworzenia własnej, niezawodnie działającej aplikacji internetowej.
• Pierwszy projekt w Symfony i praca w środowisku NetBeans
• Wymiana szablonu XHTML/CSS i dołączanie zewnętrznych zasobów
• Hiperłącza i strona błędu 404
• Publikowanie projektu na serwerze hostingowym
• Dostosowywanie klas generowanych przez Propel
• Wyświetlanie danych rekordu i identyfikacja rekordów na podstawie wartości slug
• Artykuły na temat HTML/CSS
• Umieszczanie w bazie danych plików binarnych
• Pliki do pobrania i komponent menu
• Relacje 1:n oraz n:m i widoki częściowe
• Panele administracyjne i tłumaczenie interfejsu witryny
• Zbiór zadań C++
• Administracja kontami użytkowników i generowanie paneli administracyjnych
• Zabezpieczanie paneli administracyjnych protokołem HTTPS
I Ty możesz ułatwić sobie tworzenie doskonałych aplikacji internetowych!
Spis treĈci
5
Spis treĈci
Podziökowania ............................................................................... 13
Wstöp ............................................................................................ 15
Tworzenie stron WWW w Symfony ................................ 17
CzöĈè I
Rozdziaä 1. Pierwszy projekt w Symfony ........................................................... 19
Przykáad 1. Hello, World! ............................................................................................... 19
ROZWIĄZANIE ............................................................................................................ 19
Krok 1. Utwórz nowy projekt Symfony ................................................................... 19
Krok 2. Utwórz aplikacjĊ frontend ........................................................................... 20
Krok 3. Utwórz moduá o nazwie glowny .................................................................. 22
Krok 4. Utwórz akcjĊ glowny/powitanie .................................................................. 23
Krok 5. OdwiedĨ akcjĊ glowny/powitanie ............................................................... 24
Zestawienie poznanych poleceĔ ..................................................................................... 24
Struktura aplikacji tworzonej w Symfony ...................................................................... 25
ĝrodowiska ..................................................................................................................... 28
Pasek narzĊdzi Debug toolbar ........................................................................................ 30
Uruchomienie gotowego projektu .................................................................................. 32
Rozdziaä 2. Praca w Ĉrodowisku NetBeans ........................................................ 33
Przykáad 2. Witaj w NetBeans! ...................................................................................... 33
ROZWIĄZANIE ............................................................................................................ 33
Krok 1. Utwórz nowy projekt Symfony w NetBeans ............................................... 33
Krok 2. Utwórz moduá glowny w aplikacji frontend ................................................ 38
Krok 3. UsuĔ akcjĊ glowny/index ............................................................................ 40
Krok 4. Utwórz akcjĊ glowny/powitanie .................................................................. 40
Krok 5. ZmieĔ tytuá strony glowny/powitanie .......................................................... 41
Krok 6. ZmieĔ adres URL strony gáównej ............................................................... 42
Krok 7. WyczyĞü pamiĊü podrĊczną aplikacji .......................................................... 43
Rozdziaä 3. Wymiana szablonu XHTML/CSS ...................................................... 45
Przykáad 3. Wierszyk pt. Dwa kabele ............................................................................. 45
ROZWIĄZANIE ............................................................................................................ 45
Krok 1. Utwórz nowy projekt Symfony w NetBeans ............................................... 45
Krok 2. Utwórz moduá wierszyk w aplikacji frontend .............................................. 46
Krok 3. UsuĔ akcjĊ glowny/index ............................................................................ 46
Krok 4. Utwórz akcjĊ wierszyk/pokaz ...................................................................... 46
6
Symfony w przykäadach
Krok 5. ZmieĔ tytuá strony wierszyk/pokaz ............................................................. 47
Krok 6. ZmieĔ adres URL strony gáównej ............................................................... 47
Krok 7. ZmieĔ szablon XHTML/CSS ...................................................................... 48
Przebieg wykonania aplikacji ......................................................................................... 52
Rozdziaä 4. Doäñczanie zewnötrznych zasobów .................................................. 55
Przykáad 4. ĩmija ........................................................................................................... 56
ROZWIĄZANIE ............................................................................................................ 57
Krok 1. Utwórz nowy projekt ................................................................................... 57
Krok 2. Utwórz moduá animal .................................................................................. 57
Krok 3. UsuĔ akcjĊ animal/index ............................................................................. 57
Krok 4. Utwórz akcjĊ animal/show .......................................................................... 57
Krok 5. ZmieĔ tytuá strony ....................................................................................... 58
Krok 6. ZmieĔ adres URL strony gáównej ............................................................... 58
Krok 7. ZmieĔ szablon XHTML/CSS ...................................................................... 58
Krok 8. W widoku akcji animal/show wstaw zdjĊcie Īmii ....................................... 60
Analiza kodu XHTML generowanego przez aplikacjĊ ................................................... 61
Rozdziaä 5. Hiperäñcza ...................................................................................... 63
Przykáad 5. Fraszki ......................................................................................................... 63
ROZWIĄZANIE ............................................................................................................ 64
Krok 1. Utwórz projekt, aplikacjĊ i moduá ............................................................... 64
Krok 2. UsuĔ akcjĊ wiersz/index .............................................................................. 64
Krok 3. Utwórz akcjĊ wiersz/dogoscia ..................................................................... 65
Krok 4. Utwórz akcjĊ wiersz/naswojeksiegi ............................................................. 66
Krok 5. Utwórz akcjĊ wiersz/ozywocieludzkim ....................................................... 67
Krok 6. ZmieĔ szablon XHTML/CSS ...................................................................... 67
Krok 7. Zmodyfikuj hiperáącza zawarte w menu ...................................................... 69
Krok 8. ZmieĔ adresy URL fraszek .......................................................................... 70
Krok 9. ZmieĔ tytuáy stron serwisu .......................................................................... 73
Rozdziaä 6. Strona bäödu 404 ........................................................................... 75
Przykáad 6. Gady ............................................................................................................ 75
ROZWIĄZANIE ............................................................................................................ 77
Krok 1. Utwórz nowy projekt, aplikacjĊ i moduá ..................................................... 77
Krok 2. ZmieĔ akcje moduáu strony ......................................................................... 77
Krok 3. ZmieĔ szablon XHTML/CSS ...................................................................... 78
Krok 4. WymieĔ adresy URL w pliku routing.yml .................................................. 79
Krok 5. ZmieĔ tytuáy stron serwisu .......................................................................... 80
Krok 6. OdwiedĨ domyĞlną stronĊ báĊdu 404 ........................................................... 81
Krok 7. Utwórz akcjĊ strony/blad404 ....................................................................... 82
Krok 8. Zdefiniuj stronĊ báĊdu 404 aplikacji frontend .............................................. 83
Analiza odpowiedzi HTTP ............................................................................................. 85
Rozdziaä 7. Publikowanie projektu na serwerze hostingowym ............................ 87
Przykáad 7.1. Zabytki Lublina ........................................................................................ 87
ROZWIĄZANIE ............................................................................................................ 88
Etap 1. Wykonaj aplikacjĊ na komputerze lokalnym ............................................... 88
Etap 2. Opublikuj witrynĊ na serwerze hostingowym .............................................. 91
Przykáad 7.2. Gady (publikowanie na serwerze NetArt) ................................................ 96
ROZWIĄZANIE ............................................................................................................ 96
Krok 1. Przekopiuj bibliotekĊ Symfony na serwer ................................................... 96
Krok 2. WyczyĞü pamiĊü podrĊczną i usuĔ kontrolery deweloperskie ..................... 96
Krok 3. Zmodyfikuj ĞcieĪkĊ do biblioteki Symfony ................................................ 96
Krok 4. Przekopiuj projekt na serwer ....................................................................... 97
Spis treĈci
7
Krok 5. Zablokuj dostĊp do plików .......................................................................... 97
Krok 6. ZmieĔ domenĊ projektu na gady.twojadomena.nazwa.pl ............................ 97
Rozdziaä 8. Czego dowiedziaäeĈ siö w pierwszej czöĈci? .................................... 99
CzöĈè II Warstwy M oraz V ...................................................... 101
Rozdziaä 9. Pierwszy projekt Symfony wykorzystujñcy bazy danych .................. 103
Przykáad 9. NajdáuĪsze rzeki Ğwiata ............................................................................. 103
ROZWIĄZANIE .......................................................................................................... 104
Etap 1. Przygotuj pustą bazĊ danych ...................................................................... 104
Etap 2. Zaprojektuj strukturĊ bazy danych ............................................................. 105
Etap 3. Utwórz szkielet aplikacji ............................................................................ 109
Etap 4. WymieĔ szablon XHTML/CSS .................................................................. 117
Etap 5. Dostosuj wygląd akcji rzeka/index ............................................................. 117
Zestawienie plików ....................................................................................................... 119
Klasy dostĊpu do bazy danych ............................................................................... 120
Przebieg wykonania aplikacji ................................................................................. 123
Uruchomienie gotowego projektu .......................................................................... 124
Rozdziaä 10. Dostosowywanie klas generowanych przez Propel ......................... 125
Przykáad 10. Tatry ........................................................................................................ 125
ROZWIĄZANIE .......................................................................................................... 125
Krok 1. Utwórz pustą bazĊ danych ......................................................................... 125
Krok 2. Zaprojektuj bazĊ danych ........................................................................... 126
Krok 3. Utwórz projekt z aplikacją frontend .......................................................... 127
Krok 4. Skonfiguruj dostĊp do bazy danych ........................................................... 127
Krok 5. Wypeánij bazĊ danych rekordami .............................................................. 127
Krok 6. Wygeneruj panel administracyjny CRUD ................................................. 129
Krok 7. Dostosuj klasy wygenerowane przez Propel ............................................. 130
Krok 8. Dostosuj moduá szczyt .............................................................................. 133
Krok 9. Dostosuj wygląd witryny ........................................................................... 134
Testowanie poprawnoĞci generowanego kodu XHTML .............................................. 135
Rozdziaä 11. Akcja show — wyĈwietlanie szczegóäowych danych rekordu .......... 137
Przykáad 11. Piosenki wojskowe .................................................................................. 138
ROZWIĄZANIE .......................................................................................................... 138
Krok 1. Utwórz pustą bazĊ danych ......................................................................... 138
Krok 2. Zaprojektuj bazĊ danych ........................................................................... 139
Krok 3. Utwórz projekt z aplikacją frontend .......................................................... 140
Krok 4. Skonfiguruj dostĊp do bazy danych ........................................................... 140
Krok 5. Dostosuj klasy wygenerowane przez Propel ............................................. 140
Krok 6. Napisz dynamiczny skrypt YAML
odpowiedzialny za wypeánianie bazy .................................................................. 141
Krok 7. Wygeneruj panel CRUD z akcjami show .................................................. 144
Krok 8. Dostosuj moduá piosenka .......................................................................... 144
Krok 9. Dostosuj wygląd witryny ........................................................................... 148
Krok 10. ZmieĔ tytuáy stron ................................................................................... 148
Krok 11. Zmodyfikuj adresy URL stron z piosenkami ........................................... 150
Rozdziaä 12. Identyfikacja rekordów na podstawie wartoĈci slug ....................... 151
Przykáad 12. Artykuáy na temat HTML/CSS ................................................................ 152
ROZWIĄZANIE .......................................................................................................... 153
Krok 1. Przeanalizuj pliki XHTML z treĞcią artykuáów ......................................... 153
Krok 2. Przygotuj funkcje pomocnicze .................................................................. 153
8
Symfony w przykäadach
Krok 3. Utwórz pustą bazĊ danych artykuly ........................................................... 162
Krok 4. Zaprojektuj bazĊ danych ........................................................................... 162
Krok 5. Utwórz projekt z aplikacją frontend .......................................................... 163
Krok 6. Skonfiguruj dostĊp do bazy danych ........................................................... 163
Krok 7. Dostosuj klasy wygenerowane przez Propel ............................................. 164
Krok 8. Przygotuj skrypt, który wypeáni bazĊ danych ............................................ 166
Krok 9. Wypeánij bazĊ danych rekordami .............................................................. 168
Krok 10. Wygeneruj panel CRUD z akcjami show ................................................ 168
Krok 11. UsuĔ zbĊdne akcje moduáu artykul ......................................................... 169
Krok 12. ZmieĔ metodĊ identyfikowania rekordów ............................................... 169
Krok 13. Wyáącz cytowanie kodu XHTML ........................................................... 170
Krok 14. Dostosuj wygląd witryny ......................................................................... 172
Krok 15. ZmieĔ tytuáy stron ................................................................................... 173
Krok 16. Zmodyfikuj adresy URL stron z artykuáami ............................................ 173
Krok 17. Zminimalizuj liczbĊ bajtów pobieraną w akcji artykul/index .................. 173
Rozdziaä 13. Komponent menu ......................................................................... 177
Przykáad 13. Treny ....................................................................................................... 177
ROZWIĄZANIE .......................................................................................................... 178
Krok 1. Utwórz pustą bazĊ danych ......................................................................... 178
Krok 2. Zaprojektuj bazĊ danych ........................................................................... 179
Krok 3. Utwórz projekt z aplikacją frontend .......................................................... 179
Krok 4. Wykonaj moduá glowny z akcjami powitanie oraz blad404 ...................... 179
Krok 5. Skonfiguruj dostĊp do bazy danych ........................................................... 180
Krok 6. Dostosuj klasy wygenerowane przez Propel ............................................. 180
Krok 7. Przygotuj zadanie propel:import-danych ................................................... 181
Krok 8. Wypeánij bazĊ danych rekordami .............................................................. 182
Krok 9. Wygeneruj panel CRUD z akcjami show .................................................. 183
Krok 10. UsuĔ zbĊdne akcje moduáu artykul ......................................................... 183
Krok 11. ZmieĔ metodĊ identyfikowania rekordów ............................................... 183
Krok 12. ZmieĔ adresy URL .................................................................................. 183
Krok 13. Przygotuj komponent menu ..................................................................... 184
Krok 14. Dostosuj wygląd witryny ......................................................................... 185
Krok 15. ZmieĔ tytuáy stron ................................................................................... 185
Krok 16. Wykonaj zrzut bazy danych .................................................................... 185
Rozdziaä 14. Umieszczanie plików binarnych w bazie danych ............................. 189
Przykáad 14. Pliki do pobrania ...................................................................................... 189
ROZWIĄZANIE .......................................................................................................... 189
Krok 1. Utwórz pustą bazĊ danych ......................................................................... 189
Krok 2. Zaprojektuj bazĊ danych ........................................................................... 190
Krok 3. Utwórz projekt z aplikacją frontend .......................................................... 191
Krok 4. Wykonaj moduá glowny z akcją blad404 .................................................. 191
Krok 5. Skonfiguruj dostĊp do bazy danych ........................................................... 191
Krok 6. Dostosuj klasy wygenerowane przez Propel ............................................. 191
Krok 7. Przygotuj zadanie propel:import-danych ................................................... 192
Krok 8. Wypeánij bazĊ danych rekordami .............................................................. 193
Krok 9. Wygeneruj panel CRUD ........................................................................... 194
Krok 10. UsuĔ zbĊdne akcje moduáu artykul ......................................................... 194
Krok 11. Zmodyfikuj funkcjĊ executeShow() ........................................................ 194
Krok 12. Zmodyfikuj widok akcji plik/show .......................................................... 195
Krok 13. Dostosuj widok akcji plik/index .............................................................. 196
Krok 14. ZmieĔ adresy URL .................................................................................. 197
Krok 15. Dostosuj wygląd witryny ......................................................................... 198
Spis treĈci
9
Rozdziaä 15. Relacje 1:n .................................................................................. 199
Przykáad 15. Kontynenty/paĔstwa ................................................................................ 203
ROZWIĄZANIE .......................................................................................................... 204
Krok 1. Przeanalizuj szablon XHTML ................................................................... 204
Krok 2. Utwórz pustą bazĊ danych ......................................................................... 205
Krok 3. Zaprojektuj bazĊ danych ........................................................................... 205
Krok 4. Utwórz projekt z aplikacją frontend .......................................................... 205
Krok 5. Wykonaj moduá glowny ............................................................................ 205
Krok 6. Skonfiguruj dostĊp do bazy danych ........................................................... 206
Krok 7. Dostosuj klasy wygenerowane przez Propel ............................................. 206
Krok 8. Przygotuj zadanie propel:import-danych ................................................... 207
Krok 9. Wypeánij bazĊ danych rekordami .............................................................. 209
Krok 10. Wygeneruj panele CRUD dla tabel kontynent oraz panstwo ................... 209
Krok 11. UsuĔ zbĊdne akcje moduáów kontynent oraz panstwo ............................ 209
Krok 12. Zmodyfikuj funkcje executeShow() ........................................................ 209
Krok 13. Dostosuj widoki akcji kontynent/index oraz panstwo/index ................... 210
Krok 14. Zmodyfikuj widok akcji kontynent/show ................................................ 210
Krok 15. Zmodyfikuj widok akcji panstwo/show ................................................... 211
Krok 16. ZmieĔ adresy URL .................................................................................. 211
Krok 17. Dostosuj wygląd witryny ......................................................................... 212
Krok 18. Ustal tytuáy stron ..................................................................................... 213
Rozdziaä 16. Relacje n:m ................................................................................. 215
Przykáad 16. Filmy/Aktorzy ......................................................................................... 217
ROZWIĄZANIE .......................................................................................................... 218
Krok 1. Utwórz pustą bazĊ danych ......................................................................... 218
Krok 2. Zaprojektuj bazĊ danych ........................................................................... 219
Krok 3. Utwórz projekt z aplikacją frontend .......................................................... 219
Krok 4. Wykonaj moduá glowny ............................................................................ 219
Krok 5. Skonfiguruj dostĊp do bazy danych ........................................................... 219
Krok 6. Dostosuj klasy wygenerowane przez Propel ............................................. 220
Krok 7. Przygotuj zadanie propel:import-danych ................................................... 221
Krok 8. Wypeánij bazĊ danych rekordami .............................................................. 223
Krok 9. Wygeneruj panele CRUD .......................................................................... 223
Krok 10. UsuĔ zbĊdne akcje moduáów film oraz aktor ............................................... 223
Krok 11. Zmodyfikuj funkcje executeShow() ........................................................ 224
Krok 12. Dostosuj widoki akcji film/index oraz aktor/index .................................. 224
Krok 13. Zmodyfikuj widok akcji film/show ......................................................... 224
Krok 14. Zmodyfikuj widok akcji aktor/show ........................................................ 224
Krok 15. ZmieĔ adresy URL .................................................................................. 225
Krok 16. Dostosuj wygląd witryny ......................................................................... 225
Krok 17. Ustal tytuáy stron ..................................................................................... 226
Rozdziaä 17. Widoki czöĈciowe ......................................................................... 227
Przykáad 17. Czcionki projektów CSS Zen Garden ...................................................... 228
ROZWIĄZANIE .......................................................................................................... 230
Krok 1. Przeanalizuj dane ...................................................................................... 230
Krok 2. Utwórz pustą bazĊ danych ......................................................................... 231
Krok 3. Zaprojektuj bazĊ danych ........................................................................... 231
Krok 4. Utwórz projekt z aplikacją frontend .......................................................... 232
Krok 5. Skonfiguruj dostĊp do bazy danych ........................................................... 232
Krok 6. Przygotuj zadanie propel:import-danych ................................................... 233
Krok 7. Wypeánij bazĊ danych rekordami .............................................................. 235
Krok 8. Dodaj metody zliczające powiązane rekordy ............................................ 235
10
Symfony w przykäadach
Krok 9. Przygotuj zadanie propel:przelicz ............................................................. 238
Krok 10. Przelicz rekordy ...................................................................................... 238
Krok 11. Wykonaj moduá glowny .......................................................................... 238
Krok 12. Dostosuj klasy wygenerowane przez Propel ........................................... 239
Krok 13. Dodaj metody uáatwiające dostĊp
do obiektów poáączonych relacją n:m ................................................................. 239
Krok 14. Wygeneruj panele CRUD ........................................................................ 240
Krok 15. UsuĔ zbĊdne akcje ................................................................................... 240
Krok 16. Zmodyfikuj funkcje executeShow() ........................................................ 240
Krok 17. Przygotuj widok czĊĞciowy projekt/lista ................................................. 240
Krok 18. Dostosuj widok akcji projekt/index ......................................................... 241
Krok 19. Dostosuj widok akcji czcionka/show ...................................................... 242
Krok 20. Przygotuj widok czĊĞciowy czcionka/lista .............................................. 244
Krok 21. Dostosuj widok akcji czcionka/index ...................................................... 245
Krok 22. Dostosuj widok akcji projekt/show ......................................................... 245
Krok 23. Dostosuj widok akcji moduáu rodzina ..................................................... 245
Krok 24. ZmieĔ adresy URL .................................................................................. 246
Krok 25. Dostosuj wygląd witryny ......................................................................... 247
Krok 26. Ustal tytuáy stron ..................................................................................... 247
Rozdziaä 18. Publikowanie aplikacji, która wykorzystuje bazö danych,
na serwerze hostingowym ............................................................. 249
Przykáad 18.1. NotH — edytor kodu XHTML/CSS ..................................................... 249
ROZWIĄZANIE .......................................................................................................... 250
Krok 1. Przeanalizuj dane ...................................................................................... 250
Krok 2. Utwórz pustą bazĊ danych ......................................................................... 252
Krok 3. Zaprojektuj bazĊ danych ........................................................................... 252
Krok 4. Utwórz projekt z aplikacją frontend .......................................................... 252
Krok 5. Skonfiguruj dostĊp do bazy danych ........................................................... 253
Krok 6. Dostosuj klasy wygenerowane przez Propel ............................................. 253
Krok 7. Przygotuj zadanie propel:import-danych ................................................... 253
Krok 8. Wypeánij bazĊ danych rekordami .............................................................. 256
Krok 9. Wykonaj moduá glowny ............................................................................ 256
Krok 10. Wygeneruj panele CRUD ........................................................................ 256
Krok 11. UsuĔ zbĊdne akcje ................................................................................... 257
Krok 12. Zmodyfikuj funkcje executeShow() ........................................................ 257
Krok 13. Dostosuj widok akcji menu/show ............................................................ 257
Krok 14. Dostosuj widok akcji img/show .............................................................. 257
Krok 15. Dostosuj widok akcji plik/show .............................................................. 258
Krok 16. Dostosuj akcje moduáu podrecznik .......................................................... 258
Krok 17. Dostosuj akcje moduáu skroty ................................................................. 258
Krok 18. Wykonaj komponent menu/menu ............................................................ 259
Krok 19. Wykonaj komponent menu/menupionowe .............................................. 260
Krok 20. Dostosuj wygląd witryny ......................................................................... 261
Krok 21. ZmieĔ adresy URL .................................................................................. 261
Krok 22. Ustal tytuáy stron ..................................................................................... 263
Przykáad 18.2. NotH — publikacja na serwerze ........................................................... 263
ROZWIĄZANIE .......................................................................................................... 264
Krok 1. Zrzut bazy danych ..................................................................................... 264
Krok 2. Utwórz pustą bazĊ danych na serwerze ..................................................... 264
Krok 3. Wykonaj import zawartoĞci bazy danych .................................................. 264
Krok 4. Przekopiuj na serwer bibliotekĊ Symfony 1.4 ........................................... 266
Krok 5. Utwórz folder przeznaczony na projekt ..................................................... 266
Krok 6. Zablokuj dostĊp do plików projektu .......................................................... 268
Spis treĈci
11
Krok 7. Przekopiuj projekt na serwer ..................................................................... 268
Krok 8. Przekieruj domenĊ na folder noth/web/ ..................................................... 268
Krok 9. Zmodyfikuj plik noth/web/.htaccess .......................................................... 268
Krok 10. Zmodyfikuj plik noth/config/databases.yml ............................................ 269
Krok 11. Zmodyfikuj ĞcieĪkĊ do biblioteki Symfony ............................................ 270
Rozdziaä 19. Czego dowiedziaäeĈ siö w drugiej czöĈci? ...................................... 271
CzöĈè III Panele administracyjne .............................................. 273
Rozdziaä 20. Täumaczenie interfejsu witryny ...................................................... 275
Przykáad 20. DzieĔ dobry ............................................................................................. 275
ROZWIĄZANIE .......................................................................................................... 276
Krok 1. Utwórz nowy projekt, aplikacjĊ i moduá ................................................... 276
Krok 2. Ustal adres strony gáównej ........................................................................ 276
Krok 3. Dostosuj akcjĊ glowny/index .................................................................... 276
Krok 4. Dostosuj widok akcji glowny/index .......................................................... 276
Krok 5. Ustal domyĞlny jĊzyk aplikacji ................................................................. 277
Krok 6. Zdefiniuj táumaczenia komunikatu Good morning .................................... 277
Krok 7. Ustal tytuá witryny oraz oznacz jĊzyk dokumentu XHTML ...................... 278
Krok 8. Przetestuj witrynĊ ...................................................................................... 279
Rozdziaä 21. Pierwszy panel administracyjny ..................................................... 283
Przykáad 21. Piosenki wojskowe (panel administracyjny) ............................................ 283
ROZWIĄZANIE .......................................................................................................... 284
Krok 1. Przeanalizuj przykáad 11. .......................................................................... 284
Krok 2. Uruchom przykáad 11. ............................................................................... 284
Krok 3. Utwórz aplikacjĊ backend i moduá piosenka ............................................. 284
Krok 4. Dostosuj wygląd aplikacji backend ........................................................... 285
Krok 5. Zabezpiecz dostĊp do aplikacji backend .................................................... 288
Krok 6. Zainstaluj wtyczkĊ sfGuardAuth ............................................................... 288
Krok 7. Utwórz konto admin .................................................................................. 288
Krok 8. Uruchom stronĊ logowania ....................................................................... 289
Krok 9. Logowanie do aplikacji backend z aplikacji frontend ............................... 290
Krok 10. Wylogowanie z aplikacji backend ........................................................... 290
Krok 11. Dostosuj formularz logowania ................................................................ 291
Krok 12. Dostosuj panel CRUD ............................................................................. 293
Krok 13. W aplikacji backend dodaj filtr „zapamiĊtaj mnie” ................................. 294
Rozdziaä 22. Kontekstowe hiperäñcza do edycji i usuwania rekordów ................. 295
Przykáad 22. Zbiór zadaĔ C++ ...................................................................................... 296
ROZWIĄZANIE .......................................................................................................... 296
Etap 1. Utwórz nowy projekt i wykonaj aplikacjĊ frontend ................................... 296
Etap 2. Wykonaj aplikacjĊ backend ....................................................................... 307
Etap 3. Poáącz aplikacje frontend i backend ........................................................... 310
Etap 4. KontekstowoĞü usuwania rekordów ........................................................... 313
Etap 5. Uáatwienia w wypeánianiu formularzy ....................................................... 313
Rozdziaä 23. Administracja kontami uĔytkowników ........................................... 317
Przykáad 23. AngaĪe ..................................................................................................... 318
ROZWIĄZANIE .......................................................................................................... 319
Etap 1. Wykonaj aplikacjĊ frontend ....................................................................... 319
Etap 2. Zabezpieczanie dostĊpu do aplikacji frontend ............................................ 336
Etap 3. Ustal poziomy dostĊpu do aplikacji: .......................................................... 339
12
Symfony w przykäadach
Rozdziaä 24. Generowanie paneli administracyjnych .......................................... 347
Przykáad 24. Turniej czterech skoczni .......................................................................... 347
ROZWIĄZANIE .......................................................................................................... 347
Etap 1. Utwórz nowy projekt i wykonaj aplikacjĊ frontend ................................... 347
Etap 2. Wykonaj aplikacjĊ backend ....................................................................... 352
Etap 3. Refaktoryzacja ........................................................................................... 356
Rozdziaä 25. Zabezpieczanie paneli administracyjnych
przy uĔyciu protokoäu HTTPS ......................................................... 361
Przykáad 25. Turniej Czterech Skoczni (HTTPS) ......................................................... 362
ROZWIĄZANIE .......................................................................................................... 362
Krok 1. Zrzut bazy danych ..................................................................................... 362
Krok 2. Utwórz pustą bazĊ danych na serwerze ..................................................... 362
Krok 3. Wykonaj import zawartoĞci bazy danych .................................................. 362
Krok 4. Przekopiuj na serwer bibliotekĊ Symfony 1.4 ........................................... 363
Krok 5. Utwórz folder przeznaczony na projekt ..................................................... 363
Krok 6. Zablokuj dostĊp do plików projektu .......................................................... 363
Krok 7. Przekopiuj projekt na serwer ..................................................................... 363
Krok 8. Przekieruj domeny .................................................................................... 364
Krok 9. Zmodyfikuj pliki.htaccess ......................................................................... 364
Krok 10. Zmodyfikuj plik tcs/config/databases.yml ............................................... 365
Krok 11. Zmodyfikuj ĞcieĪkĊ do biblioteki Symfony ............................................ 365
Rozdziaä 26. Czego dowiedziaäeĈ siö w trzeciej czöĈci? ..................................... 367
Literatura ..................................................................................... 369
Skorowidz .................................................................................... 371
Rozdziaä 22.
Kontekstowe hiperäñcza
do edycji i usuwania
rekordów
Projekt omawiany w tym rozdziale zademonstruje metodĊ poáączenia aplikacji frontend
oraz backend w taki sposób, by zalogowany administrator mógá przechodziü pomiĊdzy
trybami odczytu i edycji rekordu. W aplikacji frontend umieĞcimy hiperáącza przeno-
szące uĪytkownika do trybu edycji rekordów (czyli do aplikacji backend). W aplikacji
backend dodamy hiperáącza przenoszące do trybu odczytu (czyli do aplikacji frontend).
Te hiperáącza bĊdą dostĊpne tylko dla zalogowanego administratora; przedstawimy je
w postaci ikon. Takie rozwiązanie sprawi, Īe korzystanie z panelu administracyjnego
bĊdzie znacznie wygodniejsze.
Dodatkowymi uáatwieniami bĊdą: automatyczne podpowiadanie domyĞlnych wartoĞci
wybranych pól oraz kontekstowe dziaáanie usuwania rekordów.
W poniĪej omawianym przykáadzie wystąpią dwie tabele rozdzial oraz zadanie poáą-
czone relacją 1:n. Automatyczne podpowiadanie wartoĞci bĊdzie dotyczyáo tworzenia
nowych rekordów. W przypadku dodawania do bazy danych rekordu do tabeli rozdzial
automatycznie wypeánimy pole numer, nadając mu nastĊpną dostĊpną wartoĞü. Gdy
zostanie dodane nowe zadanie, generowanymi wartoĞciami bĊdą numer zadania oraz —
w niektórych sytuacjach — numer rozdziaáu. Ponadto zarówno w wypadku rozdziaáów,
jak i zadaĔ, automatycznie wygenerujemy wartoĞci kolumn slug.
KontekstowoĞü dziaáania przycisku do usuwania rekordów z tabeli zadanie bĊdzie pole-
gaáa na tym, Īe po usuniĊciu rekordu wyĞwietlimy stronĊ, na której naciĞniĊto przycisk
usuĔ. Przycisk do usuwania zadania znajdziemy na trzech róĪnych stronach. BĊdą to:
lista wszystkich zadaĔ (przycisk A),
lista zadaĔ z wybranego rozdziaáu (przycisk B),
szczegóáowe dane zadania (przycisk C).
296
CzöĈè III i Panele administracyjne
JeĞli naciĞniĊto przycisk A, to ma nastąpiü powrót do listy wszystkich zadaĔ. JeĞli naci-
ĞniĊto przycisk B lub C, to ma nastąpiü powrót do listy zadaĔ z wybranego rozdziaáu.
KontekstowoĞü usuwania zaimplementujemy, zapisując odwiedzane adresy URL
w sesji uĪytkownika oraz wykorzystując funkcjĊ redirect(), która wykonuje przekie-
rowania HTTP.
Przykäad 22. Zbiór zadaþ C++
Wykonaj aplikacjĊ internetową prezentującą w postaci witryny WWW zbiór zadaĔ
z programowania w jĊzyku C++. Zbiór zadaĔ jest podzielony na rozdziaáy. KaĪdy
z rozdziaáów moĪe zawieraü dowolną liczbĊ zadaĔ. Projekt powinien skáadaü siĊ z dwóch
aplikacji: frontend oraz backend. Aplikacja frontend ma udostĊpniaü caáą treĞü zbioru
zadaĔ w trybie do odczytu wszystkim odwiedzającym. Aplikacja backend ma umoĪliwiaü
edycjĊ caáego zbioru zadaĔ. DostĊp do aplikacji backend zabezpiecz wtyczką sfGuardAuth.
Aplikacje frontend oraz backend wzbogaü o ikony uáatwiające przechodzenie pomiĊdzy
trybami edycji i odczytu wszystkich rekordów. W caáym projekcie przy kaĪdym wyĞwie-
tlanym rekordzie — zarówno w akcji index, jak i show — umieĞü:
w aplikacji frontend ikonĊ przechodzącą do edycji rekordu,
w aplikacji backend ikony: edycja, odczyt, usuwanie.
OperacjĊ usuwania zaimplementuj w taki sposób, by po usuniĊciu rekordu nastĊpowaá
powrót do strony, na której naciĞniĊto przycisk usuĔ. Ikony mają byü widoczne tylko
po zalogowaniu na konto administracyjne.
ROZWIðZANIE
Etap 1. Utwórz nowy projekt
i wykonaj aplikacjö frontend
Krok 1. Utwórz pustñ bazö danych
Przygotuj skrypty tworzenie-pustej-bazy-danych.sql i tworzenie-pustej-bazy-danych.bat,
które utworzą pustą bazĊ danych cpp oraz konto redaktor. PoprawnoĞü tworzenia bazy
sprawdĨ przy uĪyciu programu phpMyAdmin.
Krok 2. Zaprojektuj bazö danych
Zaprojektuj przedstawioną na rysunku 22.1 bazĊ danych cpp. Ta baza ma zawieraü tabele
rozdzial oraz zadanie poáączone relacją 1:n.
Rozdziaä 22. i Kontekstowe hiperäñcza do edycji i usuwania rekordów
297
Rysunek 22.1.
Baza danych cpp
Krok 3. Utwórz projekt z aplikacjñ frontend
W folderze cpp/ utwórz nowy projekt zawierający aplikacjĊ frontend:
symfony generate:project cpp --orm=Propel
symfony generate:app frontend
Krok 4. Skonfiguruj dostöp do bazy danych
Wydaj polecenie:
symfony configure:database mysql:host=localhost;dbname=cpp redaktor tajnehaslo
po czym w pliku config/schema.yml umieĞü strukturĊ bazy danych z rysunku 22.1.
WáaĞciwoĞü primaryString dodaj:
w tabeli rozdzial dla kolumny tytul,
w tabeli zadanie dla kolumny slug.
NastĊpnie przy uĪyciu polecenia:
symfony propel:build --all --no-confirmation
wygeneruj klasy dostĊpu i utwórz tabele w bazie danych. Po wydaniu tego polecenia
za pomocą programu phpMyAdmin sprawdĨ, czy na serwerze MySQL w bazie danych
cpp pojawiáy siĊ dwie tabele.
Krok 5. Rozszerz wygenerowane klasy dostöpu do bazy danych
W klasach wygenerowanych przez Propel dodaj nastĊpujące metody:
w klasie Rozdzial metody setSlug(), getMaxNumerZadania(),
w klasie RozdzialPeer metody retrieveBySlug(), retrieveByNumer(),
pierwszyRozdzial(), insert(), getMaxNumerRozdzialu(),
298
CzöĈè III i Panele administracyjne
w klasie Zadanie metodĊ setSlug(),
w klasie ZadaniePeer metody retrieveBySlug(), insert(), doSelect().
Metody retrieveBySlug(), insert(), doSelect() przygotuj tak, jak to wielokrotnie
omawialiĞmy w poprzedniej czĊĞci. Metoda retrieveByNumer() klasy RozdzialPeer jest
bardzo zbliĪona do metody retrieveBySlug(): róĪni siĊ tylko tym, Īe wyszukiwanie
rekordu przeprowadzamy na podstawie kolumny numer, a nie slug.
Metoda setSlug() w klasach Rozdzial oraz Zadanie ma automatycznie ustalaü wartoĞü
kolumny slug. Metody getMaxNumerZadania() oraz getMaxNumerRozdzialu() bĊdą sáu-
Īyáy do automatycznego wypeániania pól numer rozdziaáu i numer zadania przy two-
rzeniu nowych rekordów. Metoda getMaxNumerZadania() zwraca najwiĊkszy z numerów
zadaĔ wybranego rozdziaáu, a metoda getMaxNumerRozdzialu() zwraca najwiĊkszy
numer rozdziaáu zawarty w bazie danych. Ostatnia z nowych metod, metoda pierwszy
´Rozdzial(), zwraca pierwszy rekord z tabeli rozdzial. Wykorzystamy ją w akcji
rozdzial/show do przechodzenia na pierwszą stronĊ zbioru zadaĔ.
Metoda setSlug() klasy Rozdzial jest przedstawiona na listingu 22.1.
Listing 22.1. Metoda setSlug() klasy Rozdzial
public function setSlug($slug) {
$slug = trim($slug);
if ($slug == ) {
$slug = myString::string2slug($this- getTytul());
} else {
$slug = myString::string2slug($slug);
}
$next_slug = $slug;
$c = new Criteria();
$c- add(RozdzialPeer::SLUG, $next_slug);
$c- add(RozdzialPeer::ROZDZIAL_ID, $this- getRozdzialId(),
´Criteria::NOT_EQUAL);
$ile = RozdzialPeer::doCount($c);
$unikatowy = ($ile == 0);
$min = 2;
$max = 1000;
while (!$unikatowy) {
$next_slug = $slug . __ . $min;
$min++;
if ($min $max + 1) {
die( ****** ERROR RozdzialPeer::setSlug({$next_slug}) );
};
$c- clear();
$c- add(RozdzialPeer::SLUG, $next_slug);
Rozdziaä 22. i Kontekstowe hiperäñcza do edycji i usuwania rekordów
299
$c- add(RozdzialPeer::ROZDZIAL_ID, $this- getRozdzialId(),
´Criteria::NOT_EQUAL);
$ile = RozdzialPeer::doCount($c);
$unikatowy = ($ile == 0);
}
parent::setSlug($next_slug);
}
Jest to metoda wirtualna, nadpisująca metodĊ setSlug() wygenerowaną przez Propel.
Najpierw przy uĪyciu funkcji trim() usuwamy zbĊdne biaáe znaki, po czym spraw-
dzamy, czy otrzymany parametr jest pusty. JeĞli tak, to w zmiennej $slug umieszczamy
tytuá rozdziaáu przeksztaácony przy uĪyciu funkcji string2slug(). DziĊki takiej pro-
cedurze bĊdziemy mieli peány wpáyw na kolumnĊ slug, a jednoczeĞnie bĊdziemy mogli
korzystaü z automatycznego generatora. JeĞli w wypeánionym formularzu pozostawimy
puste pole slug, wówczas wartoĞü dla tej kolumny zostanie automatycznie wygenero-
wana na podstawie tytuáu rozdziaáu. JeĞli zechcemy nadaü konkretną wartoĞü kolumnie
slug, naleĪy ją wprowadziü w formularzu. Spowoduje to wyáączenie automatycznego
generowania wartoĞci kolumny slug.
Gdy wartoĞü slug zostaáa wstĊpnie ustalona, sprawdzamy, czy nie wystĊpuje ona w bazie
danych. OperacjĊ taką powtarzamy w pĊtli aĪ do znalezienia wartoĞci, która nie wystą-
piáa w bazie danych. W kolejnych obrotach pĊtli na koĔcu zmiennej $slug doáączamy
kolejne liczby caákowite:
lorem_ipsum
lorem_ipsum2
lorem_ipsum3
lorem_ipsum4
...
i badamy, czy otrzymany napis nie wystĊpuje w kolumnie slug tabeli rozdzial. IteracjĊ
koĔczymy, gdy znajdziemy wartoĞü unikalną lub gdy pĊtla sprawdzająca unikalnoĞü
obróci siĊ zbyt wiele razy (np. wiĊcej niĪ 1000).
Znaleziona unikalna wartoĞü slug jest przekazywana jako parametr do metody setSlug()
w klasie bazowej.
Metoda setSlug() klasy Zadanie jest niemal identyczna.
Metoda getMaxNumerZadania() klasy Rozdzial jest przedstawiona na listingu 22.2.
Listing 22.2. Metoda getMaxNumerZadania() klasy Rozdzial
public function getMaxNumerZadania() {
$c = new Criteria();
$c- addDescendingOrderByColumn(ZadaniePeer::NUMER);
$c- add(ZadaniePeer::ROZDZIAL_ID, $this- getRozdzialId());
$c- setLimit(1);
$Zadanie = ZadaniePeer::doSelectOne($c);
if ($Zadanie) {
return $Zadanie- getNumer();
} else {
300
CzöĈè III i Panele administracyjne
return 0;
}
}
Zadaniem tej metody jest znalezienie najwiĊkszego numeru zadania w bieĪącym roz-
dziale. Tworzymy kryteria, które zwrócą listĊ zadaĔ z wybranego rozdziaáu. Zwracane
wyniki sortujemy malejąco wzglĊdem kolumny numer i ograniczamy do jednego rekordu.
Wynikiem funkcji jest 0 lub wartoĞü kolumny numer otrzymanego rekordu. Statyczna
metoda RozdzialPeer::getMaxNumerRozdzialu() jest bardzo podobna.
Krok 6. Przygotuj zadanie propel:import-danych
Skopiuj:
folder z folderu 22-start/dane-zbior-zadan/ do folderu cpp/data/,
pliki z folderu 22-start/lib/ do folderu cpp/lib/.
NastĊpnie utwórz zadanie propel:import-danych:
symfony generate:task propel:import-danych
W pliku lib/task/propelImportdanychTask.class.php wprowadĨ kod, który na podsta-
wie plików z folderu dane-zbior-zadan/ wypeáni bazĊ danych. Zarys kodu zadania
propel:import-danych jest przedstawiony na listingu 22.3. W tym skrypcie przetwarzamy
najpierw plik rozdzialy.txt, a nastĊpnie wszystkie pliki wyszukane przy wykorzystaniu
funkcji glob() w podfolderze txt/. Rozwiązania niektórych zadaĔ są zawarte w folderze
dane-zbior-zadan/cpp. DostĊpnoĞü rozwiązania sprawdzamy przy uĪyciu funkcji file_
´exists(). JeĞli rozwiązanie jest dostĊpne, to plik z rozwiązaniem odczytujemy do
zmiennej $dane[ odpowiedz ], pamiĊtając o tym, Īe kod C++ moĪe zawieraü znaki ,
oraz . Dlatego wartoĞü zwrócona przez funkcjĊ file_get_contents() jest prze-
ksztaácona przy uĪyciu funkcji htmlspecialchars().
Listing 22.3. Fragment pliku propelImportdanychTask.class.php
//rozdzialy
$tmp_rozdzialy = string2HArray(file_get_contents( data/dane-zbior-zadan/
´rozdzialy.txt ));
foreach ($tmp_rozdzialy[ items ] as $tmp_rozdzial) {
$dane = array(
tytul = $tmp_rozdzial[0],
slug = string2slug($tmp_rozdzial[0]),
numer = $tmp_rozdzial[1],
);
RozdzialPeer::insert($dane);
}
//zadania
$plks = glob( data/dane-zbior-zadan/txt/*.txt );
foreach ($plks as $plk) {
preg_match( /^(\d+)-(\d+)\.txt$/ , basename($plk), $m);
Rozdziaä 22. i Kontekstowe hiperäñcza do edycji i usuwania rekordów
301
$nr_rozdzialu = $m[1];
$nr_zadania = $m[2];
$rozdzial = RozdzialPeer::retrieveByNumer($nr_rozdzialu);
if (!$rozdzial) {
die( blad ###1 );
}
$slug =
uzupelnij_int_zerami($nr_rozdzialu, 2) . - .
uzupelnij_int_zerami($nr_zadania, 2);
$dane = array(
numer = $nr_zadania,
slug = $slug,
tresc = file_get_contents($plk),
rozdzial_id = $rozdzial- getRozdzialId()
);
$np_cpp = str_replace( txt , cpp , $plk);
if (file_exists($np_cpp)) {
$dane[ odpowiedz ] = htmlspecialchars(file_get_contents($np_cpp));
}
ZadaniePeer::insert($dane);
}
Krok 7. Wypeänij bazö danych rekordami
Wydaj komendĊ:
symfony propel:import-danych
W bazie danych cpp pojawi siĊ 298 rekordów. SprawdĨ to za pomocą programu
phpMyAdmin.
Krok 8. Wykonaj moduä rozdzial
Wygeneruj moduá CRUD dla tabeli rozdzial:
symfony propel:generate-module --with-show frontend rozdzial Rozdzial
W tym module usuĔ wszystkie akcje oprócz akcji show. Dodaj dwie nowe akcje: blad404
oraz rozwiazanie.
W metodzie executeShow() wykorzystaj metodĊ pierwszyRozdzial(). JeĞli parametr
slug jest zdefiniowany, to akcja show ma przekazywaü do widoku wybrany rekord.
W przeciwnym razie przekaĪ do widoku pierwszy rozdziaá. Kod metody execute
´Show() jest przedstawiony na listingu 22.4.
302
CzöĈè III i Panele administracyjne
Listing 22.4. Metoda akcji rozdzial/show
public function executeShow(sfWebRequest $request)
{
if ($request- getParameter( slug )) {
$this- Rozdzial
´= RozdzialPeer::retrieveBySlug($request- getParameter( slug ));
} else {
$this- Rozdzial = RozdzialPeer::pierwszyRozdzial();
}
$this- forward404Unless($this- Rozdzial);
}
Metoda executeRozwiazanie() bĊdzie wykorzystana do wykonania hiperáączy, pozwa-
lających na pobieranie rozwiązaĔ zadaĔ w postaci plików o rozszerzeniu .cpp. W treĞci
metody mamy przekazaü do widoku obiekt klasy Zadanie, którego identyfikator slug
jest zawarty w zapytaniu HTTP. Obiekt Zadanie przekazujemy do widoku wyáącznie
wtedy, gdy ma on niepuste rozwiązanie. Trzy warunki:
istnienie parametru slug,
istnienie zadania o podanej wartoĞci parametru slug,
oraz to, czy zadanie ma niepuste rozwiązanie,
áączymy spójnikami i przekazujemy do metody forward404Unless(). JeĞli który-
kolwiek warunek nie jest speániony, to sterowanie zostanie przekazane do obsáugi báĊdu
404. Drugi z warunków zawiera instrukcjĊ przypisania, która spowoduje przekazanie
do widoku zmiennej $Zadanie. TreĞü metody executeRozwiæzanie() jest przedstawiona
na listingu 22.5.
Listing 22.5. Metoda akcji rozdzial/rozwiazanie
public function executeRozwiazanie(sfWebRequest $request)
{
$this- forward404Unless(
$request- getParameter( slug )
($this- Zadanie
´= ZadaniePeer::retrieveBySlug($request- getParameter( slug )))
$this- Zadanie- getOdpowiedz()
);
}
Krok 9. Przygotuj widoki akcji rozdzial/show, rozdzial/rozwiñzanie
oraz rozdzial/blad404
Na stronie akcji rozdzial/show drukujemy tytuá rozdziaáu oraz kompletną listĊ wszyst-
kich zadaĔ z rozdziaáu. Tytuá rozdziaáu jest zwracany przez funkcjĊ __toStrung(),
wiĊc wydruk tytuáu przyjmuje postaü:
?php echo $Rozdzial ?
Rozdziaä 22. i Kontekstowe hiperäñcza do edycji i usuwania rekordów
303
Natomiast zadania z rozdziaáu są zwracane jako wynik metody getRozdzials(). Otrzy-
maną tablicĊ obiektów klasy Zadanie przetwarzamy iteracyjnie. Dla kaĪdego zadania
drukujemy nagáówek h3 zawierający tytuá:
h3 id= zad ?php echo $Zadanie- getSlug() ?
Zadanie ?php echo $Rozdzial- getNumer() ? . ?php echo $Zadanie- getNumer() ?
/h3
ZauwaĪ, Īe ten element jest wzbogacony o identyfikator id. DziĊki temu w panelu
administracyjnym bĊdziemy mogli korzystaü z hiperáączy postaci:
/rozdzial/wprowadzenie.html#zad01-04
Po numerze zadania drukujemy jego treĞü oraz sprawdzamy, czy rozwiązanie jest
dostĊpne. JeĞli tak, to umieszczamy je poniĪej treĞci zadania. Obok napisu rozwiązanie
drukujemy hiperáącze do akcji rozdzial/rozwiazanie, które pozwoli na pobranie roz-
wiązania w postaci pliku .cpp. TreĞü rozwiązania umieszczamy w elemencie pre wzbo-
gaconym o atrybut class= syntax-highlight:cpp . W ten sposób osiągniemy kolo-
rowanie skáadni kodu C++. TreĞü widoku showSuccess.php jest przedstawiona na
listingu 22.6.
Listing 22.6. Widok akcji rozdzial/show
h1 Rozdziađ ?php echo $Rozdzial- getNumer() ? . ?php echo $Rozdzial ? /h1
?php foreach ($Rozdzial- getZadanies() as $Zadanie): ?
div class= zadanie
h3 id= zad ?php echo $Zadanie- getSlug() ?
Zadanie ?php echo $Rozdzial- getNumer() ? . ?php echo $Zadanie- getNumer() ?
/h3
?php echo $Zadanie- getTresc() ?
?php if ($Zadanie- getOdpowiedz()): ?
div class= rozwiazanie
h4
Rozwiæzanie:
a href= ?php echo url_for( rozdzial/rozwiazanie?slug= .
´$Zadanie- getSlug()) ?
?php echo $Zadanie- getSlug() ? .cpp
/a
/h4
pre class= syntax-highlight:cpp ?php echo $Zadanie- getOdpowiedz()
´? /pre
/div
?php endif; ?
/div
?php endforeach; ?
W akcji rozdzial/rozwiazanie mamy za zadanie wydrukowaü wyáącznie treĞü rozwią-
zania zadania. Widok rozwiązanieSuccess.php jest przedstawiony na listingu 22.7. Roz-
wiązania nie naleĪy dekorowaü plikiem layout.php. Zatem w pliku konfiguracyjnym
widoków moduáu, czyli apps/frontend/modules/rozdzial/config/view.yml, naleĪy umie-
Ğciü reguáy, które dla widoku rozwiazanieSuccess wyáączą dekoracjĊ i ustalą nagáówek
text/plain:
304
CzöĈè III i Panele administracyjne
rozwiazanieSuccess:
http_metas:
content-type: text/plain
has_layout: false
Listing 22.7. Widok akcji rozdzial/rozwiazanie
?php echo html_entity_decode($Zadanie- getOdpowiedz());
PoniewaĪ w listingu 22.6 wykorzystujemy zmienną $Zadanie, a nie jej surową postaü1,
wiĊc w pliku konfiguracyjnym settings.yml aplikacji frontend naleĪy wyáączyü zabez-
pieczanie zmiennych:
all:
.settings:
escaping_method: ESC_RAW
W widoku akcji rozdzial/blad404 umieĞü komunikat o báĊdnym adresie URL.
Krok 10. Przygotuj komponent rozdzial/menu
Menu witryny ma zawieraü listĊ wszystkich rozdziaáów. Wykonamy je w postaci
komponentu o nazwie rozdzial/menu. Utwórz plik rozdzial/actions/components.class.php
i zdefiniuj w nim przedstawioną na listingu 22.8 klasĊ rozdzialComponents. Metoda
executeMenu() ma przekazywaü do widoku listĊ wszystkich rekordów z tabeli rozdzial.
Listing 22.8. Klasa rozdzialComponents
class rozdzialComponents extends sfComponents
{
public function executeMenu(sfWebRequest $request)
{
$this- Rozdzials = RozdzialPeer::doSelect(new Criteria());
}
}
W widoku rozdzial/templates/_menu.php umieĞü kod z listingu 22.9. Tablica $Rozdzials
jest przeksztaácona w listĊ ol zawierającą hiperáącza do akcji show prezentujących
szczegóáowe informacje poszczególnych rozdziaáów.
Listing 22.9. Widok komponentu rozdzial/menu
ol id= menu
?php foreach ($Rozdzials as $Rozdzial): ?
li
a href= ?php echo url_for( rozdzial/show?slug= .$Rozdzial- getSlug()) ?
?php echo $Rozdzial- getNumer() ? .
?php echo $Rozdzial ?
span raquo; /span
/a
1 Surowa postaü zmiennej $Zadanie jest dostĊpna jako $sf_data- getRaw( Zadanie ).
Rozdziaä 22. i Kontekstowe hiperäñcza do edycji i usuwania rekordów
305
/li
?php endforeach; ?
/ol
Krok 11. Zmodyfikuj skórkö witryny
UĪyj szablonu zawartego w folderze 22-start/xhtml-css-template/. PamiĊtaj o modyfi-
kacjach w pliku frontend/config/view.yml. Ustal pliki stylów oraz doáącz skrypty JS kolo-
rujące kod:
stylesheets: [style.css,SyntaxHighlighter.css]
javascripts: [shCore.js,shBrushCpp.js]
PamiĊtaj o skopiowaniu plików do folderów /web/css/, /web/images/ oraz /web/js/.
Menu gáówne wstaw do pliku layout.php, wywoáując funkcjĊ include_component().
Na dole pliku layout.php, przed zamykającym znacznikiem /body , wstaw skrypt, który
bĊdzie kolorowaá kod zawarty w elementach pre klasy syntax-highlight:cpp:
...
script type= text/javascript
dp.SyntaxHighlighter.ClipboardSwf =
?php echo public_path( js/clipboard.swf ) ? ;
dp.SyntaxHighlighter.HighlightAll( code );
/script
/body
Krok 12. Ustal tytuäy stron
W pliku layout.php umieĞü slot o nazwie tytul. Wypeánij ten slot danymi w widokach
akcji rozdzial/show oraz rozdzial/blad404. PomiĊdzy znacznikami title i /title
umieĞü komunikat o báĊdzie oraz tytuá rozdziaáu.
Krok 13. Ustal obsäugö bäödu 404
W pliku frontend/config/settings.yml wprowadĨ reguáy definiujące obsáugĊ báĊdu 404:
error_404_module: rozdzial
error_404_action: blad404
Krok 14. Ustal przyjazne adresy URL
W pliku frontend/config/routing.yml wprowadĨ reguáy przedstawione na listingu 22.10.
Reguáa o etykiecie rozwiazanie ustala, Īe adres postaci:
/cpp/01-04.cpp
bĊdzie powodowaá pobranie rozwiązania zadania o numerze 1.4. W ten sposób
emulujemy, Īe w folderze web/ znajduje siĊ folder cpp/, który zawiera statyczne pliki o
rozszerzeniu .cpp. W rzeczywistoĞci rozwiązania zadaĔ są pobierane z kolumny odpo-
wiedz tabeli zadanie. Realizuje to akcja rozdzial/rozwiazanie.
306
CzöĈè III i Panele administracyjne
Listing 22.10. Reguáy translacji adresów w aplikacji frontend
rozwiazanie:
url: /cpp/:slug.cpp
param: { module: rozdzial, action: rozwiazanie }
rozdzial_show:
url: /rozdzial/:slug.html
param: { module: rozdzial, action: show }
index:
url: /index.html
param: { module: rozdzial, action: show }
homepage:
url: /
param: { module: rozdzial, action: show }
Krok 15. Przetestuj aplikacjö frontend
Przetestuj przy uĪyciu przeglądarki aplikacjĊ frontend. PowinieneĞ otrzymaü witrynĊ
widoczną na rysunku 22.2. SprawdĨ dziaáanie hiperáączy zawartych w menu gáównym
oraz pozwalających na pobieranie plików .cpp.
Rysunek 22.2. Aplikacja frontend zbioru zadaĔ C++
Rozdziaä 22. i Kontekstowe hiperäñcza do edycji i usuwania rekordów
307
Etap 2. Wykonaj aplikacjö backend
Krok 1. Utwórz aplikacjö backend
W folderze cpp/ wydaj kolejno polecenia:
symfony generate:app backend
symfony plugin:install sfGuardPlugin
symfony propel:build --all --no-confirmation
symfony propel:import-danych
symfony propel:generate-module backend rozdzial Rozdzial
symfony propel:generate-module backend zadanie Zadanie
symfony guard:create-user admin supertajnehaslo
Po wygenerowaniu moduáów rozdzial oraz zadanie zmodyfikuj komunikaty zawarte
we wszystkich widokach. W miejsce angielskich terminów, np. New Zadanie czy Edit
Rozdzial, wpisz polskie táumaczenia.
Na stronie ze szczegóáowymi danymi rozdziaáu wyĞwietl listĊ wszystkich zadaĔ z danego
rozdziaáu. Wykonaj to, przygotowu
Pobierz darmowy fragment (pdf)