
Klasa widoku
Często na Waszych stronach wstawiacie jakiś system szablonów, np. Smarty. A potem biegacie po forach z pytaniami a jak zrobić to a jak tamto w takim Smarty. Dodatkowo taki system to jedna wielka kobyła, która na dobrą sprawę w niczym nie usprawnia życia, a wręcz czasami komplikuje. Często wpadacie na pomysł, by napisać własny system szablonów. Ale to również nie jest zbyt dobry pomysł. Zadam Wam pytanie: ale po co w ogóle bawić się w system szablonów? Odpowiecie zapewne: by oddzielić wygląd aplikacji od jej logiki. Tak, po to. Ale po co bawić się w system szablonów, który oprócz wprowadzanie własnej nowej składni nie robi tak naprawdę nic użytecznego. Może po prostu wprowadzić system, który będzie operował jedynie na czystym HTML oraz PHP. Wówczas nie trzeba poznawać żadnej nowej składni ani bawić się w dzikie parsowania szablonów. I taką właśnie klasę widoku chcę Wam dziś pokazać.
Słowniczek
Na początek wyjaśnienie paru pojęć, które padną podczas tego artykułu:
- Główny widok/szablon - plik, który zawiera ogólny wygląd naszej aplikacji. Zawiera całą otoczkę, nagłówek, stopkę, dołącza pliki js czy css. Może istnieć kilka widoków głównych, gdy np. jakaś akcja wymaga naprawdę innego wyglądu ogólnego
- Widok/szablon akcji - plik, który zawiera wygląd konkretnej akcji. Plik ten jest dołączany w głównym widoku
- Plik akcji - plik z kodem php, w którym wykonuje się logika danej akcji. W pliku tym można zapisywać dane odbierane w widoku.
- Portlet - plik z widokiem jakiegoś kawałka, który może być wykorzystywany w kilku różnych widokach, np. portlet z menu może być dołączany w głównym widoku 1 oraz w głównym widoku 2. Zamiast powtarzać w obu głównych widokach ten sam kod, po prostu tworzymy portlet i dołączamy go do widoków
- Plugin - kod php dołączany do widoku. Różni się od portletu tym, że w pluginie możemy wykonywać jakąś logikę, np. pobierać newsy z bazy i je wyświetlać, podczas gdy portlet służy jedynie do wyświetlania przygotowanych wcześniej danych
Klasa widoku
Klasa widoku ma za zadanie wyświetlanie naszych widoków, które tak naprawdę są zwykłym kodem PHP zmieszanym z HTML. Klasa jest naprawdę prosta i krótka. Posiada kilka podstawowych metod:
- Render - wyświetla podany widok oraz ustawia w nim zmienne, jeśli podano
Przykładowe wywołanie w widoku: $this->Render('portlet_menu'); - Escape - przetwarza dane, które teoretycznie mogą być niebezpieczne, np. pochodzące od użytkownika
Przykładowe wywołanie w widoku: $this->Escape($this->zmienna); - Plugin - wywołuje plugin, można przekazać tablicę parametrów
Przykładowe wywołanie w widoku: $this->Plugin('Main_News'); $this->Plugin('User_Online',array('par1'=>'war1'));
<?php
$view->zmienna1 = 'coś tam';
$view->zmienna2 = 5;
$view->tablica = array(1,2,3,4,5);
$view->tablica[5] = 6;
?>
Zaś w widoku zmienne te obieramy tak:
<?php
echo $this->zmienna1;
echo $this->zmienna2;
foreach ($this->tablica as $klucz => $wartosc) echo $klucz.' - '.$wartosc;
?>
Widok
Jak pisałem wcześniej widok, to po prostu plik z wymieszanym kodem HTML oraz PHP. W widoku do obiektu naszego widoku odwołujemy się przez $this. Przykładowy kod pliku widoku
<p>
<b>Witajcie na stronie głównej mojej testowej aplikacji</b>
</p>
<p>
A tutaj wartość zmiennej, którą przypisaliśmy w akcji:
<?php echo $this->Escape($this->zmienna); ?>
</p>
<p>A tutaj wyświetlamy zawartość tablicy</p>
<p>
<?php foreach ($this->tablica as $val): ?>
Wartość: <?php echo $val; ?><br />
<?php endforeach; ?>
</p>
Oczywiście wszystkie wykorzystane tu zmienne czy tablice przypisałem wcześniej w pliku akcji.
Przyjąłem, że pliki widoku mają rozszerzenie .phtml
Pluginy
Plugin to klasa odpalana w widoku i wykonująca jakąś logikę. W pluginie np. można pobrać newsy z bazy i wyświetlić je. Każdy plugin powinien dziedziczyć z klasy ViewPluginBase i implementować metodę Run, która to będzie wyświetlać to co dany plugin ma wyświetlać. Nazwa klasy pluginu ma się składać ze stałego członu "Plugin" a następnie Moduł_Nazwapluginu. Przykładowy kod pluginu:
<?php
class PluginMain_News extends View {
public function Run($params = array()){
//tutaj kod odpowiedzialny za pobieranie newsów z bazy.
//no wiecie, mysql_query, mysql_fetch_array i spółka
//ja tu teraz wstawię przykładowe newsy,
//bo nie chce mi się tworzyć tabel na potrzeby tej aplikacji
$news = 'Pierwszy news';
$news.= '<br />Drugi news';
$news.= '<br />Trzeci news';
echo $news; //i wyświetlamy newsy
}
}
?>
W widoku zaś do pluginu odwołujemy się tak:
<?php
$this->Plugin('Main_News');
//lub tak, jeśli chcemy przekazać jakieś parametry
$this->Plugin('Main_News', array('par1'=>$war1, 'par2'=> $war2));
?>
Struktura aplikacji
Na potrzeby zobrazowania jak działa widok stworzyłem na szybko pseudo aplikację MVC. Założyłem, że aplikacja składać się będzie z modułów a te zaś z akcji. W katalogu głównym znajdują się katalogi "actions" oraz "plugins". Pierwszy z nich jest katalogiem przeznaczonym na pliki akcji i pliki widoków. Katalog "actions" zawiera katalogi będące nazwami modułów a w nich są pliki akcji. Jeśli mamy np. akcję o nazwie "login" w module "user" to w katalogu "actions" znajdować się będzie katalog "user" z plikami login.php (plik akcji) oraz login.phtml (plik widoku).
Katalog "plugins" zawiera pluginy modułów. Tutaj również najpierw jest katalog z nazwą modułu a w nim dopiero pliki z pluginami modułu. Plik pluginu nazywać ma się tak: Nazwa.class.php, czyli np.: News.class.php
No i jeszcze bezpośrednio w katalogu "actions" znajdują się pliki głównych widoków czy też portlety przez nie wykorzystywane.
Przykładowa struktura aplikacji:
- actions
- main
- main.php
- main.phtml
- user
- login.php
- login.phtml
- register.php
- register.phtml
- index.phtml
- portlet_menu.phtml
- main
- plugins
- main
- News.class.php
- main
- index.php
Podsumowanie
I tyle, to wszystko jeśli chodzi o widok i klasę widoku. Jak widzicie żadnej filozofii tutaj nie ma. Prosty kod php a załatwia nam sprawę oddzielenia logiki aplikacji od jej wyglądu i nie trzeba się bawić w żadne kobylaste systemy szablonów.
Paczkę z klasą oraz przykładową aplikację wykorzystującą tę klasę jak zwykle znajdziecie w dziale download. Po przejrzeniu tej aplikacji podejrzewam, że rozjaśni Wam się bardziej w głowach .
Edit:
Najnowsza wersja View 1.1