Witaj, Gościu O nas | Kontakt | Mapa
Wortal Forum PHPEdia.pl Planeta Kubek IRC Przetestuj się!

Wprowadzenie do OPT cz. 1

Listy

Open Power Template to nie tylko prymitywne umieszczanie danych w szablonie. Biblioteka udostępnia szereg narzędzi pozwalających na zaawansowaną manipulację informacjami. W praktyce po stronie szablonu mamy do swej dyspozycji całkiem niezły język programowania, z obsługą zmiennych, wyrażeń, pętli oraz instrukcji warunkowych. Jednak należy to traktować bardziej jako ciekawostkę, ponieważ wraz z nim dostajemy również instrukcje pozwalające choćby częściowo o programowaniu zapomnieć, które zautomatyzują wiele czynności. Jedną z nich są sekcje. Służą one do generowania wszelkiego rodzaju list za pomocą niezwykle prostej składni. Poniższy przykład pokazuje, jak stworzyć listę albumów muzycznych.

Zaczynamy od szablonu. Stworzenie sekcji polega po prostu na określeniu wyglądu pojedynczego elementu listy - resztą zajmuje się OPT:

<html>
<head>
  <title>Open Power Template: albumy muzyczne</title>
</head>
<body>
	<h3>Moja lista albumów</h3>
	
	<ul>
	{section=album}
	<li>{$album.tytul} - {$album.zespol} ({$album.rok})</li>	
	{/section}
	</ul>
</body>
</html>

Nasz element ograniczony jest znacznikami {section=album} (tu określamy też nazwę sekcji - musi być ona unikalna, abyśmy mogli podpiąć do niej później dane listy) oraz zamykającym {/section}. Aby wstawić w jakimś miejscu dane elementu, używamy specjalnego bloku sekcji, np. {$album.tytul}. Jak widać, zbudowany jest on z dwóch części oddzielonych kropką. Pierwsza to nazwa naszej sekcji, druga to nazwa jednego z bloków niesionych przez dany element.

Przejdźmy teraz do skryptu. Zaczniemy od utworzenia tabelki w bazie danych:

CREATE TABLE `albumy` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`tytul` VARCHAR( 50 ) NOT NULL ,
`zespol` VARCHAR( 50 ) NOT NULL ,
`rok` SMALLINT NOT NULL 
) ENGINE = MYISAM;
 
INSERT INTO `albumy` VALUES (1, 'Nightflight to Venus', 'Boney M.', 1978);
INSERT INTO `albumy` VALUES (2, 'Take The Heat Off Me', 'Boney M.', 1976);
INSERT INTO `albumy` VALUES (3, 'Spirits Having Flown', 'Bee Gees', 1979);
INSERT INTO `albumy` VALUES (4, 'Saturday Night Fever', 'Bee Gees', 1977);

Kolejnym krokiem jest napisanie samego skryptu. Dane dla listy dostarczane są w postaci tablicy zawierającej poszczególne jej elementy. Są one również tablicami zawierającymi pojedyncze informacje, np. tytul czy zespol. Tak więc takie coś musimy generować.

<?php
	define('OPT_DIR', './lib/');
	require('./lib/opt.class.php');
 
	try
	{	
		$tpl = new optClass;
		$tpl -> root = './templates/';
		$tpl -> compile = './templates_c/';
		$tpl -> gzipCompression = true;
		$tpl -> httpHeaders(OPT_HTML);
		
		$pdo = new PDO('mysql:host=localhost;port=3305;dbname=test',
		 'root', 'root'); // 1
		
		$stmt = $pdo -> query('SELECT * FROM albumy ORDER BY rok');
		$result = array(); // 2
		
		while($row = $stmt -> fetch())
		{
			$result[] = array( // 3
				'tytul' => $row['tytul'],
				'zespol' => $row['zespol'],
				'rok' => $row['rok']			
			);
		}
		$stmt -> closeCursor();
		
		$tpl -> assign('album', $result); // 4	
		
		$tpl -> parse('szablon4.tpl'); 
	}
	catch(optException $exception)
	{ 
		optErrorHandler($exception); 
	}
?>

Jego działanie jest następujące:

  1. Najpierw łączymy się z MySQL-em za pomocą biblioteki PHP Data Objects.
  2. Przygotowujemy pustą tablicę.
  3. Zapisujemy tablicę z danymi o każdym albumie do naszego zbiornika na elementy: $result jako kolejny jego element.
  4. Korzystamy z metody assign(), aby przypisać wygenerowaną tablicę do naszej sekcji album.

To wszystko. Po uruchomieniu tego skryptu zobaczysz, że OPT wygenerował nam ładną listę albumów. Pójdźmy jednak dalej od strony szablonu, aby przekonać się nieco o możliwościach biblioteki. Na początek zastanówmy się, co będzie, jeśli w bazie albumów niczego nie będzie. Odpowiedź jest prosta: dostaniemy w kodzie puste znaczniki <ul></ul> i nic więcej. Istnieje kilka sposobów na powiadomienie internauty o kłopocie - co ważniejsze, żaden z nich nie wymaga zmieniania czegokolwiek w kodzie PHP! Możemy sprawdzić instrukcją warunkową, czy sekcja zawiera jakieś elementy, a jeśli nie, powiadomić go o tym:

<html>
<head>
  <title>Open Power Template: albumy muzyczne</title>
</head>
<body>
	<h3>Moja lista albumów</h3>
	
	{if count($album) > 0}
	<ul>
	{section=album}
	<li>{$album.tytul} - {$album.zespol} ({$album.rok})</li>
	{/section}
	</ul>
	{else}
	<p>Brak albumów!</p>
	{/if}
</body>
</html>

Jednak w tym przypadku zbliżamy się za bardzo do programowania. OPT udostępnia lepszy oraz nieco szybszy sposób polegający na rozbudowaniu sekcji o dodatkowe znaczniki: {show} oraz {/show}. Jeżeli zdecydujemy się na ich zastosowanie, to właśnie w nich ustalamy parametry sekcji, natomiast znacznik {section} pozostaje pusty:

<html>
<head>
  <title>Open Power Template: albumy muzyczne</title>
</head>
<body>
	<h3>Moja lista albumów</h3>
	
	{show=album}
		<ul>
		{section}
		<li>{$album.tytul} - {$album.zespol} ({$album.rok})</li>
		{/section}
		</ul>
	{showelse}
		<p>Brak albumów!</p>
	{/show}
</body>
</html>

Teraz OPT ma jasno określone: to jest otoczenie listy będące jej integralną częścią; to jest wygląd pojedynczego elementu listy; to jest tekst alternatywny, jeśli lista nie posiada elementów.

Sekcja umożliwia wykonywanie prostych manipulacji na danych. Spróbujmy teraz wyświetlić ją w odwrotnej kolejności (nadal nie ruszając nic w kodzie PHP!) oraz jakoś wyróżnić pierwszy element:

<html>
<head>
  <title>Open Power Template: albumy muzyczne</title>
</head>
<body>
	<h3>Moja lista albumów</h3>
	
	{show=album; reversed}
		<ul>
		{section}
		{if $opt.section.album.first}
		<li><strong>{$album.tytul}</strong> - 
			{$album.zespol} ({$album.rok})</li>
		{else}
		<li>{$album.tytul} - {$album.zespol} ({$album.rok})</li>
		{/if}
		{/section}
		</ul>
	{showelse}
		<p>Brak albumów!</p>
	{/show}
</body>
</html>

Jeśli chodzi o odwracanie kolejności, wystarczy w parametrach sekcji dopisać słowo "reversed". Wyróżnienie pierwszego elementu to sprawa nieco bardziej skomplikowana. Musimy skorzystać koniecznie z pomocy instrukcji warunkowej, lecz OPT w tym momencie pomaga automatycznie stworzyć odpowiedni warunek. Blok specjalny $opt daje dostęp do różnych ciekawych danych - w tym wypadku w postaci $opt.section.album.first zwraca on true, jeżeli aktualnie przetwarzany element sekcji album jest jej pierwszym elementem. Możemy z tego skorzystać do zdefiniowania dla niego alternatywnego wyświetlania.

Informacje na podobny temat:
Wasze opinie
Wszystkie opinie użytkowników: (11)
Dużej różnicy w stosunku do Smarty nie widać
Sobota 16 Kwiecień 2011 12:28:13 am - neosatan <pawel.kuznik_at_gmail.com>

Niestety, z wielkim rozczarowaniem doczytałem do końca arta. OPT był mi zachwalany jako genialna alternatywa dla SMARTY, lecz przynajmniej po tym artykule muszę stwierdzić, że OPT nie rozwiązuje problemów, które są w SMARTY (lub nie zostały takowe wspomniane). Moje wrażenie jest mniej więcej takie, że OPT jest bardzo podobne do SMARTY. Twórcy OPT zamiast tworzyć nowy, bardzo podobny silnik szablonów, mogli zaproponować współpracę twórcą SMARTY, lub wydanie alternatywnej wersji.
Muszę powiedzieć, że SMARTY (przynajmniej na razie) góruje nad OPT tym, że jest akceptowany za granicą, co jest plusem dla programistów pracujących również z zagranicznymi firmami.
Tak, czy owak artykuł skłonił mnie do bliższego przyjrzenia się OPT.

OPT
Wtorek 30 Czerwiec 2009 4:19:12 pm - pearl1985

Zrobiłem sobie dzisiaj porównanie szablonów między smarty a opt i szczerze powiem, że o ile obydwa systemy szablonów generują pliki php i je później includują do zdobycia danych do wyjścia, to smarty robi to znacznie szybciej (<!-- Skrypt wykonał się w 0.0013339519500732 sekund --> dla smarty, <!-- Skrypt wykonał się w 0.032589912414551 sekund --> dla opt). Reasumując jaki z tego wniosek? Moim zdaniem lepiej napisać prostą klasę, która będzie składowała dane i potem robiła include już napisanego przez nas szablonu w php. A w tym php odpowiednie odwoływanie się do zmiennych przechowywanych przez klasę np. template.

ciekawe
Sobota 19 Styczeń 2008 2:02:05 pm - potreb

Jestem pod wrażeniem, jakby nie było jest to dość wielka alternatywa dla smarty

Ankieta
Czwartek 18 Październik 2007 6:59:19 pm - grzesk98 <grzegorz.kowalewski_at_gmail.com>

Jeśli moglibyście wypełnić ankietę na temat systemów szablonów:

http://ankiety.boby.pl/index.php?module=polls&action=fillup&poll_id=74

z góry dzięki.

OPT
Poniedziałek 08 Październik 2007 2:28:35 pm - Diabl0

Czy OPT w pełni obsługuje obiekty w szablonach? Chodzi mi o kostrukcje takie jak:
{$zmienna->metoda1()->metoda2();}

Smarty sobie niestety nie radzi z takim czymś a znacznie ułatwiło by mi to pracę.

Brak porównań do Smarty
Niedziela 01 Lipiec 2007 11:10:05 pm - Diabl0

Wszystko bardzo fajnie i ładnie, ale brakuje mi w treści porównań względem Smarty'ego. Jak wiadomo przyzwyczajenie jest silne i dla kogoś kto już używa (używał) Smarty i szuka czegoś innego/lepszego takie porównania i wyjaśnienia były by bardzo wygodne.
Przy porównywaniu chętnie bym także zobaczył informację o wydajności - Smarty jest fajne i baaardzo elastyczne ale z wydajnością nie jest wesoło i informacje o wydajności OPT w stosunku do Smarty mogły by sporo osób skusić do sprawdzenia tego w praktyce.

ee tam
Czwartek 10 Maj 2007 3:30:38 am - yacho

i tak odchodzi sie od znacznikow w szablonach na rzecz plain php templates - nie oszukujmy sie - kazdy szablon ma jakas logike prezentacji i nie ma co sie oszukiwac ze kiedys maksymalnie to sie uprosci - co jest wazne to separacja i enkapsulacja warstw - a sama skladnia juz nie tak mocno.

Odp dla sh4dow
Piątek 16 Marzec 2007 7:57:59 pm - slump <slump_ilawa_at_wp.pl>

sh4dow jeśli oczekujesz odp na te pytania napisz do zyxa lub skorzystaj z openpb.net/forum :) celowo nie daję jako link aby nie było za dużego spamu w tym komentarzu.

Pytanie
Czwartek 01 Marzec 2007 9:34:32 am - sh4dow

Tak sie zastanawiam, jak mozna krytykowac sposob nazewnictwa metod/funkcji. No w sumie i dlaczego camel style ma byc "eleganckim" nazewnictwem ? Wiem czepiam sie ale tak jakos nie daje mi to spokoju.
A co do wsparcia wielojęzykowego to tutaj bym mocno polemizowal i zastanawial sie raczej jak mozna by to raczej poprawic. Bo sorki ale jesli ja mam baze gdzie jest okolo 5000 kluczy i do tego 6 jezykow to nie chcial bym widziec jak te pliki i tablice z tlumaczeniami by wygladaly.

koment
Środa 28 Luty 2007 1:40:27 pm - mrm

dobry art

koment
Środa 28 Luty 2007 1:39:19 pm - mrm

bardzo fajny artykul

Mentax.pl    NQ.pl- serwery z dodatkiem świętego spokoju...   
O nas | Kontakt | Mapa serwisu
Copyright (c) 2003-2022 php.pl    Wszystkie prawa zastrzeżone    Powered by eZ publish Content Management System eZ publish Content Management System