Symfony w przykladach symfpr


Symfony w przykładach
Idz do
Autor: WÅ‚odzimierz Gajda
" Spis treści
ISBN: 978-83-246-2788-2
" Przykładowy rozdział
Format: 158×235, stron: 384
Katalog książek
" Katalog online
" Zamów drukowany
katalog
Naucz się korzystać z pełni możliwości biblioteki MVC!
Twój koszyk " 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?
" Dodaj do koszyka
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.
Cennik i informacje
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
" Zamów informacje
XSS. Ten framework nie ogranicza się do wykorzystania własnej biblioteki, lecz zapewnia także
o nowościach
możliwość integracji z innymi. Jeśli chcesz nauczyć się, jak to działa w praktyce, trzymasz w rękach
" Zamów cennik
właściwą pozycję!
Książka  Symfony w przykładach jest możliwie najbardziej skondensowaną instrukcją obsługi
Czytelnia
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
" Fragmenty książek
projektu z bazą danych, publikacji projektu na serwerze hostingowym, aż po tworzenie różnego
online
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
Kontakt
" Panele administracyjne i tłumaczenie interfejsu witryny
" Zbiór zadań C++
Helion SA
" Administracja kontami użytkowników i generowanie paneli administracyjnych
ul. Kościuszki 1c
" Zabezpieczanie paneli administracyjnych protokołem HTTPS
44-100 Gliwice
tel. 32 230 98 63
I Ty możesz ułatwić sobie tworzenie doskonałych aplikacji internetowych!
e-mail: helion@helion.pl
© Helion 1991 2011
Spis tre ci 5
Spis tre ci
Podzi kowania ............................................................................... 13
Wst p ............................................................................................ 15
Cz I Tworzenie stron WWW w Symfony ................................ 17
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 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. 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 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. 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 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. 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 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 :

Rozdzia 22. 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 :


Zadanie getNumer() ?>.getNumer() ?>


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

Rozdzia getNumer() ?>.


getZadanies() as $Zadanie): ?>


Zadanie getNumer() ?>.getNumer() ?>


getTresc() ?>
getOdpowiedz()): ?>


Rozwi zanie:

getSlug() ?>.cpp


getOdpowiedz()
?>





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 Panele administracyjne
rozwiazanieSuccess:
http_metas:
content-type: text/plain
has_layout: false
Listing 22.7. Widok akcji rozdzial/rozwiazanie
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

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 , wstaw skrypt, który
b dzie kolorowa kod zawarty w elementach pre klasy syntax-highlight:cpp:
...


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 i
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 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. 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, przygotowuj c widok cz ciowy zadanie/_lista.php. Ten widok
wykorzystaj na stronach: zadanie/index oraz rozdzial/show.
Krok 2. Zablokuj dost p do aplikacji backend
W pliku backend/config/security.yml wprowad regu :
default:
is_secure: true
Nast pnie wy cz cytowanie zmiennych, w cz modu sfGuardAuth, ustal akcje odpo-
wiedzialne za logowanie i zmie domy lny j zyk aplikacji:
//plik backend/config/settings.yml
all:
.settings:
escaping_method: ESC_RAW
enabled_modules: [sfGuardAuth]
login_module: sfGuardAuth
login_action: signin
secure_module: sfGuardAuth
secure_action: secure
i18n: on
default_culture: pl_PL
W folderze backend/i18n/ umie plik messages.pl.xml, który przygotowa e , wyko-
nuj c przyk ad z rozdzia u 21. Popraw formularz do logowania zawarty w pliku
cpp\sfGuardPlugin\modules\sfGuardAuth\templates\signinSuccess.php.
Wykonaj zmiany opisane w poprzednim przyk adzie lub u yj pliku z przyk adu 21.
Zalet korzystania z rozszerze i18n jest to, e t umaczenie wykonujemy jeden raz.
W kolejnych projektach b dziemy wykorzystywali ten sam plik messages.pl.xml,
który przygotowali my, wykonuj c projekt z rozdzia u 21.
308 Cz III Panele administracyjne
Ustal adres, na który b dziemy przekierowywani po wylogowaniu z aplikacji backend:
//plik backend/config/app.yml
all:
sf_guard_plugin_success_signout_url: /cpp/web/
Zdefiniuj filtr, który pozwoli na zapami tanie zalogowanej sesji:
//plik backend/config/filters.yml
remember_me:
class: sfGuardRememberMeFilter
oraz ustal adres strony g ównej:
//plik backend/config/routing.yml
homepage:
url: /
param: { module: rozdzial, action: index }
Zabezpieczanie aplikacji zako cz, modyfikuj c klas bazow klasy myUser zawartej
w pliku backend/lib/myUser.class.php:
class myUser extends sfGuardSecurityUser
{
}
Po tej zmianie odwied adres, u ywaj c przegl darki:
http://localhost/cpp/web/backend.php/
Powiniene ujrze panel do logowania. Po zalogowaniu na konto admin uzyskasz dost p
do domy lnego panelu CRUD tabeli rozdzial.
Krok 3. Zmodyfikuj skórk witryny
U yj szablonu layout.php z aplikacji frontend. Menu g ówne wykonaj tym razem jako
zaszyty na sta e w pliku layout.php kod przedstawiony na listingu 22.11.
Listing 22.11. Menu g ówne aplikacji backend

Pierwsza z opcji menu ma powodowa przej cie do aplikacji frontend. Druga opcja
s u y do wylogowania. Opcje Rozdzia y oraz Zadania przechodz do paneli CRUD dla
tabel rozdzial i zadanie. Ostatnia z opcji automatycznie numeruje rozdzia y i zadania
Rozdzia 22. Kontekstowe hiper cza do edycji i usuwania rekordów 309
zawarte w zbiorze. Funkcja pomocnicza public_path() wygeneruje cie k prowadz c
do folderu web/. Pozosta e opcje menu s dost pne tylko wtedy, gdy u ytkownik jest
zalogowany.
Zmodyfikuj plik view.yml konfiguruj cy widoki aplikacji backend. Ustal w nim tytu y
wszystkich stron Edycja zbioru zada oraz zmie nazw pliku CSS na style.css.
Krok 4. Zmodyfikuj w a ciwo ci prezentacyjne formularzy
Zmie wygl d formularzy edycyjnych dla tabel rozdzial oraz zadanie. W plikach
lib/form/RozdziaForm.class.php oraz lib/form/ZadanieForm.class.php wprowad kod
przedstawiony na listingach 22.12 oraz 22.13. Metoda setLabels() ustala etykiety
poszczególnych pól formularza, a metoda setAttributes() zmienia rozmiary kontrolek
edycyjnych.
Listing 22.12. Dostosowanie formularza edycyjnego rekordów z tabeli rozdzial
class RozdzialForm extends BaseRozdzialForm {
public function configure() {
$this->widgetSchema->setLabels(array(
'tytul' => 'Tytu '
));
$this->widgetSchema['tytul']->setAttributes(array('size' => 80));
$this->widgetSchema['slug']->setAttributes(array('size' => 80));
$this->widgetSchema['numer']->setAttributes(array('size' => 80));
}
}
Listing 22.13. Dostosowanie formularza edycyjnego rekordów z tabeli zadanie
class ZadanieForm extends BaseZadanieForm {
public function configure() {
$this->widgetSchema->setLabels(array(
'tresc' => 'Tre ',
'odpowiedz' => 'Odpowied ',
'rozdzial_id' => 'Rozdzia '
));
$this->widgetSchema['numer']->setAttributes(array('size' => 80));
$this->widgetSchema['slug']->setAttributes(array('size' => 80));
$this->widgetSchema['odpowiedz']->setAttributes(array('rows' => 12,
'cols' => 60));
$this->widgetSchema['tresc']->setAttributes(array('rows' => 12,
'cols' => 60));
}
}
Krok 5. Przetestuj aplikacj backend
Wyczy pami podr czn i odwied aplikacj backend. Po zalogowaniu powiniene
uzyska dost p do cz ciowo zmodyfikowanego panelu administracyjnego. Pozwoli Ci
on na dodawanie, usuwanie i uaktualnianie rekordów.
310 Cz III Panele administracyjne
Etap 3. Po cz aplikacje frontend i backend
Krok 1. Zmodyfikuj menu g ówne aplikacji frontend
W menu g ównym aplikacji frontend dodaj opcje umo liwiaj ce zalogowanie. Przed
p tl foreach z listingu 22.9 dodaj instrukcje if widoczne na listingu 22.14.
Listing 22.14. Zmodyfikowany widok _menu.php z aplikacji frontend

Menu g ówne aplikacji backend, które jest przedstawione na listingu 22.11, zawiera ju
opcj Czytaj, która powoduje przej cie do aplikacji frontend. Pierwszy etap czenia
aplikacji frontend i backend jest zako czony. Przej cie od jednej aplikacji do drugiej
wykonasz za po rednictwem opcji Edytuj i Czytaj.
Bez wzgl du na to, czy odwiedzasz aplikacj frontend czy backend, metoda isAu
thenticated() b dzie zwraca a poprawn informacj o tym, czy jeste zalogowany.
Krok 2. W aplikacji backend dodaj ikony edit, view, delete
W folderze /web/images/ umie ikony edit.png, tick.png oraz delete.png. Ikony te znaj-
dziesz w folderze2 22-start/ikony/. Nast pnie zmodyfikuj widok akcji rozdzial/index
w aplikacji backend. Ten widok jest przedstawiony na listingu 22.15.
Listing 22.15. Widok akcji rozdzial/index w aplikacji backend

Lista wszystkich rozdzia ów



Utwórz nowy rozdzia
2
Te ikony s zawarte w pakiecie Symfony. Znajdziesz je w folderze C:\php\data\symfony\web\sf\sf_
admin\images.
Rozdzia 22. Kontekstowe hiper cza do edycji i usuwania rekordów 311



















Numer Tytul Edytuj / Czytaj / Usu
getNumer() ?>.
'')),
'rozdzial/edit?rozdzial_id='.$Rozdzial->getRozdzialId()) ?>
'')),
public_path('rozdzial/' . $Rozdzial->getSlug() . '.html')) ?>
'')),
'rozdzial/delete?rozdzial_id='.$Rozdzial->getRozdzialId(),
array('method' => 'delete', 'confirm' => 'Czy na pewno usun rozdzia ?
Wszystkie zadania z rozdzia u zostan usuni te!')) ?>

Ikona u atwiaj ca edycj rekordu jest drukowana przy u yciu instrukcji:
'')),
'rozdzial/edit?rozdzial_id='.$Rozdzial->getRozdzialId()) ?>
Przej cie do aplikacji frontend realizuje druga ikona drukowana za pomoc instrukcji:
'')),
public_path('rozdzial/' . $Rozdzial->getSlug() . '.html')) ?>
Instrukcja ta zak ada, e adres strony z rozdzia em w aplikacji frontend ma posta :
/rozdzial/slug-tytulu-rozdzialu.html
Trzecia z ikon, ikona do usuwania rekordu, wskazuje adres w aplikacji backend, zatem
korzystamy z adresu wewn trznego rozdzial/delete?rozdzial_id=. Poniewa jednak
jest to link do akcji delete, która jest zabezpieczona przed atakami CSRF, wi c do funk-
cji pomocniczej link_to() przekazujemy dodatkowe parametry:
'')),
'rozdzial/delete?rozdzial_id='.$Rozdzial->getRozdzialId(), array('method' =>
'delete', 'confirm' => 'Czy na pewno usun rozdzia ? Wszystkie zadania z
rozdzia u zostan usuni te!')) ?>
Podobne ikony dodaj w pozosta ych widokach w aplikacji backend. Pami taj, e zada-
nia nie s dost pne na osobnych stronach. Wszystkie zadania z rozdzia u drukujemy na
312 Cz III Panele administracyjne
stronie akcji show tego rozdzia u. Hiper cze zadania b dzie wi c zawiera o identyfi-
kator #zad-xx-xx. cze tego typu mo esz wydrukowa np. w akcji zadanie/edit
w nast puj cy sposób:


Edycja zadania

'')) ?>


Krok 3. W aplikacji frontend dodaj ikony edit
Prac nad ikonami zako cz, modyfikuj c widok akcji rozdzial/show w aplikacji fron
tend. Dodaj ikony prowadz ce do akcji edit w odpowiednim module aplikacji backend.
Wszystkie ikony zabezpiecz sprawdzeniem, czy u ytkownik jest zalogowany. W ten
sposób ikony b d widoczne wy cznie po zalogowaniu na konto administracyjne. Adresy
do akcji rozdzial/edit oraz zadanie/edit w aplikacji backend drukujemy przy u yciu
funkcji public_path(). Widok akcji backend/rozdzial/show jest przedstawiony na
listingu 22.16.
Listing 22.16. Widok akcji rozdzial/show aplikacji frontend po dodaniu ikon edit.png


Rozdzia getNumer() ?>.
isAuthenticated()): ?>

'')) ?>



getZadanies() as $Zadanie): ?>


Zadanie getNumer() ?>. $Zadanie->getNumer() ?>
isAuthenticated()): ?>

'')) ?>



getTresc() ?>
getOdpowiedz()): ?>

Rozwi zanie: $Zadanie->getSlug() ?>.cpp



getOdpowiedz() ?>


Rozdzia 22. Kontekstowe hiper cza do edycji i usuwania rekordów 313



Etap 4. Kontekstowo usuwania rekordów
Kontekstowo operacji usuwania ma dotyczy rekordów w tabeli zadanie. Mamy trzy
przypadki usuwania rekordów:
je li usuni cie zadania nast puje na stronie akcji zadanie/index, to po usuni ciu
wracamy na t sam stron ,
je li usuni cie zadania nast puje na stronie akcji zadanie/show, to po usuni ciu
równie wracamy na stron akcji zadanie/index,
je li za rekord zadanie zostanie usuni ty na stronie akcji rozdzial/show,
to po usuni ciu wracamy na t sam stron , czyli rozdzial/show.
W celu zapami tania adresu URL, do którego nale y powróci , trzeba w sesji u yt-
kownika zapami ta kolejno odwiedzane strony. W metodzie executeEdit() modu u
rozdzial oraz w metodzie executeIndex() modu u zadanie dodajemy instrukcje, które
w sesji zapami taj adres odwiedzonej strony. W metodzie akcji zadanie/index umie-
cimy kod:
$this->getUser()->setAttribute('prevUrl', 'zadanie/index');
a w metodzie akcji rozdzial/edit kod:
$this->getUser()->setAttribute('prevUrl', 'rozdzial/edit?rozdzial_id=' .
$Rozdzial->getRozdzialId());
Powrót do odpowiedniej strony WWW umieszczamy wewn trz akcji zadanie/delete.
Po usuni ciu rekordu z tabeli zadanie odczytujemy warto zmiennej sesyjnej prevUrl,
po czym przechodzimy do adresu URL pobranego z sesji:
$url = $this->getUser()->getAttribute('prevUrl', 'zadanie/index');
$this->redirect($url);
Drugi parametr metody getAttribute() jest warto ci domy ln . Je li zmienna prevUrl
nie jest zapisana w sesji, wówczas po usuni ciu rekordu przejdziemy na stron z list
wszystkich zada (tj. na stron akcji zadanie/index).
Etap 5. U atwienia w wype nianiu formularzy
Ostatnim krokiem udoskonalania projektu cpp b dzie u atwienie wype niania formula-
rzy. Formularze edycyjne zada i rozdzia ów ju zawieraj jedno u atwienie. Kolumny
slug w obu formularzach s automatycznie wype niane na podstawie tytu u rozdzia u
lub numeru zadania. Automatyczne wype nianie kolumn slug wykonali my w taki spo-
sób, e mo emy korzysta zarówno z automatycznego, jak i r cznego dost pu do kolumn
314 Cz III Panele administracyjne
Instrukcja setAttribute() klasy User zapami tuje w sesji zmienn o podanej nazwie
i warto ci. Po wywo aniu:
$this->getUser()->setAttribute('lorem', 'ipsum');
w sesji u ytkownika b dzie dost pna zmienna o nazwie lorem i warto ci ipsum.
Dost p do tej zmiennej uzyskamy, wywo uj c metod getAttribute(). Po wykona-
niu instrukcji:
$zm = $this->getUser()->getAttribute('lorem');
w zmiennej zostanie zapisana warto zmiennej lorem odczytana z sesji u ytkownika.
slug. Je li warto slug pozostawisz pust , to jej warto zostanie ustalona automa-
tycznie. Je li natomiast w formularzu wprowadzisz jaki napis, to zostanie on u yty do
wygenerowania warto ci slug. Poddamy go jedynie przekszta ceniu string2slug().
Tak funkcjonalno dla kolumn slug zapewnili my, nadpisuj c metody setSlug()
w klasach rozdzial oraz zadanie.
Krok 1. Dodawanie zada wewn trz rozdzia u
Drugim u atwieniem b dzie umo liwienie dodawania zada wewn trz konkretnego
rozdzia u. Na stronie akcji rozdzial/edit dodajemy hiper cze:
Dodaj zadanie
To hiper cze przenosi do akcji zadanie/new, przekazuj c do niej parametr rozdzial_id,
który zawiera identyfikator edytowanego w a nie rozdzia u. W metodzie executeNew()
modu u zadanie musimy sprawdzi , czy parametr rozdzial_id jest dost pny. Je li tak,
to nale y zainicjowa pole definiuj ce powi zanie nowo tworzonego zadania z odpo-
wiednim rekordem tabeli rozdzial. Metoda executeNew() modu u zadanie jest przed-
stawiona na listingu 22.17.
Listing 22.17. Metoda executeNew() modu u zadanie
public function executeNew(sfWebRequest $request)
{
$this->form = new ZadanieForm();
if (
$request->getParameter('rozdzial_id') &&
($this->Rozdzial =
RozdzialPeer::retrieveByPk($request->getParameter('rozdzial_id')))
) {
$this->form->getWidget('rozdzial_id')->setDefault($this->
Rozdzial->getRozdzialId());
$numer = $this->Rozdzial->getMaxNumerZadania();
$this->form->getWidget('numer')->setDefault($numer + 1);
$this->form->getWidget('slug')->setDefault(myString::slugZadania($this->
Rozdzial->getNumer(), $numer + 1));
}
}
Rozdzia 22. Kontekstowe hiper cza do edycji i usuwania rekordów 315
Najpierw badamy, czy zmienna rozdzial_id jest podana oraz czy jej warto jest
poprawna. Je li tak, to wewn trz instrukcji if b dzie dost pny obiekt $this->Rozdzial,
który tworzymy wewn trz warunku. Na podstawie zmiennej $this->Rozdzial ustalamy
warto wy wietlan w li cie rozwijanej generowanej dla relacji 1:n. S u y do tego
metoda setDefault():
$this->form->getWidget('rozdzial_id')->setDefault($this->Rozdzial->
getRozdzialId());
Nast pnie ustalamy domy ln warto numeru zadania. Wykorzystujemy do tego metod
getMaxNumerZadania(), która zwraca najwi kszy z numerów zada w bie cym rozdziale:
$numer = $this->Rozdzial->getMaxNumerZadania();
$this->form->getWidget('numer')->setDefault($numer + 1);
Na zako czenie wstawiamy domy ln warto kolumny slug. Przyjmie ona posta
xx-yy, gdzie xx jest numerem rozdzia u, a yy  numerem zadania:
$this->form->getWidget('slug')->setDefault(myString::slugZadania($this->Rozdzial->
getNumer(), $numer + 1));
Statyczna metoda slugZadania() klasy myString tworzy napis xx-yy na podstawie
dwóch liczb.
Krok 2. Wst pne numerowanie nowo tworzonych rozdzia ów
Wst pna numeracja nowych rozdzia ów jest zaimplementowana w metodzie execute
New() modu u rozdzial. Ta metoda jest przedstawiona na listingu 22.18. Po utworze-
niu formularza w zmiennej $numer ustalamy najwi kszy zawarty w bazie danych numer
rozdzia u. Wykorzystujemy do tego statyczn metod getMaxNumerRozdzialu(). Na
podstawie utworzonej warto ci przy u yciu metody setDefault() ustalamy domy lny
numer nowo tworzonego rozdzia u.
Listing 22.18. Automatyczne numerowanie rozdzia ów w metodzie executeNew() modu u rozdzial
public function executeNew(sfWebRequest $request)
{
$this->form = new RozdzialForm();
$numer = RozdzialPeer::getMaxNumerRozdzialu();
$this->form->getWidget('numer')->setDefault($numer + 1);
}
Krok 3. Automatyczna numeracja rozdzia ów
Ostatnim u atwieniem, jakie wykonamy w projekcie cpp, b dzie automatyczne nume-
rowanie rozdzia ów i zada . Je li w zbiorze zada usuniesz kilka rekordów z obu tabel,
wówczas w numeracji pojawi si przerwy, których r czne usuwanie b dzie do mudne.
W celu automatycznego ponumerowania zawarto ci zbioru w aplikacji backend dodajmy
akcj rozdzial/automat. W menu g ównym dodaj hiper cze do tej akcji:
  • Automatyczna numeracja »

  • 316 Cz III Panele administracyjne
    W metodzie akcji rozdzial/automat nale y pobra z bazy danych wszystkie rozdzia y
    i iteracyjnie ustali ich numer. Zatem najpierw wywo amy metod doSelect(), a nast p-
    nie otrzymane wyniki przetworzymy p tl foreach, zgodnie z listingiem 22.19. Numer
    rozdzia u ustalimy na podstawie zmiennej $k, która jest zdefiniowana jako zmienna
    steruj ca p tli foreach. Po ustaleniu numeru zadania w analogicznej p tli przetwarzamy
    zadanie z wybranego rozdzia u, numeruj c je na podstawie zmiennej $i. Po zako -
    czonej numeracji przechodzimy do strony, której adres jest zapami tany w sesji, lub
    do strony zadanie/index.
    Listing 22.19. Automatyczna numeracja rozdzia ów i zada
    public function executeAutomat(sfWebRequest $request)
    {
    $Rozdzials = RozdzialPeer::doSelect(new Criteria());
    foreach ($Rozdzials as $k => $Rozdzial) {
    $Rozdzial->setNumer($k + 1);
    $Rozdzial->save();
    foreach ($Rozdzial->getZadanies() as $i => $Zadanie) {
    $Zadanie->setNumer($i + 1);
    $Zadanie->setSlug('');
    $Zadanie->save();
    }
    }
    $url = $this->getUser()->getAttribute('prevUrl', 'zadanie/index');
    $this->redirect($url);
    }


    Wyszukiwarka

    Podobne podstrony:
    Bilans graficzny Symfonia przykład
    cw6 arkusz obliczeniowy przyklad
    przykładowy test A
    przykladowyJrkusz150UM[1] drukow
    OEiM AiR Przykladowy Egzamin
    Znaczenie korytarzy ekologicznych dla funkcjonowania obszarów chronionych na przykładzie Gorców
    przykladowe zadania redoks
    Ćwiczenie 14 przykład
    6 6 Zagadnienie transportowe algorytm transportowy przykład 2
    Przyklad5 csproj FileListAbsolute
    Człowiek wobec przestrzeni Omów na przykładzie Sonetó~4DB
    Przykladowe kolokwium 2
    Załącznik 3 Przykłady ćwiczeń relaksacyjnych przy muzyce
    Przyklad zarz

    więcej podobnych podstron