dr inż. Piotr Czapiewski
Systemy zarządzania treścią
Laboratorium 8
Laboratorium 8 – Tworzenie bloga w Zend Framework
Przygotowanie bazy danych
1. Korzystając z lokalnego MySql utwórz użytkownika oraz bazę danych o nazwie nazwisko_zfblog, np. kowalski_zfblog
2. Utwórz trzy tabele – grupy, uzytkownicy oraz wpisy – o strukturze przedstawionej poniżej.
Wszystkie pola id powinny być automatycznie inkrementowane (typ integer auto_increment).
Tabele grupy i uzytkownicy posłużą do kontroli dostępu do bloga. Pole grupa w tabeli uzytkownicy zawierać będzie indeks z tabeli grupy (np. 1 dla grupy Administratorzy, 2
dla grupy Autorzy).
Tabela wpisy przechowywać będzie posty dodawane do bloga. Pole autor odnosić się będzie do indeksu użytkownika w tabeli uzytkownicy. Pola: tytul, tresc i skrot zawierać będą odpowiednio: tytuł wpisu, właściwą treść oraz wersję skróconą wyświetlany na stronie głównej z odnośnikiem Więcej….
3. Dodaj do bazy dane:
• grupy: Administratorzy i Autorzy;
• użytkownicy: admin – należący do grupy Administratorzy, user – należący do grupy Autorzy;
• wpisy: 2-3 przykładowe, krótkie posty.
Sprawdzenie konfiguracji środowiska PHP
1. Sprawdź, czy narzędzie Zend Tool jest dostępne z linii poleceń – wydaj komendę: zf show version
Jeśli wersja Zend Framework nie zostanie wyświetlona, przygotuj środowisko zgodnie z instrukcją do ćwiczenia 7.
Systemy zarządzania treścią
Laboratorium 8
Tworzenie projektu
1. W linii poleceń przejdź do katalogu WebServ/httpd.
2. Wydaj polecenie tworzenia nowego projektu:
zf create project zfblog
3. Sprawdź działanie nowego projektu – w przeglądarce wejdź na adres:
http://localhost/zfblog/public/
Konfiguracja projektu
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.
3. Skonfiguruj dostęp do bazy danych – na końcu sekcji [production] dodaj następujące linie:
resources.db.adapter = "pdo_mysql"
resources.db.params.host = "localhost"
resources.db.params.username = "kowalski_zfblog"
resources.db.params.password = "hasło"
resources.db.params.dbname = "kowalski_zfblog"
resources.db.params.charset = "utf8"
Zmień nazwę użytkownika, hasło oraz nazwę bazy danych na właściwe.
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
{
Systemy zarządzania treścią
Laboratorium 8
protected $_name = '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.
4. W ten sam sposób utwórz modele dla tabel: grupy i 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 poprzez model służy metoda fetchAll():
public function indexAction() {
$mdl = new Blog_Model_Wpisy();
$wpisy = $mdl->fetchAll();
$this->view->dane=$wpisy;
}
3. Znaczenie powyższego kodu jest następujące:
a. Tworzymy obiekt klasy Blog_Model_Wpisy – model ten pośredniczy w dostępie do tabeli wpisy.
b. Pobieramy wszystkie rekordy z tabeli.
c. Pobrane rekordy przekazujemy do widoku.
4. Przekazane do widoku rekordy musimy jeszcze wyświetlić. Przejdź do pliku z widokiem, index.phtml.
5. 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;
}
?>
6. Kompletny kod widoku wyświetlającego listę wpisów:
<h1>ZF Blog</h1>
Systemy zarządzania treścią
Laboratorium 8
<?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 przyjmować będzie jeden parametr przekazany poprzez URL – id wpisu, który należy wyświetlić.
2. Dodawanie nowej akcji – z linii poleceń wydaj komendę:
zf create action pokaz Index
Spowoduje to dodanie nowej akcji pokazAction w kontrolerze IndexController, a także utworzenie odpowiedniego pliku widoku (pokaz.phtml).
3. 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().
4. 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:
Systemy zarządzania treścią
Laboratorium 8
$url = $this->url(array('controller' => 'index', 'action' => 'pokaz'))
. '/id/' . $wpis->id;
echo '<p><a href="' . $url . '">Więcej...</a></p>'; Powyższy kod spowoduje wyświetlenie linka postaci:
http://localhost/zfblog/public/index/pokaz/id/1
Zadanie
1. Dodaj w widoku pokaz.phtml kod wyświetlający szczegóły wpisu (tytuł, data dodania, pełna treść).
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>
Systemy zarządzania treścią
Laboratorium 8
<div id="content">
<?php echo $this->layout()->content; ?>
</div>
</div>
</body>
</html>
Zadanie
1. 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;
}
2. Dodaj reguły określające formatowanie tytułów postów i daty dodania. Zmodyfikuj arkusz stylów tak, by twoja strona odróżniała się od innych.