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.
dr inż. Piotr Czapiewski
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
{
dr inż. Piotr Czapiewski
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>
dr inż. Piotr Czapiewski
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:
dr inż. Piotr Czapiewski
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>
dr inż. Piotr Czapiewski
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.