informatyka php5 programowanie z wykorzystaniem symfony cakephp zend framework tomasz skaraczynski ebook

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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:

background image

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.

background image

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/>

background image

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&parametr2=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:

background image

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),

background image

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)

background image

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.

background image

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.

background image

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.

background image

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.

background image

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

)

background image

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):

background image

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>

background image

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.

background image

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(:

background image

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'); ?>

background image

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.

background image

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.

background image

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.

background image

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.

background image

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).

background image

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

.

background image

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'
);

background image

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.

background image

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

background image

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.

background image

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:

background image

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.

background image

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.

background image

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.

background image

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:

background image

146

PHP5. Programowanie z wykorzystaniem Symfony, CakePHP, Zend Framework

screen

— ekran monitora,

print

— 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:

background image

Czytaj dalej...

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:


Wyszukiwarka

Podobne podstrony:
PHP5 Programowanie z wykorzystaniem Symfony CakePHP Zend Framework php5sy
informatyka zend framework od podstaw wykorzystaj gotowe rozwiazania php do tworzenia zaawansowanych
Zend Framework od podstaw Wykorzystaj gotowe rozwiazania PHP do tworzenia zaawansowanych aplikacji i
informatyka php5 bezpieczne programowanie leksykon kieszonkowy jacek ross ebook
Zend Framework od podstaw Wykorzystaj gotowe rozwiazania PHP do tworzenia zaawansowanych aplikacji i
Zend Framework od podstaw Wykorzystaj gotowe rozwiazania PHP do tworzenia zaawansowanych aplikacji i
Zend Framework od podstaw Wykorzystaj gotowe rozwiazania PHP do tworzenia zaawansowanych aplikacji i
Zend Framework od podstaw Wykorzystaj gotowe rozwiazania PHP do tworzenia zaawansowanych aplikacji i
Programowanie z wykorzystaniem współrzędnych biegunowych
SYLABUS Technologie informacyjne Ogrodnictwo SGGW dr Marek Wierzbicki, Ogrodnictwo 2011, INFORMATYKA

więcej podobnych podstron