Prosty system szablonów w PHP



Logo PHP

Jak wiadomo system szablonów pozwala na oddzielenie kodu od wyglądu strony, co jednocześnie ułatwia pracę programistom oraz projektantom stron.

Na rynku prym wiedzie Smarty. Niestety, dla mało zaawansowanych programistów nauka korzystania z tego systemu może przysporzyć trochę problemów.

A co zrobić, gdy szukamy prostego, zajmującego mało miejsca, prostego w nauce systemu szablonów? Najlepiej napisać samemu! I temu chciałbym poświęcić ten post. Wspólnymi siłami napiszemy klasę, która będzie odpowiedzialna za przetworzenie naszego szablonu oraz w wstawienie w odpowiednie miejsca treści np pobrane z bazy danych.

Nasza klasa będzie wczytywała z folderu template plik o rozszeżeniu .tpl. Plik ten będzie zwykłym plikiem html ze specjalnymi słowami kluczowymi za, które podstawiana będzie treść. Słowa kluczowe będą miały formę taką samą jak te z Smarty, czyli {słowo_kluczowe}. Stwórzmy przykładowy plik html:

<html>
	<head>
		<title>{tytul}</title>
	</head>
	<body>
		<h1>{naglowek}</h1>
		<p>{tresc}</p>
	</body>
</html>

Teraz zajmiemy się napisaniem klasy naszego systemu. Tworzymy plik o nazwie layout.class.php, a w jego wnętrzu umieszczamy kod:

<?php
class lay {
	public $render;
	
	public function render($plik, $tablica){
		$this->render=file_get_contents("template/".$plik.".tpl");
			foreach($tablica as $t => $content){
				$this->render=str_replace("{".$t."}", $content, $this->render);
			}
		$this->render=preg_replace('({(.*?)})', "", $this->render);
	}
	
	public function __desctruct(){
			unset($this->render);
	}
	
	return $this->render;
}
?>

Omówię poszczególne elementy powyższej klasy:

class lay {
	public $render;

Tworzymy nową klasę o nazwie lay oraz zmienną z dostępem publicznym o nazwie $render, to w niej będzie przechowywany cały kod wyświetlany w przeglądarce. 

	public function render($plik, $tablica){

Rozpoczynamy nową funkcję o nazwie render, która będzie wczytywała plik z szablonem i wstawiała naszą treść w odpowiednie miejsca. Funkcja pobiera wartości dwóch zmiennych. Pierwsza zmienna $plik zawiera nazwę szablonu bez jego rozszerzenia, zmienna $tablica jest tablicą zawierającom dane, które mają być wstawione do szablonu.

		$this->render=file_get_contents("template/".$plik.".tpl");
			foreach($tablica as $t => $content){
				$this->render=str_replace("{".$t."}", $content, $this->render);
			}

W 6 linijce do zmiennej $this->render wczytujemy zawartość naszego pliku. Następnie w pętli podmieniamy wszystkie słowa kluczowe w pliku na naszą treść zawartą w tablicy $tablica.

		$this->render=preg_replace('({(.*?)})', "", $this->render);

W linii nr 10 usuwamy wszystkie słowa kluczowe, które nie zostały podmienione.

	public function __desctruct(){
			unset($this->render);
	}

Następnie tworzymy funkcję specjalną __destruct(), jest ona wywoływana na sam koniec działania klasy. W niej umieszczamy kod usuwający naszą zmienną. Jest, to przydatne w przypadku, kiedy chcemy użyć dwa różne szablony, np jeden wczytywany w drugi, nie nakładają nam się w tedy dane.

	return $this->render;

Na końcu naszej klasy zwracamy naszą zmienną z przetworzonym szablonem.

 Dobrze, gdy już mamy napisaną naszą klasę zajmującą się przetwarzaniem szablonów zajmiemy się kodem, który nam to wszystko ładnie poskłada :)

Tworzymy plik index.php i umieszczamy w nim kod:

<?php
include "layout.class.php";

$dane = array(tytul=>"Super strona", naglowek=>"Witaj", tresc=>"Witaj gorąco!");

$szablon = new lay();
echo $szablon->render("index", $dane);
?>

 I tak kod z linii drugiej wczytuje nam naszą klasę, w linii czwarej, natomiast tworzymy tablicę, w której pierwszy parametr to nasze słowa kluczowe z szablonu, a ich wartości zostaną wstawione w ich miejsca.

Po uruchomieniu pliku index.php w naszej przeglądarce powinien wygenerować się nam mniej więcej taki oto kod:

<html>
	<head>
		<title>Super strona</title>
	</head>
	<body>
		<h1>Witaj</h1>
		<p>Witaj gorąco!</p>
	</body>
</html>

Jak widać nasza klasa w prosty sposób szybko generuje nam gotowy kod html. Nasz system potrafi również generować poszczególne bloki strony, a później łączyć je w całość. 

<?php
include "layout.class.php";

$szablon = new lay();

$dane1 = array(naglowek=>"Witaj", tresc=>"Witaj gorąco!");

$tresc = $szablon->render("content", $dane1);


$dane2 = array(link1=>"index.html", link2=>"blog.html", link3=>"omnie.html", link4=>"kontakt.html");

$szablon->render("menu", $dane2);

$dane3 = array(tresc=>$tresc, menu=>$menu);

echo $szablon->render("index", $dane3);
?>

A oto przykładowe pliki szablonów:

content.tpl

		<h1>{naglowek}</h1>
		<p>{tresc}</p>

menu.tpl

<ul>
<li><a href="{link1}">Home</a></li>
<li><a href="{link2}">Blog</a></li>
<li><a href="{link3}">O mnie</a></li>
<li><a href="{link4}">Kontakt</a></li>
</ul>

index.tpl

<html>
	<head>
		<title>Moja strona</title>
	</head>
	<body>
		<h2>Menu:</h2>
		{menu}
		<hr />
		{tresc}
	</body>
</html>

A oto kod, jaki otrzymamy:

<html>
	<head>
		<title>Moja strona</title>
	</head>
	<body>
		<h2>Menu:</h2>
		<ul>
		<li><a href="index.html">Home</a></li>
		<li><a href="blog.html">Blog</a></li>
		<li><a href="omnie.html">O mnie</a></li>
		<li><a href="kontakt.html">Kontakt</a></li>
		</ul>
		<hr />
		<h1>Witaj</h1>
		<p>Witaj gorąco!</p>
	</body>
</html>

 I tak o to dotarliśmy do końca :) Myślę, że choć to skromny system szablonów, to może się przydać przy niektórych skromnych projektach. Mile widziane komentarze odnośnie błędów w kodzie. :)



Proszę czekać...
Nie możesz komentować. aki00 umieścił Cię na czarnej liście lub Twoje konto nie jest aktywne.