Laboratorium 6 Tworzenie bloga w Zend Framework Przygotowanie bazy danych 1. Wykonaj skrypt blog.sql, który założy w bazie danych dwie tabele oraz wpisze do nich przykładowe dane. Tabela blog_uzytkownicy posłuży do kontroli dostępu do bloga. Pole grupa w tabeli blog_uzytkownicy zawierać będzie jedną z wartości: admin, user. Tabela blog_wpisy przechowywać będzie posty dodawane do bloga. Pole autor odnosić się będzie do indeksu użytkownika w tabeli blog_uzytkownicy. Pola: tytul, tresc i skrot zawierać będą odpowiednio: tytuł wpisu, właściwą treść oraz wersję skróconą (do wyświetlenia na stronie głównej z odnośnikiem Więcej.). Pola id w obu tabelach będą automatycznie inkrementowane. Tworzenie projektu 1. Stwórz w Netbeans nowy projekt PHP z obsługą Zend Framework, sprawdź działanie nowego projektu. Konfiguracja projektu Zmiana przestrzeni nazw 1. Otwórz w edytorze tekstu plik application.ini (znajduje się w katalogu zfblog/application/configs). 2. Znajdź linię: appnamespace = "Application" I zamień na: appnamespace = "Blog" Podanej przestrzeni nazw będziemy używać jako przedrostka nazw tworzonych klas. Pozwoli to na automatyczne ładowanie definicji klas przez Zend Framework. Strona 1 z 6
Konfiguracja dostępu do bazy danych 1. Skonfiguruj dostęp do bazy danych na końcu sekcji [production], przed sekcją [staging : production], dodaj następujące linie: resources.db.adapter = "pdo_sqlite" resources.db.params.dbname = APPLICATION_PATH "/../blog.db" Tworzenie modeli 1. Do dostępu do danych posłużą klasy dziedziczące z Zend_Db_Table. Utworzymy po jednej klasie dla każdej tabeli w bazie danych. 2. W katalogu application/models utwórz plik Wpisy.php. W nim umieść definicję klasy Blog_Model_Wpisy: <?php class Blog_Model_Wpisy extends Zend_Db_Table_Abstract { protected $_name = 'blog_wpisy'; Pole $_name zawiera nazwę tabeli w bazie danych, do której dostęp będziemy uzyskiwać za pomocą tworzonej klasy. 3. Uwaga! Nazwy tworzonych klas są istotne także wielkość liter oraz użyte podkreślenia. Trzymanie się ustalonej konwencji nazewnictwa pozwoli na automatyczne ładowanie klas. Autoloader na podstawie nazwy klasy Blog_Model_Wpisy będzie szukał jej definicji w katalogu application/models/, w pliku Wpisy.php. 4. W ten sam sposób utwórz model dla tabeli blog_uzytkownicy. Wyświetlanie postów na stronie głównej 1. Na stronie głównej naszego bloga umieścimy listę wszystkich wpisów, wyświetlając ich tytuły oraz skróty. 2. W kontrolerze IndexController, w akcji indexaction, umieścimy kod pobierający z modelu wszystkie wpisy. Do pobrania wszystkich rekordów z bazy służy metoda fetchall(): public function indexaction() { $mdl = new Blog_Model_Wpisy(); $wpisy = $mdl->fetchall(); $this->view->dane=$wpisy; Strona 2 z 6
Znaczenie powyższego kodu jest następujące: a. Tworzymy obiekt klasy Blog_Model_Wpisy obiekt ten pośredniczy w dostępie do tabeli wpisy. b. Pobieramy wszystkie rekordy z tabeli. c. Pobrane rekordy przekazujemy do widoku. 3. Przekazane do widoku rekordy musimy jeszcze wyświetlić. Przejdź do pliku z widokiem, index.phtml. 4. Przekazany zbiór rekordów można traktować jak tablicę obiektów. Można po niej iterować za pomocą pętli foreach. Każdy element tablicy zawiera pola odpowiadające kolumnom w tabeli bazy danych. Przykład użycia: <?php foreach($this->dane as $wpis) { echo $wpis->tytul;?> Zwróć uwagę na zależność pomiędzy przypisaniem danych do widoku w kontrolerze oraz dostępem do tych danych w widoku. Jeżeli w kontrolerze wykonaliśmy przypisanie: $this->view->dane = $wpisy; wówczas w widoku dostęp do danych mamy poprzez zmienną: $this->dane 5. Kompletny kod widoku wyświetlającego listę wpisów: <h1>zf Blog</h1> <?php foreach($this->dane as $wpis) { echo '<div class="wpis">'; echo '<h2>'. $wpis->tytul. '</h2>'; echo '<p>'. $wpis->skrot. '</p>'; echo '</div>';?> Wyświetlanie całej treści wpisu 1. Dodamy akcję pokaz powodującą wyświetlenie pełnej treści wybranego wpisu. Akcja będzie wywoływana po kliknięciu przez użytkownika linka Więcej pod skrótem wpisu na stronie głównej. 2. Akcja przyjmować będzie jeden parametr przekazany poprzez URL id wpisu, który należy wyświetlić. 3. Dodaj nową akcję wydając komendę: Strona 3 z 6
zf create action pokaz Index Spowoduje to dodanie nowej akcji pokazaction w kontrolerze IndexController, a także utworzenie odpowiedniego pliku widoku (pokaz.phtml). 4. W kodzie akcji wykonamy kolejno następujące czynności: a. Pobranie id wpisu z parametrów żądania metoda $this->getrequest()->getparam(). b. Stworzenie instancji modelu Blog_Model_Wpisy. c. Pobranie wpisu o podanym id metoda find(). d. Przekazanie pobranego wpisu do widoku. Kompletny kod akcji pokaz: public function pokazaction() { $id = $this->getrequest()->getparam('id'); $mdl = new Blog_Model_Wpisy(); $wpis = $mdl->find($id)->current(); $this->view->wpis = $wpis; Metoda find przyjmuje jako argument wartość klucza głównego w szukanym rekordzie (lub tablicę z listą kluczy głównych wielu szukanych rekordów). Zwrócić może kilka rekordów jeśli mamy pewność, że zwróci dokładnie jeden, pobieramy go metodą current(). 5. Uzupełnimy kod widoku index.phtml, tak by pod tytułem i skrótem wpisu pojawiał się link Więcej prowadzący do akcji pokaz. W pliku index.phtml, wewnątrz pętli wyświetlającej wpisy, dodaj następujący kod: $url = $this->baseurl(). '/index/pokaz/id/'. $wpis->id; echo '<p><a href="'. $url. '">Więcej...</a></p>'; Tak utworzony link będzie prowadził do akcji pokaz w kontrolerze index, przekazując jej jeden parametr o nazwie id i wartości równej polu id z wyświetlanego wpisu. Przykładowy link dla id=7: <a href="http://localhost/blog/public/index/pokaz/id/7">więcej...</a> Zadanie 1. Dodaj w widoku pokaz.phtml kod wyświetlający szczegóły wpisu (tytuł, data dodania, pełna treść). Strona 4 z 6
Layout strony 1. Włączymy obsługę Zend Layout mechanizmu pozwalającego na stworzenie szablonu, wewnątrz którego wyświetlane będą wszystkie widoki. 2. Z linii poleceń wydaj komendę: zf enable layout Spowoduje to: a. dodanie w pliku index.php kodu inicjalizującego Zend_Layout, b. dodanie w pliku konfiguracyjnym application.ini wpisu wskazującego na katalog szablonów, c. utworzenie głównego szablonu o nazwie layout.phtml. 3. Otwórz w edytorze plik application/layouts/scripts/layout.phtml, przyjrzyj się jego zawartości. Sprawdź działanie aplikacji. 4. Zmień kod szablonu na następujący: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>zf Blog</title> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <link rel="stylesheet" type="text/css" href="<?php echo $this->baseurl();?>/main.css"> </head> <body> <div id="page"> <div id="menu"> <a href="<?php echo $this->baseurl();?>">strona główna</a> <a href="">dodaj wpis</a> <a href="">zaloguj</a> </div> <div id="content"> <?php echo $this->layout()->content;?> </div> </div> </body> </html> Strona 5 z 6
5. Stwórz plik main.css, umieść go w katalogu public. Przykładowa zawartość pliku: body { background-color: #ffffd0; #page { background-color: white; margin: 0 auto; width: 640px; #menu { background-color: blue; text-align: center; #menu a { color: white; font-family: sans-serif;.wpis { border: thin dashed gray; Strona 6 z 6