(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:
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:
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]:
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:
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:
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():
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:
/* 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:
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');
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);
$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.
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:
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);
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():
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.
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.