You are on page 1of 19

Strona 1 z 19

Pierwsze kroki z Zend Framework


(tytu oryginau: Getting Started With Zend Framework)
Autor: Rob Allen, www.akrabat.com
Tumaczenie: Radosaw Benkel, @singlespl

Wersja dokumentu 1.7.5
Copyright 2006, 2010


Celem kursu jest nauka podstaw tworzenia aplikacji za pomoc Zend Frameworka poprzez utworzenie
prostej aplikacji bazodanowej z wykorzystaniem paradygmatu Model-View-Controller.

Uwaga: Informacje w tym kursie przetestowane zostay na wersji 1.10.1 Zend Frameworka. Jest bardzo dua
szansa, e opisane tutaj metody zadziaaj z nowsz wersj. Nie bd one jednak dziaa z wersjami
poniej 1.10.1
Wymagania
Zend Framework posiada nastpujce wymagania:
PHP w wersji 5.2.4 (bd wyszej)
Serwer WWW obsugujcy mod_rewrite bd podobn funkcjonalno.
Zaoenia kursu
Zaoyem, e uywasz PHP w wersji przynajmniej 5.2.4 wraz z serwerem Apache. Twoja instalacja Apache
musi posiada zainstalowane i skonfigurowane rozszerzenie mod_rewrite.

Dodatkowo, upewnij si, e Apache jest skonfigurowany tak, aby mg obsugiwa pliki .htaccess.
Zazwyczaj dokonuje si tego dokonujc zmiany dyrektywy konfiguracyjnej:

AllowOverride None
na
AllowOverride All

w pliku httpd.conf. Wicej szczegw znajdziesz w dokumentacji. Jeli nie skonfigurowae prawidowo
mod_rewrite oraz .htaccess, nie bdziesz w stanie przej do innej strony aplikacji ni domowa.
Pobranie frameworka
Zend Framework dostpny jest pod adresem http://framework.zend.com/download/latest w formacie .zip
bd tar.gz. Na kocu strony znajdziesz linki do pobrania wybierz wersj Minimal.
Konfiguracja Zend_Tool
Zend Framework jest dostarczany wraz z narzdziem linii polece ZendTool. Zaczniemy od jego
konfiguracji.
Zend_Tool dla Windows

Utwrz nowy folder w Program Files nazywajc go ZendFrameworkCli
Kliknij dwukrotnie na wczeniej pobrany plik - ZendFramework-[wersja]-minimal.zip.
Skopiuj foldery bin oraz library z okna otwartego archiwum ZendFramework-[wersja]-
minimal.zip do lokalizacji C:\Program Files\ZendFrameworkCli. Folder ten powinien mie
teraz dwa podfoldery: bin oraz library.
Dodaj odpowiedni ciek do folderu bin do Path w zmiennych rodowiskowych systemu:

Strona 2 z 19
Otwrz Waciwoci system z poziomu Panelu Sterowania oraz wybierz zakadk
Zaawansoawne. Tam kliknij na przycisk Zmienne rodowiskowe.
W sekcji Zmienne systemowe znajd zmienn Path i kliknij na niej dwukrotnie.
Dodaj ciek ;C:\Program Files\ZendFrameworkCli\bin na kocu pola i nacinij OK.
(rednik na pocztku jest istotny!)
Zrestartuj computer (w przypadku Windows 7 nie jest to konieczne, wystarczy zamkna okno -
przyp. tum.).
Zend_Tool dla OS X (oraz Linux)
Rozpakuj archiwum ZendFramework-[wersja]-minimal.zip
Skopiuj pliki do folderu /usr/local/ZendFrameworkCli korzystajc z Terminala/konsoli wydajc
nastpujce polecenia:

sudo cp -r ~/Downloads/ZendFramework-[wersja]-minimal
/usr/local/ZendFrameworkCli
Nastpnie dokonaj edycji profilu basha:
Z poziomu Terminala/konsoli, wpisz: open ~/.bash_profile
Dodaj linijk alias zf=/usr/local/ZendFrameworkCli/bin/zf.sh na kocu pliku
Zapisz plik.
Zamknij terminal
Testowanie Zend_Tool
Moesz sprawdzi, czy prawidowo skonfigurowae narzdzie Zend_Tool poprzez otworzenie terminala/
/wiersza polece i wpisanie nastpujcego polecenia:

zf show version

Powiniene zobaczy podobny tekst:

Zend Framework Version: 1.x.x

Jeli nie, sprawd ustawione wczeniej cieki dostpu oraz czy folder bin znajduje si w folderze
ZendFrameworkCli. Jeli narzdzie zf dziaa prawidowo, wydanie polecenia zf --help wywietli list
wszystkich dostpnych polece.

Uwaga: Jeli Twoja dystrybucja PHP zawiera Zend Framework, upewnij si, e nie jest on w wersji 1.9,
poniewa przykady podane w kursie nie bed dziaa. W czasie pisania tego kursu, xampp postpowa w
ten sposb.
Aplikacja
Teraz, kiedy posiadamy wszystko co potrzebne do stworzenia aplikacji, sprecyzujmy, jak wspomniana
aplikacja ma dziaa, Zbudujemy bardzo prosty system do katalogowania naszej kolekcji CD. Gwna strona
zawiera bdzie list naszych pyt(albumw) i pozwoli nam na dodawanie, edycj oraz usuwanie pozycji.
Zaczniemy od szkicu aplikacji. Nasza aplikacja wymaga bdzie 4 stron:

Strona domowa Bdzie zawieraa list pyt wprowadzonych do systemu wraz z odnonikami do
kasowania oraz edycji. Dodatkowo, znajdzie si tam odnonik do dodawania
nowej pozycji.
Dodaj nowy album Ta strona zawiera bdzie formularz dodawania nowego albumu.
Edytuj album Ta strona zawiera bdzie formularz do edycji danych albumu.
Skasuj album Ta strona bdzie suy do potwierdzenia chci usunicia albumu oraz obsuy
jego usuwanie.

Informacje o albumach bdziemy trzyma w bazie danych. Potrzebowa bdziemy tylko jednej tabeli z
nastpujcymi polami:


Strona 3 z 19
Nazwa pola Typ Null? Komentarz
Id Integer No Primary key, auto increment
artist varchar(100) No
title varchar(100) No

Tworzenie szkieletu aplikacji
Zacznijmy tworzenie naszej aplikacji. Gdzie tylko bdzie to moliwe, bdziemy wykorzystywa narzdzie zf,
poniewa oszczdzi nam pracy i wysiku. Pierwszym zadaniem bdzie stworzenie szkieletu plikw i folderw
projektu.

W tym celu otwrz okno terminal/wiersza polece i przejd do folderu gwnego swojego serwera WWW.
Upewnij si, e masz prawa do zapisu w tym folderze, a proces serwera prawa do odczytu. Nastpnie
wykonaj polecenie:

zf create project zf-tutorial

Narzdzie ZF stworzny folder zf-tutorial wraz z rekomendowan struktur projektu. Taki ukad bazuje
na przechowywaniu wikszoci plikw i folderw poza folderem publicznym serwera. Zakada on jednak, e
posiadasz pen kontrol nad instalacj Apachea. Struktura folderw powinna wyglda nastpujco:



(W folderze public/ powinien znajdowa si jeszcze ukryty plik .htaccess).

Folder application/ zawiera kod rdowy aplikacji. Jak wida, posiadamy osobne foldery dla plikw
modeli, widokw oraz kontrolerw. Folder public/ jest folderem publicznym znaczy to, e link do aplikacji
bdzie wyglda nastpujco: http://localhost/zf-tutorial/public/. Dziki temu wikszo
plikw aplikacji nie jest dostpna z poziomu przegldarki.




Uwaga:

Strona 4 z 19

W przypadku wersji produkcyjnej strony, powiniene utworzy tzw. virtual hosta i ustawi
sciek dokumentw (DirectoryRoot) na folder public directory. Dla przykadu, moesz
utworzy virtual hosta zf-tutorial.localhost umieszajc poniszy kod w pliku httpd.conf:

<VirtualHost *:80>
ServerName zf-tutorial.localhost
DocumentRoot [cieka gwna serwera]/zf-tutorial/public
<Directory "[cieka gwna serwera]/zf-tutorial/public">
AllowOverride All
</Directory>
</VirtualHost>

Strona bdzie wtedy dostpna pod adresem http://zf-tutorial.localhost/ (upewnij
si, e zmodyfikowae plik /etc/hosts bd
c\windows\system32\drivers\etc\hosts tak aby
zf-tutorial.localhost wskazywa na IP 127.0.0.1). Nie bdziemy tego robi w ramach
kursu, poniewa do testowania obecne podejcie jest wystarczajce.

Obrazki, pliki z kodem JavaScript oraz arkusze stylw CSS przechowywane s w specjalnych katalogach w
ramach folderu public/. Pobrane pliki Zend Frameworka przechowywane bd w folderze library/ -
dodatkowe biblioteki take mog zosta umieszczone w tym miejscu.

Skopiuj zawarto folderu library/Zend/ z pobranego archiwum do folderu zf-tutorial/library/,
taka by folder zf-tutorial/library/ zawiera folder Zend/.

Nastpnie moesz przetestowa aplikacj wpisujc w przegldarce adres http://localhost/zf-tutorial/public.
Powiniene zobaczy co takiego:




Strona 5 z 19
Konfigurowanie aplikacji
Kontrolery Zend Frameworka uywaj wzorca Front Controller i oraz traktuj plik index.php jako jedyne
wejcia aplikacji. Plik index.php zapewnia, e rodowisko aplikacji bdzie prawidowo skonfigurowane -
proces ten nazywany jest bootstrapping. Przekierowanie wszystkich wywoa do public/index.php
(utworzonego automatycznie) zapewnia plik .htaccess (stworzony rrzez narzdzie ZF) znajdujcy si w
folderze zf-tutorial/public .

Plik index.php jest punktem wejciowym naszej aplikacji i uywany jest do stworzenia instancji klasy
Zend_Application, ktra to inicjalizuje nasz aplikacj i uruchamia j. Plik ten defniuje take dwie stae:
APPLICATION_PATH oraz APPLICATION_ENV ktre okrelaj odpowiednio ciek do folderu
application/ oraz rodowisko/tryb dziaania aplikacji. Domylnie jest ono ustawione na production,
lecz powiniene zmieni je na development dodajc w pliku.htaccess nastpujc linijk:

SetEnv APPLICATION_ENV development

Komponent Zend_Application uywany jest do uruchomienia aplikacji na bazie konfiguracji zawartej w
pliku application/configs/application.ini. Ten plik take generowany jest automatycznie.
Klasa startowa (tzw. Bootstrap), dziedziczca po Zend_Application_Bootstrap_Bootstrap
znajduje si w pliku application/Bootstrap.php. Plik ten moe by uywany do wykonania
niestandardowego kodu wymaganego do startu aplikacji.

Plik application.ini, znajdujcy si w folderze application/configs adowany jest poprzez
komponent Zend_Config_Ini. Zend_Config_Ini pozwala na wykorzystanie dziedziczenia w ramach
plikw konfiguracyjnych defniuje si je oddzielajc nazwy sekcji pliku application.ini dwukropkiem.
Dla przykadu:

[staging : production]

Oznacza to, e sekcja staging dziedziczy wszystkie ustawienia z sekcji production. Staa
APPLICATION_ENV okrela, ktra sekcja zostanie zaadowana. Oczywicie podczas tworzenia aplikacji
najlepszym rozwizaniem bdzie korzystanie z trybu development, jednake w przypadku gotowej aplikacji
powinno wykorzystywa si tryb production. Wszystkich zmian pliku application.ini dokonywa
bdziemy w ramach sekcji production, dziki czemu niezalenie od wybranego trybu dziaania adowane
bed wszystkie dyrektywy konfiguracyjne (dziki mechanizmowi dziedziczenia).
Edytowanie pliku application.ini
Pierwsz zmian, jakiej musimy dokona jest zmiana strefy czasowej dla prawidowej obsugi dat i czasu w
PHP. Dokonaj edycji pliku application/configs/application.ini dodajc linijk:

phpSettings.date.timezone = "Europe/London"

za wszystkimi wartociami typu phpSettings w sekcji[production]. Oczywicie, powiniene uy strefy
czasowej odpowiedniej do Twojego miejsca zamieszkania. Teraz moemy doda wasny kod aplikacji.
Wasny kod aplikacji
Zanim zaczniemy pisa aplikacje, wane jest, aby zrozumie jakiej organizacji stron oczekuje od nas Zend
Framework. Kada strona aplikcji rozumiana jest jako akcja, akcje natomiast pogrupowane s w kontrolery.
Dla URLa wygldajcego w ten sposb: http://localhost/public/zf-tutorial/news/view,
kontrolerem bdzie News a akcj view. Korzystanie z kontrolerw pozwala na grupowanie powizanych ze
sob akcji. Dla przykadu, kontroler News moe posiada akcje list, archived and view. MVC w Zend
Frameworku posiada take wsparcie dla moduw su one grupowaniu kontrolerw jednak w
przypadku naszej aplikacji nie ma potrzeby korzystania z tej funkcjonalnoci.

Domyln akcj kontrolerw Zend Frameworka jest akcja index. Znaczy to, e w przypadku wywoania
adresu http://localhost/zf-tutorial/public/news/ zostanie wywoana akcja index
zdenifiowana w kontrolerze News. Dodatkowo zdefuniowany jest domylny kontroler, ktrzy take nazywa

Strona 6 z 19
si index znaczy to, e wywoanie adresu http://localhost/zf-tutorial/public/ spowoduje
uruchomienie akcji index w ramach kontrolera Index.

Biorc pod uwag, e kurs ten jest bardzo prosty, nie bdziemy zawraca sobie gowy takimi
skomplikowanymi rzeczami jak logowanie uytkownika do systemu. To moe poczeka do nastpnego
kursu (moesz take poczyta na ten temat ksice Zend Framework in Action!)

Z racji, e posiadamy cztery strony zwizane z pytami/albumami, umiecimy je w ramach jednego
kontrolera. Uyjemy kontrolera domylnego i bd to nastpujce akcje:

Strona Kontoler Akcja?
Strona gwna Index index
Dodaj nowy album Index add
Edytuj album Index edit
Skasuj album Index delete


W miar, jak strona bdzie stawaa si bardziej skomplikowana, potrzebne bd dodatkowe kontrolery bd
moduy.
Tworzenie kontrolera
Jestemy gotowi do tworzenia kontrolera. W Zend Frameworku, kontroler reprezentowany jest przez klas,
ktra musi posiada nazw pasujc do wzorca: {Nazwa kontrolera}Controller. Zwr uwag, aby
{Nazwa kontrolera} zaczynaa si od wielkiej litery. Klasa ta musi by zdefniowana w pliku {Nazwa
kontrolera}Controller.php zapisanym w folderze application/controllers. Kada akcja
reprezentowana jest przez metod publiczn zdefiniowan w ramach kontrolera i nazywajc si {nazwa
akcji}Action. W tym przypadku {nazwa akcji} zaczyna si od maej litery - tak samo caa nazwa
powinna by pisana maymi literami. Uywanie rwnoczenie wielkich i maych liter w nazwach kontrolerw
oraz akcji jest dopuszczalne, lecz obowizuj specjalne reguy z tym zwizane tak wic najpierw
przeczytaj dokumentacj!

Nazwa klasy naszego kontrolera to IndexController zdefiniowana ona jest w pliku
application/controllers/IndexController.php zosta on automatycznie utworzony przez
narzdzie Zend_Tool. Klasa ta zawiera take definicj jednej akcji - indexAction(). Musimy tylko doda
nasze akcje.

Akcje mona dodawa korzystajc z narzdzia zf z opcj create action. Otwrz terminal/wiersz polece
i przejd do katalogu zf-tutorial/. Wpisz nastpujce komendy:

zf create action add Index
zf create action edit Index
zf create action delete Index

Utworz one nastpujce metody: addAction, editAction oraz deleteAction w ramach kontrolera
IndexController oraz pliku widokw, ktre bd nam potrzebne pniej. Posiadamy teraz wszystkie
akcje, ktrych chcemy uy.

Adresy dla kadej z akcji przedstawiaj si nastpujco:

Strona Kontoler
http://localhost/zf-tutorial/public/ IndexController::indexAction()
http://localhost/zf-tutorial/public/index/add Controller::addAction()
http://localhost/zf-tutorial/public/index/edit IndexController::editAction()
http://localhost/zf-tutorial/public/index/delete IndexController::deleteAction()



Strona 7 z 19

Moesz przetestowa, czy wspomniane adresy dziaaj powiniene komunikaty w tym stylu:

View script for controller index and script/action name add

Note: Jeli otrzymujesz bad 404, nie skonfigurowae prawidowo Apachea wraz z moduem mod_rewrite
bd nie ustawie prawidowo dyrektywy AllowOverride w konfiguracji Apachea, przez co plik .htaccess
w folderze public/ nie jest interpretowany.
Baza danych

Teraz, kiedy posiadamy szkielet aplikacji ze zdefniowanym kontrolerem, akcjami oraz widokami, nadszed
czas aby przyjrze si modelom naszej aplkacji. Pamitaj, e model jest t czci aplikacji, odpowiada za
reguy biznesowe aplikacji i w naszym wypadku reprezentuje baz danych. Bdziemy wykorzystywa klas
Zend_Db_Table, ktra uywana jest do wyszukiwania, dodawania, edycji oraz usuwania rekordw tabeli.
Konfiguracja bazy danych
Aby mc korzysta z klas Zend_Db_Table, musimy przekaza jej informacj z ktrej bazy danych maj
korzysta (razem z nazw uytkownika oraz hasem). Z racji, e nie chcemy zakodowa tej informacji na
sztywno w kodzie aplikacji (tzw. hard-coding przyp.tum.), skorzystamy z pliku konfiguracyjnego.
Komponent Zend_Application posiada plugin sucy do automatycznej konfiguracji bazy danych, tak
wic wystarczy doda odpowiednie dyrektywy konfiguracyjne do pliku configs/application.ini, a
plugin zajmie si reszt.

Otwrz plik application/configs/application.ini i dodaj ponisze linie w sekcji [production]:

resources.db.adapter = PDO_MYSQL
resources.db.params.host = localhost
resources.db.params.username = rob
resources.db.params.password = 123456
resources.db.params.dbname = zf-tutorial

Oczywiste jest, e powiniene uy swojej nazwy uytkownika, hasa oraz nazwy bazy danych nie moich!
(baza musi by wczeniej utworzona - przyp. tum.). Poczenie z baz danych zostanie utworzone
automatycznie i przypisane do klasy Zend_Db_Table. Na temat innych pluginw Zend_Applicaion
moesz poczyta tutaj: http://framework.zend.com/manual/en/zend.application.available-resources.html.
Stwrz tabel bazy danych
Jak wspomnielimy na pocztku, do przechowywania naszych danych wykorzystamy baz danych. Uywa
bd MySQL, dlatego kod SQL tworzcy tabel wyglda nastpujco:

CREATE TABLE albums (
id int(11) NOT NULL auto_increment,
artist varchar(100) NOT NULL,
title varchar(100) NOT NULL,
PRIMARY KEY (id)
);

Uruchom ten kod korzystajc z klienta MySQL, np. phpMyAdmin bd klienta mysql obsugiwanego z linii
polece (komenda mysql).
Dodaj testowe dane
Dodamy take kilka rekordw do tabeli, abymy mogli zaobserwowa dziaanie strony gwnej naszej
aplikacji. Ja wybior list pierszych piciu bestsellerw ze sklepu Amazon UK. Wykonaj ponisze zapytanie
za pomoc swojego klienta MySQL:

INSERT INTO albums (artist, title)
VALUES
('Paolo Nutine', 'Sunny Side Up'),

Strona 8 z 19
('Florence + The Machine', 'Lungs'),
('Massive Attack', 'Heligoland'),
('Andre Rieu', 'Forever Vienna'),
('Sade', 'Soldier of Love');

Teraz, kiedy posiadamy prosty zestaw danych w naszej bazie, moemy zabra si za pisanie prostego
modelu.
Model
Zend Framework nie udostpnia klasy Zend_Model, poniewa model odpowiada za Twoj logik
biznesow i to od Ciebie zaley jak j zaimplementujesz. Isnieje wiele rnych komponentw, ktre moesz
wykorzysta do tego celu. Jednym z podej jest posiadanie klasy modelu dla kadej encji Twojej aplikacji, a
nastpnie uywa tzw. obiektu mapujcego ktry pobiera i zapisuje dane do bazy. Podejcie to opisane jest
w tym dokumencie: http://framework.zend.com/manual/en/learning.quickstart.create-model.html.

Na potrzebny tego kursu, utworzymy model dziedziczcy po klazie Zend_Db_Table oraz korzystajcy z
klas Zend_Db_Table_Row. Zend Framework udostpnia component Zend_Db_Table, ktry implementuje
wzorzec projektowy Table Data Gateway. Wzorzec ten udostpnia interfejs do komunikacji z tabel w bazie
danych. Miej jednak na uwadze, e Table Data Gateway moe by ograniczeniem w przypadku wikszych
aplikacji. Istnieje take pokusa, aby umieszcza kod zwizany z obsug bazy danych w ramach akcji
kontrolerw.

Klasa Zend_Db_Table_Abstract jest klasa abstrakcyjn, po ktrej dziedziczy bdzie nasza klasa
suca do zarzdzania naszymi albumami. Nazwa klasy nie ma znaczenia, aczkolwiek wskazane moe by
nazwanie jej podobnie jak tabeli w naszej bazie. Nasz projekt posiada domylny autoloader zainicjowany
przez Zend_Application, ktry mapuje nasze klasy na odpowiadajce im pliki w obrbie naszego
moduu. Znaczy to, e dla klas umieszczonych w ramach gwnego folderu application/ bdziemy
uywa prefiksu Application_ w nazwach klas.

Autolader mapuje klasy na w nastpujcy sposb:

Prefiks Folder
Form forms
Model models
Model_DbTable models/DbTable
Model_Mapper models/mappers
Plugin plugins
Service services
View_Filter view/filters
View_Helper view/helpers



Z racji, e nazywamy modele zgodnie z nazwami tabel w bazie danych oraz korzystamy z Zend_Db_Table,
nasza klasa nazywa si bdzie Application_Model_DbTable_Albums i zapisana bdzie w pliku
applications/models/DbTable/Albums.php.

Aby da zna klasom Zend_Db_Table do ktrej tabeli maj si odnosi, musimy przypisa do
chronionego atrybutu obiektu ($_name) nazw tableli. Zend_Db_Table zakada take, e tablela posiada
kolumn (z kluczem podstawowym) o nazwie id, ktrej warto zwikszanana jest automatycznie przez
baz danych przy dodawaniu kolejnych rekordw (autoincrement w MySQL, sekwencje w przypadku
PostgreSQL przyp. tum.). Nazwa kolumny z kluczem podstawowym moe by zmieniona, jeli zajdzie
taka potrzeba.

Moemy skorzysta z narzdzia ZF w celu oszczdzenia nam pracy. Uruchom ponisz komend:


Strona 9 z 19
zf create db-table Albums albums

Narzdzie ZF utworzyo za nas plik Albums.php w folderze application/models/DbTable. Plik ten
zawiera definicj klasy Application_Model_DbTable_Albums cznie z ustawionym atrybutem $_name
wskazujcym na odpowiadajc tabel w bazie danych.

Teraz musimy doda troch wasnego kodu. W tym celu, edytuj plik
application/models/DbTable/Albums.php i dodaj metody getAlbum(), addAlbum(),
updateAlbum() and deleteAlbum() tak, aby plik wyglda nastpujco:

zf-tutorial/application/models/DbTable/Albums.php
<?php

class Application_Model_DbTable_Albums extends Zend_Db_Table_Abstract
{
protected $_name = 'albums';

public function getAlbum($id)
{
$id = (int)$id;
$row = $this->fetchRow('id = ' . $id);
if (!$row) {
throw new Exception("Could not find row $id");
}
return $row->toArray();
}

public function addAlbum($artist, $title)
{
$data = array(
'artist' => $artist,
'title' => $title,
);
$this->insert($data);
}

public function updateAlbum($id, $artist, $title)
{
$data = array(
'artist' => $artist,
'title' => $title,
);
$this->update($data, 'id = '. (int)$id);
}

public function deleteAlbum($id)
{
$this->delete('id =' . (int)$id);
}
}

Stworzyllimy cztery metody pomocznicze, z ktrych bdzie korzysta nasza aplikacja. Metoda
getAlbum()zwrci jeden rekord w postacji tablicy, addAlbum() tworzy nowy rekord w bazie danych,
updateAlbum() uaktualnia informacje o albumie a deleteAlbum() usuwa album. Kodu dla kadej z tych
akcji nie trzeba raczej wyjania. Moesz take skonfigurowa Zend_Db_Table tak, aby mc pobiera
dane z powiznych tabel, aczkolwiek nie jest to czci tego kursu.

Naszym zadaniem bdzie pobranie danych z bazy danych w kontrolerze i przypisanie ich do widoku,
jednake, zanim bdziemy mogli tego dokona, musimy zrozumie jak dziaa system widokw w Zend
Frameworku.
Szablony widoku (layouts) i widoki (views)

Strona 10 z 19
Komponent widoku Zend Frameworka nazywa si Zend_View co nie jest zaskakujce. Komponent
widoku pozwoli nam na rozdzielenie kodu odpowiedzialnego za wywietlanie strony od kodu w akcjach
kontrolerw.

Podstawowy sposb uycia Zend_View wyglda tak:

$view = new Zend_View();
$view->setScriptPath('/path/to/scripts');
echo $view->render('script.php');

atwo mona zauway, e korzystajc z powyszego kodu w kadej z naszych akcji, skoczymy na pisaniu
w kko tego samego, strukturalnego kodu, ktry nie ma nic wsplnego z wykonywan akcj. Lepszym
rozwizaniem byoby zainicjowanie gdzie obiektu widoku i korzystanie z zainicjowanego ju obiektu. Zend
Framework udostpnia ActionHelper (po polsku pomocnik akcji) o nazwie ViewRenderer. Jego zadaniem
jest zainicjowanie atrybutu widoku w ramach kontrolera($this->view) oraz automatyczne
wyrenderowanie widoku pod koniec wykonywania akcji.

W celach renederingu, ViewRenderer konfiguruje obiekt Zend_View tak, aby szuka on plikw widoku w
folderze views/scripts/{nazwa kontrolera} i domylnie wybiera plik o takiej samej nazwie jak
nazwa wykonywanej akcji, z dodanym rozszerzeniem phtml. Tak wic renderowanym plikiem widoku
bdzie views/scripts/{nazwa kontrolera}/{nazwa akcji}.phtml a wygenerowana tre
zostanie przypisana do obiektu Response. Obiekt Response uywany jest w celu czenia wszystkich
nagwkw HTTP, zawartoci odpowiedzi oraz wyjtkw bdcych wynikiem uywania MVC. Front
Controller pod koniec przetwarzania dania automatycznie wysya nagwki, a wraz z nimi tre
odpowiedzi.

Wymienione wyej czynnoci s wykonywane za nas automatycznie podczas tworzenia projektu czy te
dodawania kontrolerw oraz akcji za pomoc Zend_Tool .
Wsplny kod HTML: Szablony widokw (layouts)

Szybko staje si oczywiste, e w naszych widokach bdzie sporo identycznego kodu HTML m.in. dla
nagwka i stopki, moliwe take, e dodatkowo dla paneli bocznych, Jest to czsto spotykany problem,
dlatego ZendFramework zawiera komponent Zend_Layout. Zend_Layout pozwala nam na przeniesienie
powtarzajcego si kodu (nagwek, stopka itd) do pliku szablonu widoku, w ramach ktrego wstawiana jest
zawarto wyrenderowanego widoku przypisanego do wykonywananej akcji.

Domylnym miejscem do zapisywania szablonw widoku jest folder application/layouts/. Istnieje
take plugin do Zend_Application ktry skonfiguruje Zend_Layout za nas. Skorzystamy z Zend_Tool
do stworzenia szablonu widoku i modyfikacji pliku konfiguracji. Z poziomu terminala/wiersza polece
wykonaj nastpujca komend w folderze zf-tutorial:

zf enable layout

Zend_Tool stworzy folder application/layouts/scripts oraz szablon widoku layout.phtml w
tym folderze. Dokona take modyfikacji pliku application.ini dodajc linijk
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/" na kocu sekcji
[production].

Na samym kocu procesu przetwarzania dania, kiedy akcje kontrolerw zostay ju wykonane,
Zend_Layout dokona renderingu naszego szablonu widoku. Zend_Tool udostpnia bardzo prosty szablon
ktry wywietla tylko zawarto pliku widoku wykonywanej akcji. Dodamy do niego kod wymagany w naszej
aplikacji. Otwrz plik layouts.phtml i zamie znajdujcy si tam kod na poniszy:

zf-tutorial/application/layouts/scripts/layout.phtml
<?php
$this->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf-8');
$this->headTitle()->setSeparator(' - ');
$this->headTitle('Zend Framework Tutorial');

Strona 11 z 19

echo $this->doctype(); ?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<?php echo $this->headMeta(); ?>
<?php echo $this->headTitle(); ?>
</head>
<body>
<div id="content">
<h1><?php echo $this->escape($this->title); ?></h1>
<?php echo $this->layout()->content; ?>
</div>
</body>
</html>

Plik szablonu zawiera zewntrzny kod HTML, ktry wyglda do standardowo. Tak samo jak w ramach
normalnych plikw PHP, w ramach widokw i szablonw moemy korzysta ze skadni PHP. Dostpna
zmienna $this odpowiada obiektowi widoku, do ktrego mamy dostp z poziomu kontrolera: $this-
>view. Moemy uzywa tego obiektu do pobierania danych oraz w celu wywoywania metod. Metody te
(znane jako helpery widoku view helpers) zwracaj najczciej cig tekstowy, tak wic moliwe jest uycie
instrukcji echo.

Na pocztku konfigurujemy kilka helperw widoku dla sekcji head strony, a nastpnie wywietlamy
prawidowy doctype. W ramach taga <body>, stworzymy diva zawierajcego tag <h1> z tytuem strony.
Aby zagniedzi widok wykonywanej wanie akcji w ramach szablonu widoku, skorzystamy z helpera
layout(): echo $this->layout()->content;. Znaczy to, e najpierw zostanie wykonany skrypt
widoku, a nastpnie szablon.

Zanim zaczniemy, musimy ustawi doctype. Z racji e widoki renederowane s wczeniej, warto ustawi
odpowiedni doctype na samym pocztku dania, tak aby niektre klasy mogy z tego korzysta -
przykadem takiej klasy jest Zend_Form.

Aby ustawi doctype dodamy jeszcze jedn lini w pliku application.ini, w sekcji[production]:

resources.view.doctype = "XHTML1_STRICT"

Dziki temu helper doctype() wygeneruje za nas odpowiedni cig znakw, a komponenty takie jak
Zend_Form bd w stanie wygeneorwa kod odpowiedni dla wybranego standardu.
Stylowanie

Mimo tego, e dokument ten jest tylko wprowadzeniem, bdziemy potrzebowa pliku CSS, aby nasza
aplikacja wygldaa cho troch reprezentatywnie. Niestety, wykorzystanie plikw CSS powoduje may
problem polegajcy na tym, e nie wiemy jak ciek poda do pliku CSS, poniewa aplikacja nie znajduje
si w gwnym folderze serwera (tzn, e uruchamiamy j z poziomu http://localhost/zf-
tutorial/public - przyp.tum.).Jednake, istnieje helper o nazwie baseUrl(). Jego zadaniem jest
pobranie informacji z obiektu adania i utworzenie odpowiedniego przedrostka adresu (w naszym wypadku
zwrci on cig zf-tutorial/public).

Moemy teraz doda odnonik do pliku CSS w ramach sekcji <head> pliku
application/layouts/scripts/layout.phtml ponownie wykorzystujc do tego helper widoku - w
tym wupadku bdzie to headLink():

zf-tutorial/application/layouts/scripts/layout.phtml
...
<head>
<?php echo $this->headMeta(); ?>
<?php echo $this->headTitle(); ?>
<?php echo $this->headLink()->prependStylesheet($this->baseUrl().'/css/site.css'); ?>
</head>
...

Strona 12 z 19

Poprzez wykorzystanie metody prependStylesheet()helpera headLink(), zezwalamy widokom na
doczanie specyficznych dla siebie plikw CSS, ktre zostan podlinkowane w sekcji <head> po pliku
gwnym - site.css.

W pliku CSS potrzebujemy kilku podstawowych defnicji, tak wic utwrzmy folder css w lokalizacji
public/ oraz plik site.css z poniszym kodem:

zf-tutorial/public/css/site.css
body,html {
margin: 0 5px;
font-family: Verdana,sans-serif;
}
h1 {
font-size: 1.4em;
color: #008000;
}
a {
color: #008000;
}

/* Table */
th {
text-align: left;
}
td, th {
padding-right: 5px;
}

/* style form */
form dt {
width: 100px;
display: block;
float: left;
clear: left;
}
form dd {
margin-left: 0;
float: left;

}
form #submitbutton {
margin-left: 100px;
}

Teraz strona powinna wyglda troszk adniej, aczkolwiek jak widzisz nie jestem grafikiem!

Moemy teraz miao wykasowa zawarto plikw index.phtml, add.phtml, edit.phtml oraz
delete.phtml, ktre jak pewnie pamitasz, znajdziesz w folderze
pplication/views/scripts/index.
Lista albumw
Teraz, kiedy mamy przygotowan konfiguracj, schemat bazy danych oraz podstawowe widoki, moemy
zabra si za pisanie kodu aplikacji. Zaczniemy od klasy IndexController i akcji indexAction()
przygotujemy kod, ktry pobierze list albumw z bazy danych i wywietli j w postaci tabeli.

zf-tutorial/application/controllers/IndexController.php
...
function indexAction()
{
$albums = new Application_Model_DbTable_Albums();
$this->view->albums = $albums->fetchAll();
}
...

Strona 13 z 19

Najpierw tworzymy nowy obiekt modelu. Metoda. fetchAll() zwraca obiekt klasy
Zend_Db_Table_Rowset, ktry pozwoli nam iterowa po znalezionych rekordach w ramach pliku widoku.

Moemy teraz zapisa poniszy kod w pliku index.phtml:

zf-tutorial/application/views/scripts/index/index.phtml
<?php
$this->title = "My Albums";
$this->headTitle($this->title);
?>
<p><a href="<?php echo $this->url(array('controller'=>'index',
'action'=>'add'));?>">Add new album</a></p>
<table>
<tr>
<th>Title</th>
<th>Artist</th>
<th>&nbsp;</th>
</tr>
<?php foreach($this->albums as $album) : ?>
<tr>
<td><?php echo $this->escape($album->title);?></td>
<td><?php echo $this->escape($album->artist);?></td>
<td>
<a href="<?php echo $this->url(array('controller'=>'index',
'action'=>'edit', 'id'=>$album->id));?>">Edit</a>
<a href="<?php echo $this->url(array('controller'=>'index',
'action'=>'delete', 'id'=>$album->id));?>">Delete</a>
</td>
</tr>
<?php endforeach; ?>
</table>

Pierwszymi rzeczami, jakie zrobimy bdzie ustawienie tytuu strony (wykorzystana bdzie w layoucie) oraz
ustawienie tytuu dla sekcji <head>, uywajc helpera headTitle() wywietlony zostanie on na pasku
przegldarki. Nastpnie tworzymy odnonik do dodania nowego albumu. Helper widoku o nazwie url() jest
czci frameworka i odpowiada za stworzenia prawidowego odnonika wraz z adresem bazowym.
Wystarczy, e przekaemy tablic parametrw z nazw kontrolera i akcji, a reszt zajmie si helper.

Nastpnie tworzymy tabel zawierajc tytu i wykonawc kadego albumu oraz odnoniki prowadzcych do
edycji oraz usuwania rekordw. Wykorzystujemy standardow ptl foreach: do iteracji po licie albumw.
Warty odnotowania jest fakt, e uywamy alternatywnej formy zapisu instrukcji sterujcych zakoczonych
dwukropkiem oraz rednikiem w przypadku endforeach; - rozwizanie takie pozwala atwiej zorientowa
si w kodzie. Ponownie wykorzystujemy helper url() do utworzenia odnonikw.

Jeli przejdziesz pod adres http://localhost/zf-tutorial/public/ (bd ten ustawiony przez Ciebie!) powiniene
zobaczy list albumw, wygldajc mniej wicej tak:

Strona 14 z 19

Dodawanie nowych albumw
Moemy teraz dopisa kod odpowiedzialny za funkcjonalno dodawania nowego albumu. Proces ten
bdzie skada si z dwch czci:

Wywietlenie uytkownikowi formularza dodawania albumu
Przetworzenie danych z formularza i zapisanie ich w bazie danych

Do tego celu wykorzystamy klas Zend_Form. Komponent Zend_Form umoliwia utworzenie formularza
oraz walidacj danych wejciowych. Tworzymy now klas Form_Album (dziedziczc po Zend_Form) w
celu zdefiniowania naszego formularza. Z racji, e jest to komponent naszej aplikacji, definicja klasy
przechowywana jest w pliku Album.php w folderze forms. Zaczniemy od wykorzystania komendy zf do
stworzenia odpowiedniego pliku:

zf create form Album

Polecenie to utworzy plik Album.php w folderze application/forms. Klasa zawiera take metod
init(), w ktrej to moemy dokona konfiguracji formularza oraz doda potrzebene elementy. Dokonaj
edycji pliku application/forms/Album.php i wklej tam nastpujcy kod:

zf-tutorial/application/forms/Album.php
<?php

class Application_Form_Album extends Zend_Form
{

public function init()
{
$this->setName('album');

$id = new Zend_Form_Element_Hidden('id');
$id->addFilter('Int');

$artist = new Zend_Form_Element_Text('artist');
$artist->setLabel('Artist')

Strona 15 z 19
->setRequired(true)
->addFilter('StripTags')
->addFilter('StringTrim')
->addValidator('NotEmpty');

$title = new Zend_Form_Element_Text('title');
$title->setLabel('Title')
->setRequired(true)
->addFilter('StripTags')
->addFilter('StringTrim')
->addValidator('NotEmpty');

$submit = new Zend_Form_Element_Submit('submit');
$submit->setAttrib('id', 'submitbutton');

$this->addElements(array($id, $artist, $title, $submit));
}
}

W ramach metody init() klasy Application_Form_Album utworzylimy cztery elementy formularza,
odpowiednio dla identyfikatora albumu, nazwy wykonawcy, tytuu pyty oraz przycisku wysyania formularza.
Kademu z nich przypisalimy rne atrybuty, cznie z etykiet, ktra zostanie wywietlona obok niego. W
przypadku identyfikatora chcemy, aby by on tylko liczb cakowit (przeciwdziaanie potencjalnym atakom
SQL Injection). Dlatego dodajemy filtr Int, ktry wykona to zadanie za nas.

Dla elementw tekstowych, dodajemy dwa filtry: StripTags oraz. StringTrim. Pierwszy usuwa
niechciane znaczniki HTML, drugi natomiast niepotrzebne biae znaki. Definiujemy je take jako pola
wymagane oraz dodajemy walidatory NotEmpty aby upewni si, e uytkownik wpisze dane ktrych od
niego wymagamy (walidator NotEmpty praktycznie nie jest wymagany, poniewa zostaje on automatycznie
dodany w momencie zdefiniowania pola jako wymagane linijka ta zostaa jednak dodana, aby pokaza
sposb w jaki dodaje si walidatory).

Musimy teraz wywietli formularz oraz obsuy przesane dane. Dokonamy tego w ramach metody
addAction() kontrolera IndexController:

zf-tutorial/application/controllers/IndexController.php
...
function addAction()
{
$form = new Application_Form_Album();
$form->submit->setLabel('Add');
$this->view->form = $form;

if ($this->getRequest()->isPost()) {
$formData = $this->getRequest()->getPost();
if ($form->isValid($formData)) {
$artist = $form->getValue('artist');
$title = $form->getValue('title');
$albums = new Application_Model_DbTable_Albums();
$albums->addAlbum($artist, $title);

$this->_helper->redirector('index');
} else {
$form->populate($formData);
}
}
}
...


Przeanalizujmy kod krok po krku:

$form = new Application_Form_Album();
$form->submit->setLabel('Add');
$this->view->form = $form;

Strona 16 z 19


Inicjujemy obiekt klasy Form_Album, ustawiamy nazw przycisku wysyajcego formularz na Add oraz
przypisujemy do zmiennej widoku.

if ($this->getRequest()->isPost()) {
$formData = $this->getRequest()->getPost();
if ($form->isValid($formData)) {

Jeli metoda obiektu dania, isPost() zwraca warto true, znaczy to e formularz zosta wysany,
dlatego te moemy pobra przesane dane za pomoc metody getPost() i sprawdzi ich poprawno za
pomoc metody isValid() formularza.

$artist = $form->getValue('artist');
$title = $form->getValue('title');
$albums = new Application_Model_DbTable_Albums();
$albums->addAlbum($artist, $title);

Jeli przesane dane s poprawne, inicjuemy obiekt klasy modelu -
Application_Model_DbTable_Albums i wywoujemy zdefniowan wczeniej metod addAlbum() w
celu zapisania danych w bazie.

$this->_helper->redirector('index');

Kiedy ju zapisalimy nowy rekord w bazie, przekierowujemy danie do akcji index, wykorzystujc do
tego celu helper Redirector (chcemy wrci do strony gwnej).

} else {
$form->populate($formData);
}

Jeli dane formularza nie przeszy procesu walidacji, wypeniamy pola formularza przesanymi danymi i
ponownie wywietlamy go uytkownikowi.

Musimy teraz wywietli formularz w ramach pliku widoku add.phtml:

zf-tutorial/application/views/scripts/index/add.phtml
<?php
$this->title = "Add new album";
$this->headTitle($this->title);
echo $this->form ;
?>

Jak wida, wywietlenie formularza jest bardzo proste wystarczy skorzysta z instrukcji echo. Teraz
powinimy mie moliwo skorzystania z odnonika Add new album na stronie gwnej i pomylnego
dodania nowego albumu do listy.
Edycja albumu
Edycja albumu jest bardzo podobna do jego dodawania, dlatego kod wyglda podobnie:


zf-tutorial/application/controllers/IndexController.php
...
function editAction()
{
$form = new Application_Form_Album();
$form->submit->setLabel('Save');
$this->view->form = $form;

if ($this->getRequest()->isPost()) {
$formData = $this->getRequest()->getPost();
if ($form->isValid($formData)) {
$id = (int)$form->getValue('id');

Strona 17 z 19
$artist = $form->getValue('artist');
$title = $form->getValue('title');
$albums = new Application_Model_DbTable_Albums();
$albums->updateAlbum($id, $artist, $title);

$this->_helper->redirector('index');
} else {
$form->populate($formData);
}
} else {
$id = $this->_getParam('id', 0);
if ($id > 0) {
$albums = new Application_Model_DbTable_Albums();
$form->populate($albums->getAlbum($id));
}
}
}
...

Przyjrzyjmy si rnicom midzy tym kodem, a kodem dodawania albumu. Pierwsze co robimy przed
wywietleniem formularza uytkownikowi to pobranie danych albumu oraz przypisanie ich do pl formularza..
Odpowiada za to poniszy fragment kodu:

$id = $this->_getParam('id', 0);
if ($id > 0) {
$albums = new Application_Model_DbTable_Albums();
$form->populate($albums->getAlbum($id));
}

Zwr uwag, e kod ten wywoywany jest w momencie, kiedy danie nie jest przesyane metod POST,
poniewa w przypadku przesania go metod POST, uruchamiany jest kod opowiedzialny za przetworzenie
formularza. W celu wywietlenia danych albumu, pobieramy najpierw z parameter id z dania za pomoc
metody _getParam(). Nastpnie wykorzystujemy model aby pobra rekord z bazy danych oraz wypeni
formularz tymi danymi. (to jest wanie powd, dla ktrego metoda getAlbum() zwraca tablic).

Po walidacji danych formularza, uaktualniamy dane w bazie, wykorzystujc do tego celu metod
updateAlbum():

$id = $form->getValue('id');
$artist = $form->getValue('artist');
$title = $form->getValue('title');
$albums = new Application_Model_DbTable_Albums();
$albums->updateAlbum($id, $artist, $title);

Plik widoku jest identyczny jak w przypadku add.phtml:

zf-tutorial/application/views/scripts/index/edit.phtml
<?php
$this->title = "Edit album";
$this->headTitle($this->title);

echo $this->form ;
?>

Powiniene teraz mie moliwo edycji albumw.
Usuwanie albumu
W celu ukoczenia naszej aplikacji, musimy doda take funkcjonalno usuwania albumu. Posiadamy
przecie odnonik Delete przy kadym z albumw, jednak kasowanie albumu bezporednio to zbyt proste
podejcie. Byoby to po prostu ze. Majc na uwadze specyfikacj HTTP, pamitamy, e nie powinnimy
uywa metody GET w przypadku wywoywania nieodwracalnych akcji wskazane jest uycie zamiast tego
metody POST.


Strona 18 z 19
Powinnimy wywietli formularz potwierdzajcy ch usunicia albumu i usuna go dopiero wtedy, gdy
uytkownik kliknie przycisk Yes. Z racji tego, e formularz bdzie bardzo prosty, zakodujemy go
bezporednio w naszym widoku (w kocu korzystanie z Zend_Form jest opcjonalne).

Zacznijmy od kodu akcji IndexController::deleteAction():

zf-tutorial/application/controllers/IndexController.php
...
public function deleteAction()
{
if ($this->getRequest()->isPost()) {
$del = $this->getRequest()->getPost('del');
if ($del == 'Yes') {
$id = $this->getRequest()->getPost('id');
$albums = new Application_Model_DbTable_Albums();
$albums->deleteAlbum($id);
}
$this->_helper->redirector('index');
} else {
$id = $this->_getParam('id', 0);
$albums = new Application_Model_DbTable_Albums();
$this->view->album = $albums->getAlbum($id);
}
}
...

Tak samo jak w przypadku dodawnia i edycji, wykorzystamy metod obiektu dania isPost() w celu
okrelenia, czy powinnmy wywietli formularz potwierdzajcy usunicie czy te rzeczywicie usun
rekord. Skorzystamy z modelu Application_Model_DbTable_Albums oraz metody deleteAlbum() w
celu usuncia albumu. Jeli zdanie nie zostao przesane metod POST, pobierzemy odpowiedni rekord i
przypiszemy go do obiektu widoku korzystajc z parametru id.

Plik widoku zawiera prosty formularz:

zf-tutorial/application/views/scripts/index/delete.phtml
<?php
$this->title = "Delete album";
$this->headTitle($this->title);
?>
<p>Are you sure that you want to delete
'<?php echo $this->escape($this->album['title']); ?>' by
'<?php echo $this->escape($this->album['artist']); ?>'?
</p>
<form action="<?php echo $this->url(array('action'=>'delete')); ?>" method="post">
<div>
<input type="hidden" name="id" value="<?php echo $this->album['id']; ?>" />
<input type="submit" name="del" value="Yes" />
<input type="submit" name="del" value="No" />
</div>
</form>

Wywietlamy wiadomo potwierdzajc ch usunicia albumu, a nastpnie formularz z przyciskami Yes
oraz No. W ramach akcji sprawdzamy, czy uzytkownik wcisna przycisk Yes.

To wszystko posiadasz teraz w peni dziaajc aplikacj.

Podsumowanie
Dotarlimy do koca tego krtkiego kursu majcego na celu stworzenie prostej, lecz w peni funkcjonalnej
aplikacji bazujcej na wzorcu MVC za pomoc Zend Frameworka.Mam nadziej, e materia ten by dla
Ciebie interesujcy. Jeli znalaze jakie bdy, napisz prosz do mnie: rob@akrabat.com!


Strona 19 z 19
Ten kurs obj swoim zakresem tylko podstawowe zagadnia jest jeszcze wiele do odkrycia! Dodatkowo,
pominem wiele wyjanie. Na mojej stronie, http://akrabat.com znajdziesz wiele artykuw na temat Zend
Framewora. No i zdecydowanie powiniene przeczyta manual dostpny na stronie:
http://framework.zend.com/manual

Jeli jednak wolisz sowo drukowane, napisaem ksik nazwan Zend Framework in Action, ktr jest
dostpna w sprzeday. Wicej informacji znajdziesz na stronie http://www.zendframeworkinaction.com.
Sprawd

Od tumacza: W miar moliwoci staraem si przetumaczy dokument sowo w sowo, zachowujc styl
oryginau. Nie wnikaem w to, czy MVC w ZF w rzeczywistoci jest prawdziwym MVC, czy te Zendowy
widok naprawd jest widokiem wg definicji tego wzorca. To samo tyczy si innych wzorcw wspomnianych w
dokumencie. Takie rzeczy jak nazwy przyciskw, czy odnonikw nie byy tumaczone celowo.

You might also like