PHP5. Programowanie
z wykorzystaniem Symfony,
CakePHP, Zend Framework
Autorzy: Tomasz Skaraczyñski, Andrzej Zo³a
ISBN: 978-83-246-2521-5
Format: 158×235, stron: 360
Na rynku dostêpnych jest obecnie mnóstwo rozwi¹zañ umo¿liwiaj¹cych szybkie
tworzenie serwisów internetowych z wykorzystaniem najpopularniejszego jêzyka
skryptowego, czyli PHP, oraz zestawów narzêdzi sk³adaj¹cych siê z bazy danych
i serwera HTTP, takich jak MySQL i Apache. Wybór najlepszego oprogramowania dla
konkretnej witryny mo¿e byæ czasami bardzo trudny, poniewa¿ ka¿da z platform ma
swoje wady i zalety. Sprawê mo¿e jednak u³atwiæ lektura odpowiedniej ksi¹¿ki.
Ksi¹¿k¹ t¹ jest „PHP5. Programowanie z wykorzystaniem Symfony, CakePHP, Zend
Framework”. Dok³adnie opisano w niej sposób dzia³ania poszczególnych platform,
zwracaj¹c szczególn¹ uwagê na mocne i s³abe strony ka¿dego z rozwi¹zañ. Na
podstawie praktycznych przyk³adów zastosowañ bêdziesz móg³ samodzielnie
przekonaæ siê, które oprogramowanie najlepiej sprawdzi siê w Twoim projekcie.
Nauczysz siê te¿ wiele o budowie frameworków, poznasz znaczenie warstw i zasady
administrowania serwisami, a ponadto zdobêdziesz wiadomoœci na temat wirtualnych
hostów i odpowiedniego œrodowiska pracy projektanta WWW.
• Instalowanie i konfigurowanie platform
• Konstrukcja aplikacji WWW
• Znaczenie warstw kontrolera, modelu i widoku
• Tworzenie przyk³adowych aplikacji
• œrodowisko pracy projektanta WWW
• Praca z wirtualnymi hostami
• Zarz¹dzanie projektami
Poznaj najbardziej popularne rozwi¹zania dla twórców WWW
Spis tre"ci
Rozdzia 1. Szybki start ..................................................................................... 9
Struktura serwisu .............................................................................................................. 9
Ruszamy z projektem ..................................................................................................... 10
Potrzebna aplikacja ......................................................................................................... 11
Tworzymy modu# ........................................................................................................... 12
Pierwsza akcja ................................................................................................................ 13
Szablony akcji ................................................................................................................ 15
Instalacja layoutu ............................................................................................................ 16
Sprz$tanie wewn$trz layoutu ................................................................................. 17
Konfiguracja widoku aplikacji ............................................................................... 17
Edycja pliku layoutu .............................................................................................. 18
Prezentowanie wyniku akcji ........................................................................................... 20
Brakuj$ce elementy serwisu ........................................................................................... 21
Powi$zanie akcji z menu ................................................................................................ 22
Stopka — i to by by#o na tyle ......................................................................................... 22
Podsumowanie ................................................................................................................ 23
Rozdzia 2. Warstwa kontrolera ........................................................................ 25
Budowa aplikacji Symfony ............................................................................................. 25
Kontroler frontowy ......................................................................................................... 26
Jak startuje aplikacja Symfony? ............................................................................. 27
Czy mo'na u'ywa( wi)cej ni' jednego kontrolera frontowego? ........................... 28
Jak u'y( innego kontrolera? ................................................................................... 28
Co to jest *rodowisko pracy kontrolera? ................................................................ 28
Gdzie s$ konfigurowane *rodowiska pracy? .......................................................... 29
Czy mo'na utworzy( w#asne *rodowisko pracy? ................................................... 29
Akcje .............................................................................................................................. 29
Pliki z akcj$ ........................................................................................................... 31
W jaki sposób przekaza( parametr do akcji? ......................................................... 32
Zagl$damy do *rodka akcji .................................................................................... 33
Przesy#anie parametrów w '$daniu HTTP ...................................................................... 34
Czy formularze mo'na tworzy( inaczej? ............................................................... 36
Szablon widoku .............................................................................................................. 37
Co musisz wiedzie( na pocz$tek? .......................................................................... 37
Jak sterowa( widokami? ........................................................................................ 37
Czy mog) u'ywa( w#asnych widoków? ................................................................. 38
4
PHP5. Programowanie z wykorzystaniem Symfony, CakePHP, Zend Framework
Co z akcjami, które nie mog$ by( prezentowane w przegl$darce? ........................ 38
Warunkowe zwracanie widoków ........................................................................... 39
Przekierowania ............................................................................................................... 40
-$danie nietrafione ................................................................................................ 42
Inne rodzaje przekierowa/ ..................................................................................... 44
Przed akcj$ i po akcji ...................................................................................................... 44
Obiekt obs#uguj$cy '$dania ............................................................................................ 46
Informacje o '$daniu ............................................................................................. 48
Informacje o zasobie .............................................................................................. 48
ParameterHolder i funkcje proxy .................................................................................... 49
Funkcje proxy ........................................................................................................ 50
Ciasteczka ....................................................................................................................... 51
Przesy#anie plików na serwer ......................................................................................... 52
Obs#uga sesji ................................................................................................................... 53
Proste logowanie .................................................................................................... 54
Usuwanie zmiennej z sesji ..................................................................................... 56
Zmienne sesji w widokach ..................................................................................... 57
Atrybuty jednorazowe ............................................................................................ 57
Kilka s#ów o konfiguracji sesji ............................................................................... 59
System uprawnie/ .......................................................................................................... 60
Przegl$d funkcji systemu uprawnie/ ..................................................................... 64
Zaawansowane listy uwierzytelnie/ ...................................................................... 64
Walidacja ........................................................................................................................ 66
Mechanizm walidacji ............................................................................................. 67
Podsumowanie ................................................................................................................ 68
Rozdzia 3. Warstwa modelu ............................................................................ 69
Od bazy do modelu ......................................................................................................... 69
Baza danych ........................................................................................................... 70
Generowanie schematu YML na podstawie bazy danych .............................................. 73
Konfiguracja propela ............................................................................................. 73
Generowanie bazy danych na podstawie schematu YML .............................................. 77
Anatomia pliku schema.yml .................................................................................. 79
Dost)pne typy danych ............................................................................................ 81
Definiowanie pól ................................................................................................... 83
Indeksy ................................................................................................................... 84
W#a*ciwo*ci po#$czenia ......................................................................................... 84
Dwa schematy. Czy to mo'liwe? ........................................................................... 85
Co w modelu piszczy ...................................................................................................... 87
Katalogi modelu ..................................................................................................... 88
Model w akcji ........................................................................................................ 88
Konstruowanie kryteriów ............................................................................................. 100
Warunkowe pobieranie danych ............................................................................ 100
Typy porównywania dozwolone dla metody add ................................................. 102
Inne metody obiektu Criteria ............................................................................... 103
Zliczanie rekordów .............................................................................................. 107
Surowe zapytania SQL ................................................................................................. 107
Korzystanie z Creole ............................................................................................ 108
Rozszerzanie modelu .................................................................................................... 109
Po#$czenia z baz$ danych ............................................................................................. 112
Wi)cej o pliku database.yml ................................................................................ 112
Podsumowanie .............................................................................................................. 114
Spis tre#ci
5
Rozdzia 4. Warstwa widoku .......................................................................... 115
Domy*lna akcja i jej widok .......................................................................................... 115
Regu#y dla szablonów widoku ............................................................................. 116
Logika a szablon .................................................................................................. 117
Pomocniki ..................................................................................................................... 117
Pomocniki ogólnie dost)pne ................................................................................ 119
Layouty ......................................................................................................................... 120
Inny layout ........................................................................................................... 121
Pomocniki w layoutach ........................................................................................ 123
Zmiana layoutu dla modu#u ................................................................................. 123
Zmiana layoutu dla szablonu widoku .................................................................. 124
Zmiana layoutu dla akcji ...................................................................................... 125
Usuwanie layoutu ................................................................................................ 126
Elementy widoku .......................................................................................................... 127
Proste do#$czanie pliku ........................................................................................ 127
Partiale ................................................................................................................. 128
Komponenty ................................................................................................................. 133
Sloty ............................................................................................................................. 136
Konfiguracja ................................................................................................................. 139
Pliki view.yml ...................................................................................................... 139
Kaskada plików konfiguracyjnych ....................................................................... 140
Obiekt Response .................................................................................................. 141
Sterowanie sekcj$ meta poprzez obiekt odpowiedzi ............................................ 142
Pliki zewn)trzne ........................................................................................................... 143
Pliki CSS i JS ....................................................................................................... 144
Manipulowanie kolejno*ci$ do#$czanych plików ................................................. 144
Okre*lanie medium .............................................................................................. 145
Komponenty slotowe .................................................................................................... 146
Podsumowanie .............................................................................................................. 149
Rozdzia 5. Przyk adowa aplikacja .................................................................. 151
@wiat wizytówek .......................................................................................................... 151
Projekt bazy danych ..................................................................................................... 152
Instalacja layoutu i konfiguracja widoku ...................................................................... 154
Wykonanie modelu ....................................................................................................... 158
Budowa menu ............................................................................................................... 158
Strona o firmie .............................................................................................................. 160
Panel administracyjny — o firmie ....................................................................... 161
Interfejs u'ytkownika — o firmie ........................................................................ 164
Strona referencji ........................................................................................................... 164
Panel administracyjny — referencje .................................................................... 165
Interfejs u'ytkownika — referencje ..................................................................... 175
Strony z ofert$ .............................................................................................................. 176
Panel administracyjny — kategorie ..................................................................... 177
Panel administracyjny — produkty ...................................................................... 179
Panel administracyjny — kategorie — ci$g dalszy .............................................. 185
Panel administracyjny — zdj)cia ......................................................................... 188
Interfejs u'ytkownika — oferta ........................................................................... 191
Sentencje — panel administracyjny i interfejs u'ytkownika ........................................ 197
Licznik odwiedzin ........................................................................................................ 202
Podsumowanie .............................................................................................................. 203
6
PHP5. Programowanie z wykorzystaniem Symfony, CakePHP, Zend Framework
Rozdzia 6. Aplikacja Zend ............................................................................. 205
Szybka instalacja .......................................................................................................... 205
Test instalacji ................................................................................................................ 206
Po instalacji .................................................................................................................. 206
Pierwsza akcja na rozgrzewk) ...................................................................................... 207
Konfiguracja projektu ................................................................................................... 208
Layout ........................................................................................................................... 209
Interfejs klienta ............................................................................................................. 210
Strona o firmie ..................................................................................................... 210
Menu .................................................................................................................... 214
Referencje ............................................................................................................ 216
Oferta ............................................................................................................................ 217
Submenu .............................................................................................................. 220
Kategoria ............................................................................................................. 221
Szczegó#y produktu .............................................................................................. 223
Dodatki ................................................................................................................ 224
Panel administracyjny ................................................................................................... 229
Inny layout dla panelu .......................................................................................... 229
Zarz$dzanie stron$ o firmie ................................................................................. 230
Administracja referencjami .................................................................................. 234
Kategorie ............................................................................................................. 243
Zarz$dzanie produktami ....................................................................................... 252
Sentencje .............................................................................................................. 264
Podsumowanie .............................................................................................................. 269
Rozdzia 7. Aplikacja CakePHP ...................................................................... 271
Instalacja frameworka ................................................................................................... 271
Konfiguracja bazy danych ............................................................................................ 272
O firmie ........................................................................................................................ 273
Model ................................................................................................................... 273
Kontroler .............................................................................................................. 274
Widok .................................................................................................................. 275
Layout ........................................................................................................................... 275
Logowanie na ekranie ................................................................................................... 276
Menu ............................................................................................................................. 276
Komponent .......................................................................................................... 277
Helper .................................................................................................................. 277
Referencje ..................................................................................................................... 280
Model referencji ................................................................................................... 280
Oferta ............................................................................................................................ 282
Model na rozgrzewk) ........................................................................................... 282
Oferta w poszczególnych kategoriach ................................................................. 285
Szczegó#y wizytówki ........................................................................................... 287
Sentencje ...................................................................................................................... 288
Komponent .......................................................................................................... 288
Uruchomienie komponentu Sentencje ................................................................. 289
Licznik .......................................................................................................................... 290
Komponent licznika ............................................................................................. 290
Uruchamianie licznika ......................................................................................... 291
Panel administracyjny ................................................................................................... 292
Zmiana layoutu .................................................................................................... 292
Strona administracyjna o firmie ........................................................................... 293
Referencje ............................................................................................................ 296
Kategorie ............................................................................................................. 304
Spis tre#ci
7
Produkty ............................................................................................................... 310
Dodawanie nowego produktu .............................................................................. 312
Sentencje .............................................................................................................. 324
Podsumowanie .............................................................................................................. 327
Podsumowanie ............................................................................. 329
Dodatek A $rodowisko pracy web developera ................................................ 331
Serwer HTTP ................................................................................................................ 331
Interpreter PHP ............................................................................................................. 332
Serwer baz danych ........................................................................................................ 332
Wszystko w jednym, czyli scyzoryk ............................................................................. 332
@rodowisko projektowania baz danych ........................................................................ 333
Edytory kodu ................................................................................................................ 333
Przegl$darki .................................................................................................................. 334
Narz)dzia do pracy w grupie ........................................................................................ 334
Dodatek B Wirtualne hosty ............................................................................ 337
Importowanie wirtualnych hostów do pliku konfiguracyjnego Apache ....................... 337
Definiowanie wirtualnych hostów ................................................................................ 337
Wirtualny host dla lokalnego hosta .............................................................................. 338
Konfiguracja systemu Windows ................................................................................... 338
Dodatek C Szybka instalacja ......................................................................... 341
Odtworzenie bazy danych ............................................................................................. 341
Zainstalowanie projektu Symfony, Zend i CakePHP .................................................... 341
Dodatek D Zarz%dzanie projektem ................................................................. 343
Bibliografia .................................................................................. 345
Skorowidz .................................................................................... 347
Rozdzia 4.
Warstwa widoku
W poprzednich rozdzia#ach mog#e* przeczyta(, 'e Symfony opiera si) na regu#ach MVC
(Model-View-Controller). Warstwy modelu oraz kontrolera zosta#y tam szczegó#owo
omówione. W tym rozdziale dowiesz si) wszystkiego, co jest niezb)dne do poprawnego
konstruowania widoków.
Zanim przejdziesz dalej, warto w tym miejscu przypomnie(, czym jest widok i jaki ma
zwi$zek z poprzednio poznanymi warstwami. Otó' widok to reprezentacja wizualna
wykonanych w akcji operacji. Je'eli spojrzysz na widok w kontek*cie poprzednio pozna-
nych warstw, to #atwo zauwa'ysz, 'e:
kontroler steruje wszystkimi operacjami (poprzez akcje),
model implementuje logik) biznesow$ aplikacji (przetwarza dane),
widok opakowuje otrzymane dane w kod HTML tak, aby powsta#a
wizualizacja wykonanych operacji.
Dalsze (wiczenia wykonywane b)d$ w aplikacji widok. Musisz wi)c j$ utworzy(. Potrak-
tuj to jako (wiczenie przypominaj$ce poznane poprzednio zagadnienia. Utwórz tak'e
modu#
szablony
, którego b)dziesz u'ywa# w pierwszych (wiczeniach.
Domy"lna akcja i jej widok
Akcja
index
jest domy*ln$ akcj$ ka'dego modu#u. Zauwa', 'e Symfony dodaje j$ auto-
matycznie do tworzonego modu#u. Zawiera ona przekierowanie do akcji wy*wietlaj$cej
informacyjny komunikat o utworzeniu modu#u. Zmiana widoku na w#asny wymaga usu-
ni)cia linijki kodu:
$this->forward('default', 'module');
Je'eli doda#e* ju' komentarz, mo'esz przyst$pi( do utworzenia domy*lnego widoku dla
modu#u. Utwórz wi)c plik indexSuccess.php i dodaj do niego przyk#adowy kod. Mo'e
on wygl$da( jak na listingu:
116
PHP5. Programowanie z wykorzystaniem Symfony, CakePHP, Zend Framework
<h1>Witaj Swiecie</h1>
<p>Lorem ipsum dolor sit amet consectetuer fames...</p>
<p>Lorem ipsum dolor sit amet consectetuer fames...
Lorem ipsum dolor sit amet consectetuer fames...
Lorem ipsum dolor sit amet consectetuer fames...</p>
<p>Lorem ipsum dolor sit amet consectetuer fames...
Lorem ipsum dolor sit amet consectetuer fames...</p>
<p>Lorem ipsum dolor sit amet consectetuer fames...</p>
Uda#o Ci si) utworzy( widok, który prezentowany b)dzie zawsze, kiedy u'ytkownik nie
okre*li akcji, jak$ nale'y wykona(. W prawdziwej aplikacji warto zadba(, 'eby ten
widok by# czym* w rodzaju strony startowej dla modu#u.
Regu y dla szablonów widoku
Tworz$c szablony zgodnie z ide$ zawart$ w technologii MVC, nale'y pami)ta( o prze-
strzeganiu kilu regu#. Najwa'niejsze z nich to:
dopuszczalne jest u'ywanie w szablonach instrukcji steruj$cych:
if
,
switch
itp.
dopuszczalne jest u'ywanie w szablonach instrukcji p)tli:
for
,
while
,
foreach
itp.
niedopuszczalne jest u'ywanie w szablonach kodu przetwarzaj$cego dane,
szablony s#u'$ jedynie do wizualizacji wcze*niej wykonanych w akcjach operacji.
Kilka s#ów wyja*niaj$cych pozwoli Ci lepiej zrozumie( przedstawione powy'ej aspekty.
Szablony widoków z natury powinny by( jedynie reprezentacj$ wizualn$ przetworzo-
nych danych. Z tego powodu dopuszcza si) w nich jedynie u'ywanie prostych konstruk-
cji j)zykowych. Dla przyk#adu, mo'esz sprawdzi(, czy jaki* warunek jest prawdziwy,
i w zale'no*ci od wyniku przedstawi( pewn$ cz)*( widoku. Ponadto dla danych repre-
zentowanych przez tablice mo'esz bez obawy u'ywa( p)tli. Konstrukcje te s#u'$ jedynie
do sterowania przep#ywem danych, a nie do generowania danych. Pami)taj natomiast,
'e u'ywanie instrukcji PHP do oprogramowania jakiejkolwiek logiki jest w szablonach
niepo'$dane. Je'eli musisz co* wyliczy(, przetworzy(, zrób to w akcji!
Dlaczego nie mo'esz u'ywa( w widoku funkcji wbudowanych w PHP? Najprostsz$
odpowiedzi$ by#oby napisanie: bo tak ka'e MVC. Poniewa' jednak taka odpowiedY nie
satysfakcjonowa#aby mnie ani troch), spróbuj) w paru zdaniach wyja*ni( Ci, sk$d wzi$#
si) w ogóle taki pomys#. WyobraY sobie, 'e pracujesz w zespole nad aplikacj$ komer-
cyjn$. Aplikacja jest dosy( z#o'ona, a Ty jeste* jednym z programistów. W zespole jest
równie' grafik odpowiedzialny za projektowanie layoutów i przygotowanie kodu HTML
dla akcji. Je'eli dobrze okre*licie granice swoich wp#ywów, mo'ecie u#atwi( sobie prac).
Brak instrukcji PHP w kodach widoku spowoduje, 'e dla grafika czytanie kodu b)dzie
zdecydowanie #atwiejsze. Zapoznasz go z kilkoma zagadnieniami, takimi jak: p)tle,
instrukcje if oraz sk#adowe widoku Symfony, i b)dzie on móg# pracowa( nad wido-
kami sam. Z drugiej strony jest to równie' olbrzymia zaleta dla Ciebie. Mo'esz sku-
pi( si) na programowaniu akcji, na rozwi$zywaniu zawi#o*ci aplikacji, nie martwi$c
si) przy tym stylizacj$ wizualn$ tego, co robisz. Mam nadziej), 'e takie wyja*nienie
w zupe#no*ci Ci wystarczy.
Rozdzia 4. Warstwa widoku
117
Logika a szablon
W ka'dym systemie implementuj$cym MVC logika oddzielona jest od szablonu widoku.
Separacja tych elementów aplikacji pozwala na wi)kszy komfort pracy dla zespo#u
sk#adaj$cego si) z kilku pracowników. Ponadto zwi)ksza mo'liwo*ci systemu oraz efek-
tywno*( pracy, poniewa' pozwala na wielokrotne wykorzystywanie tego samego kodu.
Lepiej to zrozumiesz na konkretnym przyk#adzie.
WyobraY sobie, 'e programujesz pewn$ aplikacj). W aplikacji wymagana jest klasa
Klient
, reprezentuj$ca klientów firmy. Z klas$ powi$zany jest obiekt odpowiadaj$cy za
komunikacj) z baz$ danych. Ta cz)*( aplikacji realizuje logik) klienta. Zwró( uwag) na
to, 'e logika zawsze jest taka sama. Z drugiej strony reprezentacja wizualna Klienta
mo'e by( ró'na w ró'nych cz)*ciach serwisu. Wystarczy, 'e jako przyk#ad rozwa'ysz
widok w profilu Klienta oraz widok w panelu Administratora. Zwykle ró'ni$ si) one
w znacznym stopniu. Wniosek p#yn$cy z tego jest oczywisty, mo'emy z klasy
Klient
korzysta( wielokrotnie. Jedyne, co trzeba zrobi(, to dopisa( odpowiedni szablon widoku.
Mam nadziej), 'e coraz bardziej dostrzegasz zalety takiego programowania.
Pomocniki
Pomocniki Symfony s$ funkcjami napisanymi w j)zyku PHP. Realizuj$ bardzo standar-
dowe zadania, przez co u#atwiaj$ konstruowanie widoków. Dla przyk#adu, u'ywaj$c
odpowiedniego pomocnika Symfony, mo'esz wstawi( na stron) edytor WYSIWYG
(What You See Is What You Get — to, co widzisz, jest tym, co otrzymasz), który pozwoli
Ci #atwo formatowa( teksty. Inn$ wa'n$ cech$ pomocników jest to, 'e wiele z nich
jest zintegrowanych z mechanizmami Symfony. Dzi)ki temu tworzenie hiper#$czy do
akcji jest bardzo #atwe. Wystarczy, 'e wywo#asz odpowiedni pomocnik, podasz odpo-
wiednie parametry, a dostaniesz na wyj*ciu kod uwzgl)dniaj$cy ustawienia frameworka
(np. mechanizmy przepisywania linków).
Wszystkie pomocniki zajmuj$ce si) dan$ tematyk$ umieszczane s$ w jednym pliku.
Nazwa ka'dego pliku ko/czy si) tekstem Helper.php. Ze wzgl)du na to bardzo cz)sto,
mówi$c o pomocniku, ma si) na my*li ca#$ grup) funkcji. Warto w tym miejscu zasta-
nowi( si), gdzie Symfony przechowuje pliki pomocników? Nie musisz g#)boko szuka(.
Wystarczy, 'e b)d$c w katalogu projektu, wejdziesz do lib/symfony/helper. W tym miej-
scu znajduje si) odpowiedY na postawione pytanie.
Co prawda nie zrobi#e* zbyt wielu (wicze/ w module
szablony
, warto jednak w tym
miejscu zrobi( nowy modu#. Utwórz wi)c modu#
pomocniki
, co pozwoli Ci w przy-
sz#o*ci #atwiej odnajdywa( potrzebne elementy. Na pocz$tek przypomnimy sobie kilka
istotnych rzeczy. W tym celu dodaj do modu#u akcj)
linkDoZasobu
. Akcja nie zawiera
'adnego kodu. Poni'ej znajduje si) listing jej widoku:
<div>
<h1>Wynik pomocnika url_for</h1>
<?php echo url_for('/pomocniki/linkDoZasobu?pokaz=jablko'); ?><br/>
<?php echo url_for('/pomocniki/linkDoZasobu?pokaz=gruszka', true); ?><br/>
118
PHP5. Programowanie z wykorzystaniem Symfony, CakePHP, Zend Framework
</div>
<hr/>
<div>
W przyk#adzie u'y#e* pomocnika
url_for
. Jego dzia#anie jest bardzo proste. Jako argu-
ment podajesz tekst wskazuj$cy zasób, w wyniku za* dostajesz adres odpowiedni dla
Symfony. Zauwa', 'e format tego tekstu musi by( taki jak poni'ej:
modu"/akcja?parametr1=warto%&1¶metr2=warto%&2...
Tekst zostanie przekszta#cony tak, 'eby uwzgl)dni( Twoj$ konfiguracj) Symfony.
Spróbuj teraz napisa( inny przyk#ad. Zacznij od utworzenia akcji
dolaczPomocnik
. Poni'ej
jest jej widok:
<div>
<h3>Wynik dzia"ania auto_link_text</h3>
<?php
use_helper('Text');
echo auto_link_text(
'Aby umie%ci& ofert2 w serwisie http://www.allegro.pl
nale3y za"o3y& konto u3ytkownika na stronie
http://allegro.pl/new_user.php'
);
?>
<div>
Co robi pomocnik
auto_link_text
? Wyszukuje w tek*cie poprawne adresy URL i zamie-
nia je na hiper#$cza. Dzia#anie pomocnika jest wi)c dosy( proste. O wiele ciekawsza jest
instrukcja
use_helper
. Przyjmuje ona jako parametr nazw) grupy pomocników, któr$
nale'y do#$czy( do widoku. Dlaczego wi)c poprzednio nigdy jej nie wywo#ywa#e*?
Pewne grupy najpowszechniej stosowanych pomocników do#$czane s$ do widoków
domy*lnie. Je'eli potrzebujesz mniej popularnych, musisz je do#$czy( za pomoc$
use_helper
. Zwró( uwag) na to, 'e wystarczy poda( nazw) grupy. Nie musisz podawa(
ca#ej nazwy pliku. Je'eli parametrem jest warto*(
Text
, do szablonu zostanie do#$czony
plik TextHelper.php.
(wiczenie 4.1
Utwórz pomocnik FileHelper.php. Pomocnik zawiera jedn$ funkcj) o nazwie storage.
Przyjmuje ona jako parametr wielko*( b)d$c$ rozmiarem pliku w bajtach. Funkcja zwraca
jako wynik rozmiar pliku w najlepiej dopasowanych jednostkach.
Rozwi4zanie
W tym (wiczeniu nauczysz si), w jaki sposób tworzy( w#asne pomocniki. Na pocz$-
tek w katalogu modu#u
pomocniki
otwórz katalog lib. Nast)pnie utwórz w nim folder
o nazwie helper. W kolejnym kroku musisz utworzy( plik FileHelper.php. Je'eli
uda#o Ci si) wszystko wykona( poprawnie, otwórz plik helpera do edycji. Musisz teraz
dopisa( do niego funkcj) realizuj$c$ za#o'enia z (wiczenia. Poni'ej przyk#adowa imple-
mentacja:
Rozdzia 4. Warstwa widoku
119
<?php
function storage( $size ) {
$aUnits = array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
$unitIndex = 0;
while ($size >= 1024) {
$size /= 1024;
$unitIndex++;
}
return round( $size, 1 ).' '.$aUnits[$unitIndex];
}
?>
Spróbuj) teraz w paru s#owach wyja*ni(, co robi funkcja. Po pierwsze, ustala indeks odpo-
wiedniej jednostki. Po drugie, zmniejsza obecn$ wielko*( tak, 'eby pasowa#a do ustalonej
jednostki. Analizuj$c algorytm, pami)taj, 'e 1 KB = 1024 B, 1 MB = 1024 KB itd.
Teraz nadszed# czas na wypróbowanie utworzonego w#a*nie helpera W tym celu musisz
utworzy( akcj)
wlasnyPomocnik
. Widok akcji przedstawiony jest na listingu:
<?php
use_helper('File');
echo storage(1024),'<br />';
echo storage(1024*1024),'<br />';
echo storage(1024*1024*1024),'<br />';
?>
Jak widzisz, w#asne pomocniki dodaje si) tak samo jak pozosta#e (niedomy*lne). Je'eli
pomocnik zadzia#a dobrze, to na ekranie powiniene* zobaczy( nast)puj$cy wynik:
1 KB
1 MB
1 GB
Pami)taj, 'eby tworzy( pomocniki wtedy, kiedy s$ naprawd) potrzebne, tj. zawieraj$
funkcje, których u'ywasz wielokrotnie w ró'nych cz)*ciach aplikacji.
Pomocniki ogólnie dost)pne
W poprzedniej sekcji mog#e* poczyta( o tym, 'e cz)*( pomocników do#$czana jest
do widoku domy*lnie. Poni'ej znajdziesz ich list) wraz z krótkim wyja*nieniem:
Helper
— pomocnik odpowiadaj$cy za do#$czanie innych pomocników,
Tag
— pomocniki bazowe dla innych pomocników (zawieraj$ funkcje tworz$ce
znaczniki HTML),
Url
— pomocniki konstruuj$ce adresy URL,
Asset
— pomocniki tworz$ce *cie'ki do zasobów oraz znaczniki wymagaj$ce
*cie'ek do zasobów (
<img>
),
Partial
— pomocniki pozwalaj$ce podzieli( widok na fragmenty zwane
partialami (dowiesz si) o nich wi)cej w dalszej cz)*ci),
120
PHP5. Programowanie z wykorzystaniem Symfony, CakePHP, Zend Framework
Cache
— pomocniki zarz$dzaj$ce pami)ci$ podr)czn$,
Form
— pomocniki wspomagaj$ce tworzenie kontrolek formularzy HTML.
[atwo zauwa'y(, 'e domy*lna grupa pomocników oferuje ca#kiem spore mo'liwo*ci.
Ponadto zawiera elementy, które s$ zdecydowanie najcz)*ciej u'ywane przez programi-
stów. Pami)taj, je'eli nie jeste* pewny, co robi dany pomocnik, warto zajrze( do jego
kodu. Zawiera on wiele wskazówek, które mo'esz wykorzysta( podczas tworzenia w#a-
snych pomocników.
Layouty
Z punktu widzenia poprawno*ci HTML szablony nie s$ kompletnym kodem. Nie zawie-
raj$ ca#ej struktury dokumentu, a jedynie pewn$ jego cze*(. Z drugiej strony szablony
pozwalaj$ zachowa( niezale'no*( od logiki oraz podzieli( zadania na mniejsze cz)*ci.
Ze wzgl)du na cz$stkowo*( szablonów docelowo nale'y je opakowa( w struktur) do-
kumentu HTML. W ten sposób b)d$ stanowi#y razem kompletn$ stron) WWW. Sym-
fony realizuje to zadanie za pomoc$ pliku zwanego layoutem. Zawiera on ogóln$
struktur) serwisu, ale nie zawiera jego tre*ci. Tre*( tworzona jest przez szablony wido-
ków i umieszczana w layoucie w przeznaczonych do tego celu miejscach. Wi)cej szcze-
gó#ów poznasz, czytaj$c dalsz$ cz)*( rozdzia#u.
Zanim przejdziesz dalej, powiniene* utworzy( nowy modu# o nazwie
layout
(pami)taj
o zakomentowaniu przekierowania akcji
index
). W module tym wykonasz wiele (wicze/,
które zwi)ksz$ Twoj$ wiedz) i pozwol$ lepiej operowa( elementami warstwy widoku.
Zaczniemy od instalacji layoutu.
(wiczenie 4.2
W pliku finanse_layout.zip umieszczony jest pewien
layout
. Zainstaluj go jako
layout
domy*lny dla ca#ej aplikacji widok.
Rozwi4zanie
Na pocz$tek rozpakuj archiwum zip. PrzejdY do katalogu g#ównego Twojego projektu
Symfony. Znajdziesz w nim katalog o nazwie web. Folder ten zawiera trzy istotne dla
tego zadania podfoldery: css, images oraz js. W ich miejsce musisz przekopiowa( foldery
(o takich samych nazwach) wypakowane wcze*niej z archiwum.
Drugi krok instalacji wymaga powrotu do katalogu g#ównego projektu. Nast)pnie przejdY
do katalogu apps/widok. Znajdziesz tutaj folder o nazwie templates. Jest to miejsce,
w którym Symfony przechowuje
layouty
Twojej aplikacji. Nie pozostaje Ci nic innego,
jak przekopiowa( do templates layout wypakowany z archiwum finanse_layout.zip.
Ostatni krok polega na edycji pliku view.yml zawieraj$cego konfiguracj) widoku dla
aplikacji widok. W celu realizacji tego zadania otwórz plik do edycji. Znajdziesz go
w <hatalog_projektu>/apps/widok/config. Plik zawiera sekcj)
Rozdzia 4. Warstwa widoku
121
stylesheets: [main]
Zmie/ tekst
main
na
style
. Musisz tak zrobi(, poniewa' Twoje style zapisane s$ w pliku
style.css, a nie w domy*lnym pliku main.css. Teraz musisz przetestowa( instalacj). W tym
celu wpisz w przegl$darce
http://127.0.0.1/widok.php/layout
Je'eli wszystkie polecenia wykona#e* poprawnie, na ekranie zobaczysz zawarto*( przed-
stawion$ na rysunku 4.1.
Rysunek 4.1. Widok instalacji szablonu finanse_widok
Pami)taj, domy*lnie szablon u'ywany jest dla wszystkich widoków akcji. Mo'esz to
oczywi*cie zmieni(, o czym przekonasz si) w dalszej cz)*ci ksi$'ki.
Inny layout
Zmiana layoutu jest bardzo praktyczn$ rzecz$. Wiele serwisów praktykuje zmiany
okoliczno*ciowe. Dla przyk#adu, je'eli mamy sklep internetowy, by( mo'e zechcemy mu
nada( inny wygl$d podczas *wi$t.
(wiczenie 4.3
Zainstalowa( layout
wizytowki
dla wszystkich modu#ów w aplikacji widok.
Rozwi4zanie
Na pocz$tek musisz rozpakowa( archiwum wizytowki.zip. Zawarto*( archiwum jest
nast)puj$ca:
1)
plik wizytowki.php — nowy layout,
2)
plik css/wizytowki.css — style okre*laj$ce struktur) oraz wygl$d elementów
serwisu,
3)
pliki images/wizytowki/* — pliki graficzne u'ywane przez style oraz layout.
122
PHP5. Programowanie z wykorzystaniem Symfony, CakePHP, Zend Framework
Zwró( uwag) na to, 'e pliki dla layoutu wizytowki nie s$ umieszczone w katalogu
images. Powód jest prosty. W ten sposób #atwo oddzieli( pliki nale'$ce do poszczegól-
nych layoutów.
Kolejny krok polega na przekopiowaniu pliku w odpowiednie miejsce struktury katalo-
gów Symfony. S$ to operacje identyczne w stosunku do omawianego poprzednio procesu
instalacji. Musisz wi)c przekopiowa(:
1)
plik wizytówki.php do katalogu apps/widok/templates,
2)
plik css/wizytowki.css do katalogu web/css,
3)
ca#y katalog images/wizytowki do katalogu web/images.
W ten oto sposób uda#o Ci si) zainstalowa( layout. Teraz musisz poinformowa( Symfony
o tym, który layout ma zosta( u'yty dla Twoich akcji. W tym celu otwórz do edycji
plik view.yml. Znajdziesz go w katalogu conf umieszczonym w aplikacji widok. Poni'ej
znajdziesz listing pliku konfiguracyjnego:
default:
http_metas:
content-type: text/html
metas:
title: Superwizytówki na ka3dL kieszeN.
robots: index, follow
description: Tanie wizytówki dla firm.
keywords: wizytówki, tanie wizytówki
language: pl
stylesheets: [wizytowki]
javascripts: []
has_layout: on
layout: wizytowki
Najwa'niejsze (z punktu widzenia instalacji layoutu) s$ dyrektywy
stylesheets
i
layout
.
Pierwsza okre*la nazw) pliku ze stylami, jakiego nale'y u'y(, druga za* nazw) pliku
layoutu, który nale'y zastosowa(. Pami)taj, 'e po zmianie pliku yml nale'y usun$(
pami)( podr)czn$. Mo'esz to zrobi( przyk#adowo tak:
>symfony.bat cc
Argument
cc
jest skrótem dla
clear cache
(czy*( pami)( podr)czn$).
Testowanie instalacji wymaga wywo#ania w przegl$darce adresu:
http://127.0.0.1/widok.php/layout.
Je'eli wszystko przebieg#o poprawnie, w oknie przegl$darki zobaczysz widok zaprezen-
towany na rysunku 4.2.
Rozdzia 4. Warstwa widoku
123
Rysunek 4.2. Nowy layout
Co, je'eli „sko/cz$ si) *wi)ta” i zechcesz wróci( do starego layoutu? Musisz zmieni(
konfiguracj) w pliku view.yml, wyczy*ci( pami)( podr)czn$ i... to ju' wszystko.
Pomocniki w layoutach
Mo'esz u'ywa( w layoutach dowolnego zestawu pomocników. Na pierwszy ogie/ id$
jednak zwykle te, które odpowiadaj$ za generowanie znaczników dla sekcji
HEAD
. Otwórz
na chwil) plik wizytowki.php. Na pocz$tku pliku znajdziesz instrukcje:
<?php
include_http_metas();
include_metas();
include_title();
?>
Wszystkie u'yte powy'ej funkcje to pomocniki. Odpowiadaj$ za umieszczenie w sekcji
HEAD
warto*ci podanych w pliku konfiguracyjnym view.yml. Warto*ciami tymi s$ nazwy
plików CSS, nazwy plików JS, tekst tytu#u itp. Zalet$ takiego podej*cia jest mo'li-
wo*( dostosowywania sekcji
HEAD
dla modu#u a nawet widoku akcji. Przekonasz si)
o tym w dalszej cz)*ci ksi$'ki.
Zmiana layoutu dla modu u
Zmiana layoutu na poziomie modu#u jest bardzo wa'n$ cech$ Symfony. W ten sposób
mo'esz budowa( modu#y jako niezale'ne cz)*ci serwisu posiadaj$ce indywidualny
widok (dostosowany do tematyki). Dla przyk#adu, w serwisach informacyjnych inaczej
mo'na przedstawia( dane o sporcie, inaczej o gospodarce itp.
124
PHP5. Programowanie z wykorzystaniem Symfony, CakePHP, Zend Framework
(wiczenie 4.4
Utwórz modu# o nazwie
layout2
(w aplikacji widok). Okre*l layout.php jako domy*lny
dla ca#ego modu#u.
Rozwi4zanie
Na pocz$tek utwórz modu#:
>symfony init-mod widok layout2
PrzejdY do modu#u, otwórz plik action.class.php i zakomentuj instrukcj) umieszczon$
w akcji
index
. Nast)pnie w katalogu layout2/config utwórz plik o nazwie view.yml. Do
pliku wprowadY konfiguracj) przedstawion$ na listingu poni'ej:
all:
layout: layout
stylesheets: [style]
Poniewa' zmiana dotyczy pliku YML, musisz wyczy*ci( pami)( podr)czn$. Na koniec
wywo#aj w przegl$darce poni'sze adresy:
http://127.0.0.1/widok.php/layout
http://127.0.0.1/widok.php/layout2
Je'eli wszystkie operacje wykona#e* poprawnie, w przegl$darce zobaczysz dwa ró'ne
layouty. I o to w#a*nie chodzi#o!
Zmiana layoutu dla szablonu widoku
Projektanci Symfony nie zatrzymali si) na zmianie szablonu do modu#u. Poszli zdecy-
dowanie dalej, pozwalaj$c programi*cie na wymian) layoutu dla konkretnego widoku.
(wiczenie 4.5
Utworzy( akcj)
historia
w module
layout2
. Dla akcji ustawi( layout
wizytowki
.
Rozwi4zanie
W pliku actions.class.php utwórz pust$ akcj) historia. Ponadto w katalogu templates
(modu#u
layout2
) umie*( pusty szablon widoku (jest to równoznaczne z utworzeniem
pustego pliku historiaSuccess.php). Nast)pnie dodaj do pliku view.yml poni'sz$ kon-
figuracj):
historiaSuccess:
layout: wizytowki
stylesheets: [wizytowki]
Pozosta#o jeszcze wyczy*ci( pami)( podr)czn$ i wywo#a( '$danie akcji w przegl$darce.
Rozdzia 4. Warstwa widoku
125
No i jak wynik? Niestety, niezbyt mi#y dla oka. Co prawda akcja korzysta z w#a*ciwego
layoutu, ale co* jednak nie gra. Pytanie tylko, co? OdpowiedY jest dosy( prosta. Ponie-
wa' dla modu#u domy*lnym layoutem jest layout.php, wymiesza#y nam si) style. Jak
temu zapobiec? W#a*ciwa konfiguracja na tym poziomie powinna wygl$da( tak:
all:
layout: layout
stylesheets: [-wizytowki, style]
historiaSuccess:
layout: wizytowki
stylesheets: [-style, wizytowki]
Jak widzisz, jest ona prawie taka sama jak poprzednia. Jednak, jak powszechnie wiadomo,
„prawie” robi wielk$ ró'nic). Zwró( uwag) na minus przed niektórymi nazwami plików.
Oznacza on, 'e w danym miejscu nie nale'y pliku do#$cza( do kodu wynikowego.
Wyczy*( wi)c pami)( podr)czn$, od*wie' stron) w przegl$darce i voilà!
Zmiana layoutu dla akcji
W poprzedniej sekcji dowiedzia#e* si), jak zmieni( layout dla konkretnego widoku.
Mo'esz w ten sposób ustawi( inny layout dla szablonu sukcesu, inny dla szablonu
b#)du itp. Co jednak w przypadku, kiedy chcia#by*, aby szablony widoków jednej akcji
korzysta#y z tego samego layoutu? Mo'esz oczywi*cie ka'dy widok konfigurowa(
oddzielnie. Nie jest to nawet a' tak k#opotliwe. Istnieje jednak znacznie prostsza metoda,
która pozwala przypisywa( layout do wszystkich widoków akcji jednocze*nie.
(wiczenie 4.6
Utwórz akcje
layoutDlaAkcji
. Ka'dy widok utworzonej akcji musi korzysta( z layoutu
o nazwie
wizytowki
.
Rozwi4zanie
Utwórz pust$ akcje
layoutDlaAkcji
oraz pusty szablon widoku. Wpisz w pasku adresu
http://127.0.0.1/widok.php/layout2/layoutDlaAkcji
i upewnij si), 'e akcja korzysta z pliku layout.php.
Kolejnym krokiem jest edycja akcji. Musisz do niej dopisa( poni'sz$ instrukcj):
$this->setLayout('wizytowki');
Metoda
setLayout
pozwala okre*li( nazw) layoutu, jaki nale'y u'y( dla akcji. Mo'esz
teraz od*wie'y( stron) w przegl$darce. Pewne zmiany ju' wida(, jednak #atwo zauwa-
'ysz, 'e co* jeszcze wymaga dopracowania. [atwo si) domy*li(, 'e brakuje popraw-
nych stylów. Dopisz do akcji instrukcj):
$this->getResponse()->addStylesheet('wizytowki');
i ponownie od*wie' stron) w przegl$darce. Efekt jest nieco lepszy, jednak nie do ko/ca
dobry. Metoda
addStylesheet
(wywo#ywana dla obiektu odpowiedzi —
sfWebResponse
)
126
PHP5. Programowanie z wykorzystaniem Symfony, CakePHP, Zend Framework
do#$cza plik ze stylami. Ponadto w uk#adzie, który uzyska#e*, do widoku do#$czany jest
równie' plik style.css (konfiguracja dla ca#ego modu#u). Niestety, pliki te nieco sobie
przeszkadzaj$. W Symfony 1.0 nie ma #atwego sposobu na usuni)cie zb)dnego pliku
z odpowiedzi. Najprostsz$ metod$ jest stworzenie odpowiedniego wpisu w pliku
view.yml. W tym celu musisz dopisa( poni'sze dyrektywy:
layoutDlaAkcjiSuccess:
stylesheets: [-style]
Teraz musisz jeszcze wyczy*ci( pami)( podr)czn$, od*wie'y( stron) — i wszystko
powinno by( ju' na swoim miejscu. Co prawda by#o troch) problemów, jednak efekt
jest zgodny z oczekiwanym.
Usuwanie layoutu
Niektóre akcje, jak na przyk#ad '$dania AJAX, nie wymagaj$ layoutu. Powiniene* wi)c
wiedzie(, w jaki sposób mo'na go wy#$czy(, je'eli zajdzie taka potrzeba.
(wiczenie 4.7
Utwórz akcj)
bezLayoutuYML
. Zablokuj dla niej dekorowanie layoutem.
Rozwi4zanie
W pliku actions.class.php utwórz akcj)
bezLayoutuYML
. Widok
bezLayoutuYMLSuccess
przedstawiony jest poni'ej:
<div>Ta akcja nie potrzebuje dekorowania layoutem</div>
Nast)pnie otwórz plik view.yml do edycji i dopisz do niego poni'sze dyrektywy:
bezLayoutuYMLSuccess:
layout: no
Wyczy*( pami)( podr)czn$, a nast)pnie od*wie' stron). Je'eli wszystko zrobi#e* dobrze,
w oknie przegl$darki zobaczysz jedynie napis:
Ta akcja nie potrzebuje dekorowania layoutem
Na koniec zajrzyj do kodu Yród#owego. [atwo zauwa'ysz, 'e poza kodem, który wpisa-
#e* w widoku akcji, niczego wi)cej w kodzie Yród#owym nie ma.
(wiczenie 4.8
Utwórz akcj)
brakLayoutuAkcja
. Zablokuj dla niej dekorowanie layoutem.
Rozwi4zanie
`wiczenie, które teraz wykonasz, jest bardzo podobne do poprzedniego. Ró'nica b)dzie
polega#a na tym, 'e tym razem usuniemy layout z poziomu akcji. Na pocz$tek utwórz
pust$ akcj) oraz widok sukcesu. W widoku wprowadY tak$ tre*( jak poprzednio. Nast)p-
nie dopisz do akcji poni'sz$ instrukcj):
Rozdzia 4. Warstwa widoku
127
$this->setLayout(false);
Podanie warto*ci
false
dla metody
setLayout
oznacza wy#$czenie dekorowania layoutem.
I o to w#a*nie nam chodzi#o.
Elementy widoku
Ka'dy element widoku ma dost)p do pewnego zbioru zmiennych Symfony. Do najwa'-
niejszych z nich nale'$:
$sf_context
— obiekt udost)pniaj$cy kontekst '$dania,
$sf_request
— obiekt udost)pniaj$cy informacje o '$daniu,
$sf_params
— obiekt udost)pniaj$cy parametry przes#ane w '$daniu,
$sf_user
— obiekt udost)pniaj$cy dane u'ytkownika (w tym sesje).
Wszystkie obiekty przedstawione powy'ej pozna#e* ju' wcze*niej. By#y one szeroko
omówione w rozdziale 2. „Warstwa kontrolera”. W dalszych cz)*ciach tego rozdzia#u
nauczysz si), jak korzysta( z tych obiektów w widoku.
Proste do %czanie pliku
W ka'dym serwisie WWW pewne elementy strony s$ wspólne dla ró'nych stron. Do
takich elementów mo'na zaliczy( stopk), menu itp. Poniewa' dobrze zaprogramowany
serwis nie powinien dublowa( kodu, zwykle elementy takie umieszczane s$ w osob-
nych plikach. Nast)pnie pliki te do#$czane s$ we w#a*ciwych cz)*ciach serwisu.
Na pocz$tek zapoznasz si) z prostym do#$czaniem plików. W tym celu utwórz modu#
elementy_widoku
, a nast)pnie rozwi$' poni'sze (wiczenie.
(wiczenie 4.9
Utwórz kopi) layoutu wizytowki.php. Nowy plik nazwa( wizytowki_dolaczenie.php.
Nast)pnie utwórz plik menu.php. Plik zawiera kod generuj$cy pozycje O firmie, Oferta,
Nasze sklepy. Ustaw utworzony layout jako domy*lny dla akcji
index
.
Rozwi4zanie
Na pocz$tek utwórz kopi) layoutu wizytowki.php i zmie/ jej nazw) tak jak w polece-
niu. Operacja jest bardzo prosta. Pami)taj jedynie o tym, 'e kopia musi by( zapisana
w katalogu templates aplikacji widok. W tym samym katalogu utwórz plik menu.php
i wprowadY do niego poni'szy kod:
<ul class="fl">
<li style="background: none;"><a href=""><span>O firmie</span></a></li>
<li><a href=""><span>Oferta</span></a></li>
<li><a href=""><span>Nasze sklepy</span></a></li>
<li><a href=""><span>Referencje</span></a></li>
</ul>
128
PHP5. Programowanie z wykorzystaniem Symfony, CakePHP, Zend Framework
Nast)pnie odszukaj w pliku wizytowki_dolaczenie.php kod wygl$daj$cy bardzo podobnie.
Zast$p ten kod (#$cznie ze znacznikami
ul
) poni'sz$ instrukcj$:
<?php include( sfConfig::get( 'sf_app_template_dir' ).'/menu.php' ); ?>
Do#$czenie pliku wymaga okre*lenia *cie'ki do pliku. Z tego powodu musia#e* u'y( klasy
sfConfig
. Za pomoc$ jej metod mo'esz pobiera( informacje o *rodowisku Symfony.
W przyk#adzie u'y#e* metody
get
do pobrania warto*ci dyrektywy
sf_app_template_dir
.
Dyrektywa przechowuje *cie'k) do katalogu z layoutami aplikacji. Nale'a#o wi)c jedy-
nie doklei( do otrzymanej *cie'ki nazw) do#$czanego pliku, co uczyni#e*.
Wró(my do przyk#adu. Plik layoutu po zmianach powinien wygl$da( tak:
<div id="right_menu">
<?php echo image_tag('wizytowki/right_menu_top.jpg', 'class="fl"') ?>
<?php include( sfConfig::get( 'sf_app_template_dir' ).'/menu.php' ); ?>
<?php echo image_tag('wizytowki/right_menu_bottom.jpg', 'class="fl"') ?>
<div class="cl"></div>
</div>
Kolejny krok, jaki musisz wykona(, polega na ustawieniu layoutu dla akcji
index
. W tym
celu otwórz plik actions.class.php i zmodyfikuj akcj)
index
, jak przedstawiono na listingu:
public function executeIndex() {
$this->getResponse()->addStyleSheet('wizytowki');
$this->setLayout('wizytowki_dolaczanie');
}
Obie instrukcje u'yte w akcji pozna#e* ju' wcze*niej. Pierwsza dodaje do odpowiedzi plik
ze stylami, druga za* zmienia szablon. Poniewa' wszystko, co trzeba, ju' wykona#e*, nad-
szed# czas na testy. W przegl$darce wpisz adres:
http://127.0.0.1/widok.php/elementy_widoku
Je'eli wszystko zrobi#e* poprawnie, na ekranie zobaczysz layout zawieraj$cy menu
z pliku menu.php.
Niestety, przedstawione rozwi$zanie ma kilka istotnych wad. Do najwa'niejszych z nich
nale'$:
Zmienne w ró'nych plikach mog$ mie( takie same nazwy. W ten sposób
powodujemy konflikt nazw.
System pami)ci podr)cznej zaimplementowany w Symfony nie potrafi wykrywa(
do#$czania plików. Z tego powodu ka'de u'ycie menu.php zostanie wpisane
do pami)ci podr)cznej, co z pewno*ci$ nie jest po'$dane.
W dalszej cz)*ci ksi$'ki poznasz rozwi$zania omijaj$ce opisane powy'ej niedogodno*ci.
Partiale
Partiale s$ elementami widoku przypominaj$cymi funkcje w j)zyku programowania.
Za ich pomoc$ mo'na grupowa( kod widoku, a nast)pnie wielokrotnie z niego korzysta(.
Dla przyk#adu, kod HTML wy*wietlaj$cy wiersz tabeli mo'emy umie*ci( w partialu.
Rozdzia 4. Warstwa widoku
129
Nast)pnie partial wywo#amy w widoku tyle razy, ile potrzeba. W ten sposób zmiany doty-
cz$ce tabeli, takie jak przestawienie kolumn itp., wykonywane s$ w jednym miejscu.
Ponadto partiale rozwi$zuj$ problemy opisane w poprzedniej sekcji.
Partiale mog$ by( u'ywane w ró'nych elementach widoku. Mo'emy z nich korzysta(
w layoutach, szablonach widoku akcji, jak równie' w innych partialach. Jak rozpozna(
partial? Otó' ka'dy partial musi by( zapisany w osobnym pliku. Nazwy tych plików
musi rozpoczyna( znak podkre*lenia. Rozpoznanie partiala nie jest wi)c trudne.
(wiczenie 4.10
Utwórz partial pozwalaj$cy wy*wietli( na stronie dodatkowe menu. Nowe menu zawiera
nast)puj$ce linki: ostatnio dodane, najpopularniejsze i najlepiej ocenione. Menu ma by(
pokazane pod utworzonym w (wiczeniu 4.9.
Rozwi4zanie
Partial, który utworzysz, b)dzie cz)*ci$ layoutu. Z tego powodu musisz go zapisa(
w katalogu templates dla aplikacji. PrzejdY wi)c do tego katalogu, a nast)pnie utwórz
plik o nazwie _menu_dolne.php. Poni'ej znajduje si) przyk#adowy listing pliku:
<ul class="fl">
<li><a href=""><span>Ostatnio dodane</span></a></li>
<li><a href=""><span>Najpopularniejsze </span></a></li>
<li><a href=""><span>Najlepiej ocenione</span></a></li>
</ul>
Jak widzisz, jest to menu w takim samym stylu jak poprzednie. Teraz wystarczy do#$czy(
partial do layoutu. W tym celu znajdY znacznik z atrybutem
id
równym
right_menu
.
Po poleceniu
<div class="cl"></div>
musisz doda( nast)puj$cy kod:
<?php echo image_tag('wizytowki/right_menu_top.jpg', 'class="fl"') ?>
<?php include_partial('global/menu_dolne'); ?>
<?php echo image_tag('wizytowki/right_menu_bottom.jpg', 'class="fl"') ?>
<div class="cl"></div>
Zwró( uwag), w jaki sposób kod partiala umieszczany jest w layoucie. Po pierwsze,
musisz wywo#a( funkcj)
include_partial
, która odpowiada za przetworzenie partiala.
Po drugie, partiale utworzone dla layoutu nale'y poprzedzi( s#owem kluczowym
global
.
W ten sposób informujesz Symfony, 'e potrzebny plik znajdzie w katalogu templates
aplikacji.
Partiale w widokach akcji
W poprzedniej sekcji dowiedzia#e* si), w jaki sposób do#$cza si) partial zapisany w tym
samym katalogu co layout. Tym razem poznasz regu#y do#$czania partiali w wido-
kach akcji. Na pocz$tek wyobraY sobie, 'e chcesz do#$czy( partial
_menu_osobiste
do
widoku
logowanieSuccess
. Widok znajduje si) w module
uzytkownik
. Poni'ej znajdziesz
wyja*nienie, jak mo'esz to zrobi(:
130
PHP5. Programowanie z wykorzystaniem Symfony, CakePHP, Zend Framework
1.
Je'eli partial znajduje si) w katalogu templates dla modu#u
uzytkownik
, do#$czysz
go za pomoc$ instrukcji:
include_partial('menu_osobite');
2.
Je'eli partial znajduje si) w katalogu templates innego modu#u, do#$czysz
go za pomoc$ instrukcji
include_partial('nazwa_modu"u/menu_osobiste')
3.
Je'eli partial znajduje si) w katalogu templates ca#ej aplikacji, do#$czysz
go za pomoc$ instrukcji
include_partial('global/menu_osobiste')
Zagadnienie omówione powy'ej sprawdzisz, wykonuj$c kolejne (wiczenie.
(wiczenie 4.11
W module
elementy_widoku
utwórz pust$ akcj) zamówienia. Do widoku akcji do#$cz
partial
oferta
. Partial wy*wietli ofert) w formie listy.
Rozwi4zanie
Zacznij od przygotowa/ wst)pnych. Po pierwsze, utwórz akcj)
zamowienia
oraz widok
zamowieniaSuccess
. Po drugie, ustaw dla widoku akcji layout
wizytowki_dolaczanie
.
Po trzecie, wyczy*( pami)( podr)czn$ i sprawdY, czy widok akcji dekorowany jest
odpowiednim layoutem.
PrzejdY do katalogu <nazwa_projektu>/apps/widok/modules/elementy_widoku/templates.
Utwórz nowy plik i nazwij go _oferta.php. W pliku umie*( kod przedstawiony na listingu:
<ul>
<li>wizytówki</li>
<li>kalendarze</li>
<li>prospekty</li>
</ul>
Jak widzisz, kod zawiera standardow$ list) HTML.
W kolejnym kroku musisz wprowadzi( zawarto*( do pliku zamowieniaSuccess.php.
Przyk#adowy kod przedstawiony jest poni'ej:
<p class="header">
Zamówienia indywidualne
<?php echo image_tag('wizytowki/ul_dot.gif', 'class="fl"') ?>
Rok 2006
</p>
<p class="hr"></p>
<p>Tre%& akcji</p>
<p>Tre%& akcji</p>
<p>Tre%& akcji</p>
<p>Tre%& akcji</p>
<p>Tre%& akcji</p>
<?php include_partial('oferta'); ?>
Rozdzia 4. Warstwa widoku
131
W widoku akcji u'y#e* instrukcji
include_partial
. Przyjmuje ona jeden argument o war-
to*ci oferta. W ten sposób lista zostanie dodana do ogólnego wyniku. Ale czy aby na
pewno? W przegl$darce wywo#aj '$danie:
http://127.0.0.1/widok.php/elementy_widoku/zamowienia
Niestety, widoczny rezultat jest daleki od oczekiwanego. Co wi)c posz#o nie tak? Otó'
'eby zobaczy( dane produkowane w widoku akcji, nale'y na to przygotowa( layout.
W tym celu otwórz go do edycji i znajdY znacznik:
<div class="content">
Usu/ ca#$ zwarto*( znacznika. Teraz musisz doda( instrukcj) wy*wietlaj$c$ dane z akcji.
Poni'ej znajduje si) kod, który wykona to zadanie:
<div class="content">
<?php echo $sf_data->getRaw('sf_content'); ?>
</div>
Zwró( uwag) na obiekt
$sf_data
, który przechowuje rozmaite dane. Mo'na je pobiera(,
u'ywaj$c metody
getRaw
. Przyjmuje ona jako parametr warto*( identyfikuj$c$ dane,
które chcemy pobra(. Je'eli u'yjesz
sf_content
, pobierzesz kod HTML wyprodukowany
przez widok akcji.
Teraz mo'esz ju' od*wie'y( okno przegl$darki. Wynik akcji powinien by( taki jak na
rysunku 4.3. Zawiera on widok akcji z kodem partiala opakowany w layout. O to w#a*nie
chodzi#o.
Rysunek 4.3. Dekorowanie wyniku akcji layoutem
Przekazywanie parametrów do partiala
Niew$tpliwie olbrzymi$ zalet$ partiali jest mo'liwo*( przekazywania dla nich parame-
trów. W jaki sposób mo'na to zrobi(? Nale'y u'y( drugiego parametru, wywo#uj$c
include_partial
. Wi)cej dowiesz si) z kolejnego przyk#adu.
(wiczenie 4.12
Utwórz partial
lista
. Jako parametr przyjmuje on tablic) elementów, jakie nale'y umie-
*ci( na li*cie.
132
PHP5. Programowanie z wykorzystaniem Symfony, CakePHP, Zend Framework
Rozwi4zanie
Zadanie, które musisz teraz wykona(, jest nieco bardziej z#o'one ni' poprzednie. Postaram
si) jednak, aby nie sprawi#o Ci zbyt du'ych trudno*ci. Zacznij od utworzenia w kata-
logu templates pustego pliku _lista.php. Poni'ej znajdziesz przyk#adowy kod partiala:
<ul>
<?php foreach( $aTablicaElementow as $sElement): ?>
<li><?php echo $sElement; ?></li>
<?php endforeach; ?>
</ul>
W pierwszej chwili Twoj$ uwag) mo'e przyku( dziwna konstrukcja
foreach
. W przy-
k#adzie u'y#em alternatywnej sk#adni, która jest bardzo wygodna na u'ytek szablonów.
Pozwala #atwo oddzieli( kod HTML od kodu PHP. Wi)cej na ten temat znajdziesz
na stronie http://php.net.pl/manual/pl/control-structures.alternative-syntax.php.
Skup si) teraz na tym, co jest istot$ (wiczenia. W p)tli foreach wykorzysta#e* zmienn$
$aTablicaElementow
. Sk$d ona si) tam wzi)#a? Najpro*ciej rzecz ujmuj$c, zmienna
zosta#a przekazana jako parametr funkcji
include_partial
. [atwo zauwa'ysz, 'e
wewn$trz partiala nie trzeba u'ywa( 'adnej specjalnej konstrukcji.
W kolejnym kroku musisz przygotowa( dane dla partiala. PrzejdY do akcji
zamowienia
i dodaj do niej nast)puj$cy kod:
$this->aOferta = array(
'wizytówki',
'kalendarze',
'prospekty'
);
Powy'szy kod jest niczym wi)cej jak tablic$ zawieraj$c$ elementy o warto*ci:
wizytówki
,
kalendarze
i
prospekty
. Zwró( uwag) na to, 'e tablica b)dzie w widoku akcji dost)pna
pod nazw$
$aOferta
.
Nadszed# czas na wypróbowanie mo'liwo*ci partiala. Dodaj na ko/cu widoku
zamowie
niaSuccess
kod przedstawiony na listingu:
<p class="hr"></p>
<?php include_partial( 'lista', array( 'aTablicaElementow' => $aOferta) ); ?>
Jak widzisz, parametry do partiala przekazywane s$ za pomoc$ tablicy asocjacyjnej.
Bardzo wa'ne jest, 'eby* zapami)ta#, 'e indeks w tablicy asocjacyjnej jest nazw$
zmiennej w partialu. Innymi s#owy, tablica
$aOferta
b)dzie w partialu dost)pna pod
nazw$
aTablicaElementow
.
Na koniec od*wie' '$danie w oknie przegl$darki. Je'eli wszystko wykona#e* popraw-
nie, na ekranie zobaczysz list) wygl$daj$c$ tak samo jak wygenerowana przez partial
oferta
. Zasadnicza ró'nica polega na tym, 'e partial
lista
mo'e generowa( dowolnie
wiele ró'nych list, podczas gdy partial
oferta
zawsze b)dzie taki sam.
Rozdzia 4. Warstwa widoku
133
Krótkie podsumowanie
W dwóch ostatnich (wiczeniach pozna#e* ju' nieco partiale. Spróbuj) krótko podsumo-
wa( najwa'niejsze aspekty omawianych zagadnie/:
Partiale mo'na do#$cza( do dowolnego widoku akcji. Z tego wzgl)du nie mog$
one bezpo*rednio korzysta( ze zmiennych widoków.
Zmienne potrzebne w partialach nale'y przekazywa( za pomoc$ tablicy
parametrów.
Ka'dy partial ma w#asn$ przestrze/ nazw, wi)c nie musimy si) martwi( o nazwy
zmiennych.
Mechanizmy pami)ci podr)cznej Symfony potrafi$ wykrywa( partiale.
St$d wynika, 'e potrafi$ równie' zapisywa( je w keszu.
Parametry dla partiala przekazywane s$ w postaci tablicy asocjacyjnej. Dost)p
do nich uzyskujemy jednak tak jak przy zmiennej skalarnej. Nazwa zmiennej
skalarnej jest taka jak nazwa indeksu w tablicy.
Komponenty
Na pocz$tku podrozdzia#u warto zada( pytanie: Czym s$ komponenty? Kiedy* us#ysza#em
dosy( ciekaw$ definicj): „komponent to taki troch) m$drzejszy partial”. W tak przed-
stawionej definicji jest sporo prawdy, poniewa' komponentu u'ywa si) wtedy, kiedy
partial wymaga pewnej logiki. Zapami)taj wi)c bardzo wa'n$ regu#): je=eli partial robi
si@ zbyt zAo=ony i zawiera pewne elementy logiki, musisz przeksztaAciE go w kom-
ponent. W tej cz)*ci nauczysz si), jak to zrobi(!
Komponent w Symfony jest bardzo podobny do akcji. Zasadnicza ró'nica polega na
szybko*ci dzia#ania. Komponenty s$ znacznie szybsze, co jest dodatkowym argumentem
przemawiaj$cym za tym, aby rozwa'y( ich u'ycie tam, gdzie jest taka mo'liwo*(. Zanim
przejdziemy dalej, musisz pozna( kilka konwencji:
Nazwa pliku zawieraj$cego komponenty to components.class.php. Plik musi
by( zapisany w katalogu actions.
Klas$ bazow$ dla komponentów jest klasa
sfComponents
.
Metoda zawieraj$ca kod komponentu nazywana jest wed#ug schematu
executeNazwaKomponentu
.
Komponent musi by( po#$czony z partialem, który odpowiada za jego
wizualizacj). Plik partiala nazywamy wed#ug schematu _NazwaKomponentu.php.
Komponenty
mo+emy
umieszcza0
w oddzielnych plikach. Zasady s6 takie same jak
dla pojedynczych akcji.
134
PHP5. Programowanie z wykorzystaniem Symfony, CakePHP, Zend Framework
(wiczenie 4.13
Utwórz komponent, którego zadanie b)dzie polega#o na wy*wietlaniu losowej sentencji.
Rozwi4zanie
W katalogu actions (modu#u
elementy_widoku
) utwórz pusty plik sentencjeComponent.
class.php. Poni'ej listing zawarto*ci pliku:
class sentencjeComponent extends sfComponent {
public function execute() {
$aSentencje = array(
'Chciano za szcz2%ciem rozpisa& listy goNcze, ale nikt nie umia" poda& rysopisu.
Wies"aw BrudziNski',
'Nie ma wi2kszej rado%ci dla g"upiego, jak znaleX& g"upszego od siebie.
Aleksander Fredro',
'Nie mo3esz i%& do przodu, patrzLc w ty". Kostis Palamas',
'Yycie jest jak tramwaj, nadmiar baga3u utrudnia ci jazd2. Antoni
Uniechowski',
'Nie wierzcie zegarom, czas wymy%li" je dla zabawy. Wojciech Bartoszewski',
'W 3yciu mo3na liczy& tylko na siebie, ale i tego nie radz2. Tristan Bernard'
);
$iLosowa = rand(0, count($aSentencje) - 1);
$this->sSentencjaNaDzis = $aSentencje[$iLosowa];
}
}
Analiz) przyk#adu rozpocznij od nag#ówka klasy. Zosta#a ona nazwana
sentencjeCompo
nent
i wyprowadzona z klasy
sfComponent
(klasa bazowa dla pojedynczych akcji).
Symfony wymusza na Tobie stosowanie odpowiednich konwencji. Je'eli chcesz utwo-
rzy( pojedynczy komponent sentencje, musisz zapisa( go w pliku o nazwie sencje
Component.class.php, klas) za* musisz nazwa(
sentencjeComponent
.
Dalsza cz)*( kodu jest raczej #atwa do zrozumienia. Tworzysz tablic) sentencji. Nast)pnie
losujesz numerek dla sentencji, któr$ nale'y pokaza( w widoku. Wylosowan$ sentencj)
przypisujesz do zmiennej, która w widoku b)dzie dost)pna pod nazw$
$sSentencjaNa
Dzis
. Warto zauwa'y( w tym miejscu, 'e w normalnych warunkach sentencja mog#aby
by( losowana z bazy danych.
W kolejnym kroku musisz utworzy( partial, który b)dzie powi$zany z komponentem.
Zadanie jest naprawd) proste. W katalogu templates utwórz plik o nazwie _sentencje.php.
Poni'ej znajdziesz jego zawarto*(:
<div><?php echo $sSentencjaNaDzis?></div>
Prawda, 'e proste?! Powy'szy kod wymaga tylko jednego komentarza. W tego typu
partialach mo'liwy jest dost)p do zmiennych komponentu — oczywi*cie do zmiennych
poprzedzonych
$this
. Czy nie jest to znajome? Otó', komponent do swojego partiala
ma si) tak jak akcja do swojego widoku.
Rozdzia 4. Warstwa widoku
135
Ostatnie zadanie polega na wywo#aniu komponentu w szablonie
zamowieniaSuccess
.
Pocz$tkowy kod:
<p class="header">
Zamówienia indywidualne
<?php echo image_tag('wizytowki/ul_dot.gif', 'class="fl"') ?>
Rok 2006
</p>
musisz zast$pi( poni'szym:
<p class="header">
<?php include_component( 'elementy_widoku', 'sentencje' ); ?>
</p>
Za pomoc$ instrukcji
include_component
do#$czamy do szablonu kod wygenerowany
przez komponent. Zwró( uwag) na to, 'e
include_component
wymaga dwóch argumen-
tów. Pierwszy jest nazw$ modu#u, w którym zapisany jest komponent, drugi za* nazw$
komponentu, który nale'y do#$czy(.
Na koniec przejdY do przegl$darki i od*wie' kilka razy zawarto*( okna. Sentencja na
pocz$tku okna z tre*ci$ powinna si) losowo zmienia(.
Komponent to m6drzejsza wersja partiala, wi:c mo+esz równie+ do niego przekazywa0
parametry za pomoc6 tablicy. Nale+y j6 przekaza0 do funkcji include_component
jako ostatni argument. Ka+da zmienna przekazana w ten sposób dost:pna jest
poprzez
$this->{nazwa_zmiennej}
.
Krótkie podsumowanie
Na pocz$tku komponenty mog$ Ci si) wyda( nieco dziwne. Zapewniam jednak, 'e po
krótkim czasie korzystania z nich docenisz ich zalety. Poni'ej znajdziesz kilka bardzo
wa'nych regu# dotycz$cych komponentów:
Komponent dodawany jest za pomoc$ instrukcji
include_component
. Wymaga
ona dwóch parametrów: nazwy modu#u i nazwy komponentu.
Zachowanie konwencji nazewniczej pozwala komponentowi u'y( w#a*ciwego
partiala do wizualizacji wyników.
Do partiala zwi$zanego z komponentem mo'na przekazywa( parametry
za pomoc$
$this
.
Komponent ma dost)p do tych samych obiektów globalnych co akcja.
Komponenty nie maj$ sekcji bezpiecze/stwa oraz metod walidacji (jest to powód
ich szybko*ci).
Komponenty nie mog$ by( wywo#ywane za pomoc$ '$dania, a jedynie przez
aplikacje (w przeciwie/stwie do akcji).
136
PHP5. Programowanie z wykorzystaniem Symfony, CakePHP, Zend Framework
We wszystkich przyk adach prezentowanych w poprzedniej cz:Bci rozdzia u stosowa-
eB
include_partial lub include_component. Dzia anie ich powoduje wys anie na
wyjBcie kodu partiala lub komponentu. Nie zawsze takie zachowanie jest po+6dane.
WyobraE sobie sytuacj:, w której partial odpowiada za wygenerowanie formularza.
W dalszej cz:Bci formularz mo+e by0 umieszczony w jednym z kilku specjalnie do
tego wystylizowanych elementów strony (element szukaj, logowanie itp.). Wynika st6d,
+e formularz nie powinien by0 od razu wysy any na wyjBcie, tylko przechowywany
w jakiejB zmiennej do czasu, kiedy aplikacja podejmie decyzj:, w którym elemencie
strony nale+y go umieBci0. Mam nadziej:, +e jest to dla Ciebie zrozumia e.
Alternatyw6 dla u+ywania
include_partial i include_component s6 funkcje get_
partial i get_component. Nie powoduj6 one wysy ania na wyjBcie kodu utworzo-
nego przez partial. Zamiast tego zwracaj6 kod jako wyjBcie funkcji.
Sloty
Przypomnij sobie sytuacj), kiedy w jednym z (wicze/ nie wida( by#o tre*ci akcji w lay-
oucie. Pozna#e* wówczas obiekt
$sf_data
oraz jego metod)
getRaw
. Metoda ta wymaga
jednego parametru, który okre*la, jakie dane chcesz wy*wietli(. Co jednak w sytuacji,
kiedy takich miejsc na stronie jest wi)cej?
Koncepcja slotów pozwala zafiksowa( w layoucie pewne miejsca i przypisa( do nich
nazw). Dane produkowane przez akcje mog$ by( przekazywane do jednego z takich
miejsc (slotu). Poniewa' ka'dy slot ma w#asn$, unikatow$ nazw), dane zawsze trafi$ we
w#a*ciwe miejsce.
Mo'esz traktowa( slot jako pewn$ zmienn$ globaln$, dla której dane generowane s$ przez
partiale i komponenty. Warto*( przeznaczona dla slotu utrzymywana jest globalnie, wi)c
mo'e by( okre*lana w dowolnym elemencie widoku. Przy czym wa'ne jest, 'eby pami)-
ta( o tym, 'e:
layout jest generowany na ko/cu (wzorzec dekoratora),
partiale i komponenty wykonywane s$ w miejscach, w których si) do nich
odwo#ujemy.
Z powy'szych punktów wynika, 'e layout zawsze otrzymuje dla slotów najbardziej
aktualne dane.
(wiczenie 4.14
Utwórz modu# o nazwie
sloty
oraz layout o nazwie
wizytowki_sloty
. Layout musi by(
domy*lny dla ca#ego modu#u. Ponadto dodaj do layoutu dwa sloty: na tre*( oraz na pasek
nawigacyjny. Dzia#anie slotów przetestuj za pomoc$ akcji
zamowienie
.
Rozdzia 4. Warstwa widoku
137
Rozwi4zanie
Utworzenie modu#u oraz layoutu pozostawiam Tobie jako (wiczenie powtórzeniowe.
Równie' konfiguracj) domy*lnego layoutu potraktuj jako od*wie'enie wcze*niej pozna-
nych wiadomo*ci.
Zacznij od dodania do nowego layoutu wymaganych slotów. Odszukaj w kodzie linijk):
<p class="bc"><a href="">Strona g"ówna</a> / <a href="">Zamówienia indywidualne</
a> / <a href="">Rok 2006</a></p>
i zamie/ j$ na:
<p class="bc">
<?php include_slot( 'nawigator' ); ?>
</p>
W ten sposób umie*ci#e* w layoucie slot o nazwie
nawigator
. W dalszej cz)*ci dowiesz
si), w jaki sposób akcje mog$ umieszcza( w tym slocie swoje dane.
Kolej na drugi slot. ZnajdY kod:
<?php echo $sf_data->getRaw('sf_content'); ?>
i zamie/ go na:
<?php include_slot( 'tresc_akcji' ); ?>
Teraz musisz sprawdzi(, czy sloty dzia#aj$. W tym celu utwórz w module
slot
akcj)
o nazwie
zamowienia
. Umie*( w jej widoku poni'szy kod:
<p class="header">
<?php include_component( 'elementy_widoku', 'sentencje' ); ?>
</p>
<p class="hr"></p>
<p>Tre%& akcji</p>
<p>Tre%& akcji</p>
<p>Tre%& akcji</p>
<p>Tre%& akcji</p>
<p>Tre%& akcji</p>
<?php include_partial('elementy_widoku/oferta'); ?>
<p class="hr"></p>
<?php
include_partial( 'elementy_widoku/lista', array( 'aTablicaElementow' => $aOferta) );
?>
Zwró( uwag) na sposób wykorzystania partiala napisanego w cz)*ci modu#u
elementy_
widoku
. Zgodnie z tym, co mog#e* przeczyta( wcze*niej, nazw) modu#u podajemy przed
nazw$ partiala. Ponadto do partiala przekazywany jest parametr
aTablicaElementow
.
Zwró( uwag), 'e zmienna
$aOferta
, jak$ jest on inicjalizowany, nie istnieje. Z tego
powodu dodaj do akcji
zamowienia
poni'szy kod:
$this->aOferta = array(
'wizytówki',
'kalendarze',
'prospekty'
);
138
PHP5. Programowanie z wykorzystaniem Symfony, CakePHP, Zend Framework
Teraz mo'esz ju' wywo#a( '$danie, wprowadzaj$c do przegl$darki adres:
http://127.0.0.1/widok.php/sloty/zamowienia
Jaki to daje efekt? Daleki od oczekiwanego. Co wi)c jest nie tak? Otó' doda#e* do
layoutu sloty, ale nie umie*ci#e* o tym w akcji ani s#owa. Teraz musisz to zmieni(.
W pierwszej linijce widoku
zamowieniaSuccess
dodaj instrukcj):
<?php slot('tresc_akcji'); ?>
Instrukcja informuje Symfony, 'e wszystkie dane od tej pory nale'$ do slotu o nazwie
tresc_akcji
. W ostatniej linijce widoku dodaj:
<?php end_slot(); ?>
Ta instrukcja informuje Symfony, 'e zapisywanie danych do slotu nale'y zako/czy(.
Spróbuj ponownie uruchomi( '$danie. I jak posz#o tym razem? Lepiej? O wiele! Brakuje
jednak jeszcze jednego elementu. Paska nawigacyjnego. Na pocz$tku widoku akcji dodaj
poni'szy kod:
<?php slot('nawigator'); ?>
<a href="">Strona g"ówna</a> /
<a href="">Zamówienia indywidualne</a> /
<a href="">Rok 2006</a>
<?php end_slot(); ?>
Jak widzisz, kod zaczyna si) od informacji, 'e rozpoczynaj$ si) dane przeznaczone dla
slotu
nawigator
. Potem nast)puje kilka znaczników hiper#$czy, po nich za* informacja,
'e s$ to ju' wszystkie dane dla slotu. Od*wie' stron) i zobacz, czy dane umieszczone s$
we w#a*ciwym miejscu. Bingo!
Na koniec rzu( okiem na ca#e (wiczenie. Pozna#e* w nim kilka bardzo wa'nych tajników
Symfony. Po pierwsze, layout mo'e zawiera( wiele slotów. Po drugie, w widoku akcji
mo'esz przesy#a( dane do tylu slotów, ilu wymaga funkcjonalno*( serwisu.
Co si) dzieje z poleceniami HTML/PHP wywo#ywanymi w widoku poza obszarem dzia-
#ania slotu? Po wywo#aniu '$dania nigdy nie b)d$ one widoczne. Potraktuj to jako (wi-
czenie do samodzielnego wykonania.
Krótkie podsumowanie
Pracuj$c ze slotami, musisz pami)ta( o kilku bardzo istotnych rzeczach. Oto najwa'niej-
sze z nich:
Dane do slotów mo'na przekazywa( z ka'dego elementu widoku (komponent,
partial, szablon).
Kod wykonywany mi)dzy pomocnikami slotu (
slot
,
end_slot
) ma dost)p do tych
samych zmiennych, co element pisz$cy do slotu.
Wynik slotu umieszczany jest automatycznie w obiekcie odpowiedzi (
response
)
i nie jest pokazywany w szablonie.
Rozdzia 4. Warstwa widoku
139
Wy*wietlanie zwarto*ci slotu nast)puje dopiero podczas wywo#ania funkcji
include_slot
, zawieraj$cej jego nazw).
Zapami)taj te regu#y, poniewa' u#atwi$ Ci programowanie w Symfony.
Konfiguracja
Tworzenie szablonów widoków uwzgl)dnia fakt, 'e graficy zwykle nie znaj$ j)zyków
programowania. Z tego wzgl)du projektanci Symfony wydzielili folder template na
wszystkie pliki prezentuj$ce dane. Przyk#adowa struktura aplikacji wygl$da wi)c jak
na listingu:
projekt/
apps/
aplikacja/
templates/ //layouty dla aplikacji
modules/
modu"1/
templates/ //elementy widoku dla moduLu 1
modu"2/
templates/ //elementy widoku dla moduLu 2
modu"3/
templates/ //elementy widoku dla moduLu 3
Wszystkie elementy widoku mo'na sklasyfikowa( w dwóch grupach: te, które generuj$
cz)*( prezentacyjn$, oraz pozosta#e. Do pozosta#ych zalicza si) znaczniki meta, tytu#
strony, pliki css, pliki js itp. Elementy nale'$ce do tej grupy mo'esz bez problemu kon-
figurowa( za pomoc$ plików view.yml oraz obiektu odpowiedzi (jest instancj$ klasy
sfWebResponse
). W tej sekcji poznasz obie metody.
Pliki view.yml
Aplikacja oraz modu#y mog$ posiada( w#asny plik view.yml. Plik konfiguracyjny dla
aplikacji tworzony jest automatycznie, pliki za* konfiguracyjne dla modu#ów musisz
utworzy( r)cznie, je*li ich potrzebujesz. Zwró( uwag) na to, 'e ka'dy modu# zawiera
pusty katalog config. Katalog ten jest w#a*ciwym miejscem dla pliku view.yml okre*la-
j$cego parametry dla modu#u. Poni'ej ogólny schemat pliku:
akcja1Success:
opcja1: warto%&1
opcja2: warto%&2
akcja2Success:
opcja1: warto%&1
opcja2: warto%&2
akcja1Error:
opcja1: warto%&1
140
PHP5. Programowanie z wykorzystaniem Symfony, CakePHP, Zend Framework
Na powy'szym schemacie mo'esz zauwa'y( kilka istotnych prawid#owo*ci. Po pierwsze,
parametry konfiguracyjne okre*la si) dla konkretnego szablonu widoku. Po drugie,
konfigurowa( mo'esz dowolne typy szablonów. Nie ma znaczenia, czy jest to widok suk-
cesu, b#)du, czy mo'e te' jaki* inny.
O czym jeszcze warto wiedzie(? Je'eli chcesz ustawi( pewien parametr dla wszystkich
szablonów w module, mo'esz u'y( sekcji
all
. Wygl$da to mniej wi)cej tak:
all:
parametr: warto%&
Jako przyk#ad wykonaj nast)pne (wiczenie.
(wiczenie 4.15
Dla wszystkich widoków w module
sloty
zmie/ tytu# strony na Sloty Wizytówki.
Rozwi4zanie
Otwórz do edycji plik view.yml zapisany w katalogu config nale'$cym do modu#u
sloty
.
Do sekcji all dodaj poni'sze linijki:
metas:
title: Sloty Wizytówki
Pami)taj o spacjach oraz o wyczyszczeniu keszu. Przetestuj wynik w przegl$darce.
Kaskada plików konfiguracyjnych
Jak widzisz, plików konfiguracyjnych mo'e by( w jednej aplikacji ca#kiem sporo.
Zasadne jest wi)c pytanie, jaki b)dzie efekt, je'eli ta sama opcja zostanie zadeklaro-
wana w ró'nych miejscach? -eby to zrozumie(, musisz wiedzie(, w jakiej kolejno*ci
Symfony przetwarza pliki oraz dyrektywy.
1.
Wczytywany jest plik z katalogu config dla ca#ej aplikacji.
2.
Wczytywany jest plik z katalogu config umieszczonego w module.
3.
Sekcja
all
dla modu#u nadpisuje ustawienia z aplikacji.
4.
Sekcje dla widoków w pliku modu#u nadpisuj$ wcze*niej ustawione warto*ci
w pliku aplikacji oraz sekcji
all
.
Regu#y s$ wi)c jasne. Je'eli masz jeszcze jakie* w$tpliwo*ci, przeczytaj poni'szy
przyk#ad.
Za#ó'my, 'e masz dwa pliki konfiguracyjne: jeden dla aplikacji i jeden dla modu#u. Plik
dla aplikacji zawiera poni'sze dyrektywy:
default:
metas:
title: Superwizytówki na ka3dL kieszeN
description: Tanie wizytówki dla firm.
Rozdzia 4. Warstwa widoku
141
keywords: wizytówki, tanie wizytówki
language: pl
Plik modu#u równie' okre*la cz)*( tych samych dyrektyw i jest przedstawiony poni'ej:
all:
metas:
title: Wizytówki dla Ciebie
description: Wizytówki na ka3dL okazj2.
ofertaSuccess:
metas:
title: Wizytówki w naszej ofercie
Pytanie, które nale'y teraz zada(, brzmi: jakie b)d$ warto*ci parametrów
title
,
descrip
tion
oraz
language
dla widoku akcji
oferta
? Na pocz$tek przyjrzyj si) parametrowi
title
. Okre*lasz warto*( dla aplikacji, która nast)pnie zostaje nadpisana przez warto*(
podan$ w sekcji
all
modu#u. Na koniec dyrektywa jest jeszcze nadpisana przez para-
metry okre*lone dla widoku
ofertaSuccess
. Wniosek nie mo'e by( inny: warto*( para-
metru
title
jest równa
"Wizytówki w naszej ofercie"
.
Tak$ sam$ analiz) przeprowadY teraz dla dyrektywy
description
. Aplikacja ustawia
dla niej warto*(
"Tanie wizytówki dla firm."
. Nast)pnie warto*( nadpisywana jest przez
modu#. Poniewa' w sekcji
ofertaSuccess
nie okre*lono warto*ci dla description, war-
to*( ko/cowa parametru jest równa
"Wizytówki na ka3dL okazj2."
.
Na koniec parametr
language
. Jest on ustawiany tylko przez aplikacj), wi)c jego war-
to*( we wszystkich widokach modu#u jest równa
pl
. Równie' w widoku akcji
oferta
.
Obiekt Response
Podstawowa ró'nica mi)dzy plikiem view.yml a obiektem odpowiedzi jest taka, 'e
obiektu mo'na u'ywa( w akcjach. Czasami u#atwia to znacznie proces konfiguracji
oraz zdecydowanie rozszerza jej mo'liwo*ci.
Na co pozwala obiekt odpowiedzi? Zastosowa/ ma bardzo wiele. Za jego pomoc$
mo'esz zmieni( tytu# strony, zawarto*( znaczników meta, ustawi( ciasteczka itp. Poznasz
go lepiej, realizuj$c kolejne zadania.
Na pocz$tek utwórz w aplikacji
widok
modu#
response
. Wy#$cz dekorowanie layoutem
dla wszystkich szablonów widoku w module.
(wiczenie 4.16
Utwórz akcj)
ciasteczko
. Zadaniem akcji jest przes#anie do klienta ciasteczka
moje_
ciasteczko
. Nast)pnie sprawdY za pomoc$ akcji
pobierzCiasteczko
, czy operacja
zosta#a wykonana poprawnie.
Rozwi4zanie
Zacznij od akcji
ciasteczko
. Poni'ej znajdziesz przyk#adowy kod:
142
PHP5. Programowanie z wykorzystaniem Symfony, CakePHP, Zend Framework
public function executeCiasteczko() {
$oResponse = $this->getResponse();
$oResponse->setCookie('moje_ciasteczko','szarlotka_babci', time()+3600);
return sfView::HEADER_ONLY;
}
Na pocz$tku pobierasz referencj) do obiektu
Response
. Za pomoc$ metody
setCookie
ustawiasz nazw) ciasteczka, jego warto*( oraz termin wa'no*ci. Na koniec informujesz,
'e akcja przesy#a jedynie nag#ówki i nie potrzebuje widoku.
Kolej na pobieranie ciasteczka. WprowadY do pliku akcji poni'szy kod:
public function executePobierzCiasteczko() {
$this->sCiasteczko = $this->getRequest()->getCookie('moje_ciasteczko');
}
Ciasteczko przesy#ane jest przez przegl$dark) w '$daniu klienta. Z tego wzgl)du dost)p
do niego uzyskujesz za pomoc$ obiektu '$dania (
Request
). Jak widzisz, wystarczy jedy-
nie skorzysta( z metody
getCookie
i po sprawie.
Musisz ju' tylko utworzy( widok dla akcji
pobierzCiasteczko
. Mo'e on wygl$da( jak
na listingu poni'ej:
<?php
echo 'pyszne to ',$sCiasteczko,'<br />';
?>
Jak widzisz, jest on bardzo prosty.
Na koniec musisz wykona( testy. W tym celu wywo#aj '$danie:
http://127.0.0.1/widok.php/response/ciasteczko
Nast)pnie sprawdY wynik dzia#ania pod adresem:
http://127.0.0.1/widok.php/response/pobierzCiasteczko
Na ekranie powiniene* zobaczy( warto*( ciasteczka.
Pami:taj, +e ciasteczko nie jest widoczne w +6daniu, które wywo uje metod:
set
Cookie. To +6danie przesy a do przegl6darki informacj:, +e nale+y je utworzy0.
Dopiero przy kolejnym +6daniu przegl6darka uwzgl:dni ciasteczko i przeBle je do
serwera.
Sterowanie sekcj% meta poprzez obiekt odpowiedzi
Obiekt odpowiedzi umo'liwia równie' dodawanie wpisów dla sekcji meta. Takie podej-
*cie ma co najmniej dwie zalety. Po pierwsze, nie wymaga czyszczenia pami)ci podr)cz-
nej. Po drugie, konfiguracj) okre*lasz za jednym zamachem dla wszystkich widoków
akcji. Mo'e by( to bardzo przydatne.
Rozdzia 4. Warstwa widoku
143
(wiczenie 4.17
Utwórz akcj)
meta
(pami)taj o pustym widoku). Dla akcji ustaw layout
wizytowki_sloty
oraz okre*l wszystkie dodatkowe parametr takie jak pliki CSS, tytu# itp.
Rozwi4zanie
Zadanie musisz zrealizowa(, korzystaj$c z klasy
sfWebResponse
. Poni'ej proponowany
kod akcji:
public function executeMeta() {
$this->setLayout('wizytowki_sloty');
$oResponse = $this->getResponse();
$oResponse->addMeta('robots', 'NONE');
$oResponse->addMeta('keywords', 'wizytówki');
$oResponse->setTitle('Wizytówki na ka3dL kieszeN');
$oResponse->addStyleSheet('wizytowki.css');
$oResponse->addJavaScript('brak.js');
}
Na pocz$tku za pomoc$
setLayout
okre*lasz, jak powinien by( dekorowany kod akcji.
W nast)pnych instrukcjach pobierasz referencj) do obiektu odpowiedzi i przy jej u'yciu
okre*lasz s#owa kluczowe (keywords), sposób indeksacji strony w wyszukiwarkach
(robots), tutu# oraz dodajesz pliki zewn)trzne: wizytowki.css i brak.js.
Wpisz w pasku adresu tekst:
http://127.0.0.1/widok.php/response/meta
Je'eli na ekranie pojawi si) layout, oznacza to, 'e zadanie wykona#e* poprawnie.
O czym musisz jeszcze wiedzie(? Metody obiektu odpowiedzi nadpisuj$ ustawienia
plików konfiguracyjnych. Nag#ówki odpowiedzi (na przyk#ad ciasteczka) s$ przysy#ane
tak póYno, jak to tylko mo'liwe.
Wszystkie metody
set maj6 swoje odpowiedniki get. Zwracaj6 one bie+6c6 wartoB0
danego elementu.
Pliki zewn7trzne
Praktycznie ka'da strona korzysta z zewn)trznych plików CSS. Niektóre strony (jest ich
coraz wi)cej) korzystaj$ z plików JS. Musisz wi)c wiedzie(, jak poradzi( sobie w sytu-
acji, kiedy takie pliki trzeba do#$czy( do stron projektu.
Na pocz$tek utwórz w akcji
widok
modu# o nazwie
pliki_zewnetrzne
. W tym module
b)dziesz wykonywa# wszystkie bie'$ce (wiczenia.
144
PHP5. Programowanie z wykorzystaniem Symfony, CakePHP, Zend Framework
Pliki CSS i JS
Na pocz$tek proponuj) krótkie przypomnienie. We wcze*niejszych sekcjach tego roz-
dzia#u do#$czy#e* do wyniku pliki CSS za pomoc$ pliku view.yml (sekcja
stylesheets
)
oraz obiektu
Response
. W jednym z ostatnich przyk#adów do#$cza#e* równie' pliki JS.
Ró'nica w do#$czaniu polega jedynie na tym, 'e dla plików JavaScript u'ywasz sekcji
javascripts
oraz metody
addJavaScript
.
Pami:taj, +e pliki ze stylami i skryptami musz6 by0 dost:pne publicznie. Z tego
wzgl:du musisz je umieszcza0 w katalogu web/css oraz web/js.
Do#$czanie plików nie jest jedynym zadaniem, przed jakim staniesz, realizuj$c komer-
cyjne projekty. Bardzo cz)sto b)dziesz musia# pewne pliki usun$( po to, 'eby nie koli-
dowa#y z innymi. Do takich kolizji mo'emy zaliczy( nadpisywanie regu# CSS, zadekla-
rowanie funkcji o tej samej nazwie itp.
Przyjrzyj si) poni'szemu plikowi view.yml:
all:
layout: sezonowy_slot
stylesheets: [wizytowki, s1, s2, s3, s4]
Wszystkie akcje w module b)d$ dekorowane layoutem
sezonowy_slot
. Ponadto do
wyniku zostan$ do#$czone cztery pliki CSS o nazwach wizytowki, s1, s2, s3 i s4. Na
razie wszystko jest w jak najlepszym porz$dku. Za#ó'my jednak, 'e w module jest
akcja o nazwie
specjalna
, która potrzebuje dodatkowego pliku s5. Niestety, plik ten
koliduje z plikami s1 i s3. Co w takim wypadku nale'a#oby zrobi(? Zerknij na poni'sz$
konfiguracj):
all:
layout: sezonowy_slot
stylesheets: [wizytowki, s1, s2, s3, s4]
specjalnaSuccess:
stylesheets: [-s1, -s3, s5]
Okazuje si), 'e wykluczanie plików z widoku akcji nie jest zbyt trudne. Wystarczy przed
nazw$, któr$ chcesz wykluczy(, doda( znak minus.
Manipulowanie kolejno#ci% do %czanych plików
Z punktu widzenia regu# CSS kolejno*( plików ma ogromne znaczenie. Regu#y, które
wyst)puj$ w najdalej (wzgl)dem pocz$tku kodu) dodanych plikach nadpisuj$ te, które
by#y wcze*niej (poczytaj o kaskadzie stylów). Wychodz$c naprzeciw oczekiwaniom
u'ytkownika, Symfony dostarcza pewnych narz)dzi do manipulowania kolejno*ci$
plików.
Rozdzia 4. Warstwa widoku
145
(wiczenie 4.18
Dodaj do modu#u akcj)
kolejnosc_plikow
. Dla akcji wyklucz styl s1, dodaj na pocz$tek
listy plik pierwszy oraz na koniec plik ostatni.
Rozwi4zanie
Dopisz do pliku view.yml poni'sze dyrektywy:
kolejnoscPlikowSuccess:
stylesheets: [-s1, pierwszy: {position: first}, ostatni: {position: last}]
Wnioski powinny nasun$( Ci si) nasun$( same. Otó' po nazwie pliku mo'esz wpisa(
znak dwukropka. Oznacza on, 'e wyst$pi jeszcze sekcja opcji dla pliku. Sekcja zazna-
czana jest za pomoc$ nawiasów klamrowych. W obu sekcjach u'yto tylko jednej opcji
o nazwie
position
. Mo'e ona przyj$( dwa parametry:
first
— dodaj plik na pocz$tku listy,
last
— dodaj plik na ko/cu listy.
Nie jest to doskona#e narz)dzie i nadaje si) g#ównie do prostych przetasowa/. Bardzo
cz)sto, kiedy zmiany w kolejno*ci s$ znacz$ce, dodaj) do pliku konfiguracyjnego wpis
podobny do tego poni'ej:
stylesheets: [-*, pierwszy, wizytowki, s2, s3, s4, ostatni]
Za pomoc$ #a/cucha
-*
okre*lasz, 'e nale'y usun$( wszystkie pliki z listy, a nast)pnie
podajesz prawid#ow$ kolejno*( plików.
Okre#lanie medium
Musisz pami)ta(, 'e za#o'enia projektu mog$ przewidywa( stylizacj) strony dla wi)cej
ni' jednego medium. W takiej sytuacji nale'y utworzy( kilka plików CSS reprezentu-
j$cych za#o'one w projekcie media. W jaki sposób mo'esz potem w Symfony okre*li(,
który plik reprezentuje jakie medium? Wykonaj poni'sze (wiczenie.
(wiczenie 4.19
Z za#o'enia projektu wynika, 'e strona generowana przez akcj)
media
ma by( dost)pna
dla standardowego monitora, drukarki oraz palmtopa. Utwórz w pliku konfiguracyjnym
wpis, który pozwoli uzyska( ten efekt.
Rozwi4zanie
Otwórz do edycji plik view.yml i dodaj do niego poni'sze wpisy:
mediaSuccess:
stylesheets: [mon: {media: screen}, druk: {media: print}, palm: {media: palmtop} ]
Jak widzisz, w rozwi$zaniu równie' u'yto sekcji opcji. Tym razem potrzebna dyrektywa
to media. Wykorzysta#e* tutaj trzy warto*ci dla tego parametru:
146
PHP5. Programowanie z wykorzystaniem Symfony, CakePHP, Zend Framework
screen
— ekran monitora,
— drukark),
palmtop
— palmtop.
Uruchom akcj) w okienku przegl$darki, zajrzyj do kodu strony i upewnij si), 'e media
zosta#y poprawnie dodane. Pami)taj równie' o wyczyszczeniu pami)ci podr)cznej.
Komponenty slotowe
Komponent slotowy jest skrzy'owaniem slotu i komponentu. Pozwala on Tobie na pisanie
komponentów, które b)d$ automatycznie wstawiane w pewnym miejscu layoutu czy
te' innego elementu widoku. Jak do tej pory, brzmi znajomo. W zasadzie opisa#em dzia-
#anie komponentu. Jaka jest wi)c ró'nica mi)dzy komponentem i komponentem slo-
towym? Otó' komponent slotowy jest komponentem przypisanym do slotu. Mo'na go
w dowolny sposób konfigurowa(. WyobraY sobie tak$ sytuacj). Masz w aplikacji dwa
odr)bne modu#y. Ka'dy z nich posiada w#asne menu. Menu powinno pojawia( si) w tym
samym miejscu (zamiast poprzedniego). Móg#by* u'y( do wykonania zadania modu#u
i umie*ci( w nim logik) generuj$c$ poprawny kod. Móg#by* te' utworzy( slot i umiesz-
cza( w nim poprawne menu z poziomu szablonu. Oczywi*cie musia#by* to zrobi( w ka'-
dej akcji nale'$cej do modu#u. Jedno i drugie rozwi$zanie mnie nie zadowala. Wszystkie
pozosta#e równie' ;). W tym miejscu zdecydowanie najlepiej by#oby u'y( komponen-
tów slotowych. Mechanizm dzia#a mniej wi)cej tak. Tworzysz dwa komponenty menu.
Tworzysz komponentowy slot w layoucie. Na poziomie modu#u okre*lasz, który modu#
generuje kod dla slotu. Wi)cej wyja*nie/ w poni'szym (wiczeniu. Przed wykonaniem
(wiczenia utwórz modu#
komponent_slotowy
.
(wiczenie 4.20
Utwórz komponent slotowy o nazwie
menu_slotowe
. Nast)pnie utwórz dwa komponenty
o nazwach
menuProfil
i
menuZalogowany
. Je'eli u'ytkownik wywo#a akcj)
profil
, powi-
nien zobaczy( kod wygenerowany przez
menuProfil
. Z drugiej strony, je'eli u'ytkow-
nik wywo#a akcj)
zalogowany
, powinien zobaczy( kod wygenerowany przez
menuZa
logowany
.
Rozwi4zanie
Na pocz$tek sprawy zwi$zane z layoutem. Utwórz kopi) layoutu
wizytowki_sloty
i nazwij j$
wizytowki_komponent_slotowy
. Skonfiguruj ca#y modu#
komponent_slotowy
tak,
'eby korzysta# on z tego w#a*nie layoutu. Nast)pnie utwórz dwie puste akcje
profil
i
zalogowany
. Dla akcji utwórz równie' dwa puste szablony sukcesu.
Zadania wst)pne zako/czone, mo'esz przyst$pi( do kolejnych kroków. Na pocz$tek
utwórz komponent
menuProfil
. Poni'ej znajduje si) jego kod:
Rozdzia 4. Warstwa widoku
147
class menuProfilComponent extends sfComponent {
public function execute() {
$this->aProfil = array(
array('ustawienia','profil/ustawienia'),
array('dane osobowe','profil/dane')
);
}
}
Komponent zawiera jedynie tablic) pozycji menu. Poni'ej znajdziesz kod partiala po#$-
czonego z tym komponentem:
<ul class="fl">
<?php
foreach( $aProfil as $aPozycja ) {
echo '<li>', link_to( '<span>' . $aPozycja[0] . '</span>',
$aPozycja[1]),'</li>';
}
?>
</ul>
Jedynym zadaniem kodu jest wygenerowanie HTML-a obrazuj$cego pozycje menu.
Drugi komponent
menuZalogowany
znajdziesz na poni'szym listingu:
class menuZalogowanyComponent extends sfComponent {
public function execute() {
$this->aZabezpieczone = array(
array('poczta','zabezpieczone/poczta'),
array('oceny','zabezpieczone/oceny')
);
}
}
Jak widzisz, kod jest niemal identyczny. Ró'ni si) tylko pozycjami menu. Partial dla tego
komponentu przedstawiony jest poni'ej:
<ul class="fl">
<?php
foreach( $aZabezpieczone as $aPozycja ) {
echo '<li>', link_to( '<span>' . $aPozycja[0] . '</span>',
$aPozycja[1]),'</li>';
}
?>
</ul>
I tym razem nie ró'ni si) za bardzo od poprzedniego. Inna jest jedynie tablica, z której
pochodz$ pozycje.
Kolej na edycj) layoutu. ZnajdY w kodzie element
div
o identyfikatorze równym
right_
menu
. Przed jego znacznikiem zamykaj$cym dodaj kod: