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.