Open Power Template

Z PHPEdia.pl
Skocz do: nawigacji, wyszukiwania

Open Power Template jest polskim systemem szablonów rozwijanym od 2004 roku. Początkowo był częścią projektu forum dyskusyjnego Open Power Board i stanowił bardziej alternatywę dla Smarty, lecz bardzo szybko się usamodzielnił i poszedł własną drogą rozwojową. Obecnie w końcowej fazie produkcji jest OPT 2.0, zaprojektowany i napisany całkowicie od zera.

Opis

Niemal wszystkie współczesne aplikacje stosują podział na warstwę logiczną zajmującą się pobieraniem i obróbką danych oraz warstwę prezentacji odpowiedzialną za ich wyświetlanie (generacja kodu HTML). Open Power Template zapewnia obsługę warstwy prezentacji poprzez obiektowy interfejs oraz szablony definiujące wygląd poszczególnych podstron. Do tworzenia szablonów OPT wykorzystuje język XML z własnym zestawem dodatkowych znaczników służących do osadzania danych ze skryptu. Został on wprowadzony z powodu czytelności, możliwości kontroli poprawności kodu HTML już na etapie tworzenia szablonu oraz prostej realizacji zadań trudno wykonywalnych z poziomu czystego PHP.

Zalety

  1. Programowanie deklaratywne - w warstwie prezentacji nie ma zbyt dużo różnorodnych algorytmów. OPT stara się je zebrać i opakować w proste w użyciu elementy, dzięki czemu twórca szablonu może skoncentrować się na tym, co chce osiągnąć, a nie - jak to zaimplementować.
  2. Przenośność - szablony są w dużym stopniu niezależne od struktury aplikacji, co umożliwia ponowne wykorzystanie ich w całości lub części w innych projektach oraz refaktoring kodu bez konieczności modyfikowania szablonów.
  3. Wydajność - ponieważ szablony kompilowane są do czystego PHP jedynie w wyniku ich modyfikacji, podczas normalnego użytkowania koszt wykorzystania OPT jest niemal identyczny, jak każdego innego rozwiązania zapewniającego separację warstw logiki i prezentacji, zależnie od jakości wyprodukowanego kodu wynikowego.

Wady

  1. Odmienne, niż w przypadku PHP podejście do tworzenia szablonów wymaga nieco czasu na jego opanowanie.
  2. Wsparcie dla frameworków we wczesnej fazie rozwoju, co na początku utrudnia integrację.
  3. Utrudnione (aczkolwiek nie niemożliwe) generowanie danych w formatach nie-XML-owych.

Używanie OPT

Najnowszą wersję OPT 2.0 można ściągnąć ze strony www.invenzzia.org. Po rozpakowaniu archiwum musimy przenieść zawartość katalogu /lib do drzewa katalogowego naszego projektu, a także utworzyć dwa dodatkowe foldery: /templates oraz /templates_c odpowiednio na źródłowe oraz skompilowane wersje szablonów. Musimy upewnić się, że PHP posiada prawa zapisu do drugiego z nich.

Stwórzmy przykładowy zestaw szablonów dla prostej witryny internetowej. Musimy zacząć od napisania szkieletu zawierającego nagłówek i stopkę strony wraz z oznaczonym miejscem, gdzie będzie wyświetlać się treść. Zapiszemy go w katalogu /templates jako layout.tpl:

<?xml version="1.0" ?>
<opt:root>
  <opt:prolog />
  <opt:dtd template="xhtml10transitional"/>
  <html>
    <head>
      <meta http-equiv="Content-Type" parse:content="$contentType" />
      <title>{$title}</title>
    </head>
    <body>
      <div id="header">
        <h1>Moja witryna WWW</h1>
      </div>
      <div id="content">
       <opt:section name="modules">
         <opt:include from="modules">
           <p class="error">Przepraszamy, nie można załadować podanego modułu.</p>
         </opt:include>
       </opt:section>
      </div>
      <div id="footer">
        <p>Przykładowy skrypt wykorzystujący OPT.</p>
      </div>
    </body>  
  </html>
</opt:root>

Mamy tutaj znacznik opt:root, w którym możemy zamknąć całą pozostałą treść szablonu. Zapewnia on zgodność ze standardem XML wymagającym, aby dokument miał jeden główny element. Instrukcje opt:prolog i opt:dtd generują wyjściowy prolog i DTD dokumentu. W przypadku tej drugiej możemy skorzystać z gotowych szablonów DTD dla najpopularniejszych wersji HTML-a i XHTML-a.

Sposobem na osadzanie danych ze skryptu są zmienne, które zapisujemy identycznie, jak w PHP: $zmienna. Jeśli chcemy umieścić je gdzieś w treści znacznika, musimy zamknąć je w nawiasach klamrowych, tak jak to zrobiliśmy w znaczniku TITLE. Wklejanie wartości zmiennych do atrybutów rządzi się trochę innymi prawami. W tym wypadku musimy poprzedzić nazwę atrybutu słowami parse:, dzięki czemu OPT będzie wiedzieć, że $contentType nie jest wartością, ale zmienną, z której ta wartość ma być pobrana. W OPT nie musisz martwić się o filtrowanie zawartości zmiennych, gdyż jest to robione automatycznie, a w razie konieczności możesz kontrolować ten proces zależnie od potrzeb i upodobań.

Przejdźmy teraz do znacznika DIV o identyfikatorze content. Znajduje się tam pewna konstrukcja pozwalająca na dołączanie w tym miejscu dowolnej liczby innych szablonów. Instrukcja opt:section to rodzaj inteligentnej pętli. Od odpowiedników PHP różni się tym, że ukrywa maksymalnie dużo szczegółów implementacyjnych, automatycznie dopasowuje się do rodzaju danych, a gdy zostaje zagnieżdżona - samodzielnie buduje relację (przydatne przy wyświetlaniu np. listy kategorii i przypisanych do nich elementów). Właściwie można powiedzieć, że znacznik opt:section określa miejsce, w którym ma być wyświetlona lista, a jego zawartość opisuje wygląd pojedynczego elementu. W naszym przypadku mówimy, że zawartość ma być wzięta z innego szablonu (instrukcja opt:include), a informacje o tych szablonach zawierają kolejne elementy sekcji modules. Gdyby szablonu nie udało się załadować, treść znacznika opt:include opisuje wygląd komunikatu błędu. Na tym etapie nie musimy zajmować się sprawami technicznymi takimi, jak czym tak naprawdę są elementy sekcji, jak po nich iterować oraz jak to ma działać. Opisujemy jedynie, co chcemy uzyskać.

Możemy także napisać dwa szablony treści:

modul1.tpl

<?xml version="1.0" ?>
<opt:root>
  <h2>Moduł 1</h2>
  <p>Witaj, jestem modułem 1</p>
  <p>Dzisiaj jest: {$date}</p>
</opt:root>

modul2.tpl

<?xml version="1.0" ?>
<opt:root>
  <h2>Moduł 2</h2>
  <p>Jestem modułem 2</p>
  <p>Motto na dziś to: {$motto}</p>
</opt:root>

Następnie należy napisać skrypt PHP, który będzie potrafił korzystać z tak zdefiniowanych szablonów.

<?php
// Musimy zaladowac jeden z plikow biblioteki umieszczony w /lib/Opl/Base.php w sciagnietym archiwum
require('/sciezka/do/lib/Opl/Base.php');
// Definiujemy sciezke do plikow OPT i OPL
Opl_Loader::setDirectory('/sciezka/do/lib/');
// Rejestrujemy autoloader
Opl_Loader::register();
 
try
{
   $tpl = new Opt_Class();
   $tpl->sourceDir = './templates/';    // sciezka do katalogu /templates
   $tpl->compileDir = './templates_c/'; // sciezka do katalogu /templates_c
   $tpl->setup();
 
   $moduleView = new Opt_View('modul1.tpl');
   $moduleView->date = date('d.m.Y');
 
   $layout = new Opt_View('layout.tpl');
   $layout->title = 'Moja witryna WWW';
 
   // wstaw do widoku layoutu widoki poszczegolnych modulow.
   $layout->modules = array(0 => array('view' => $moduleView));
   $layout->contentType = 'text/html; charset=UTF-8';
 
   $output = new Opt_Output_Http();
   $output->setContentType(Opt_Output_Http::XHTML, 'utf-8');
   $output->render($layout);
}
catch(Opt_Exception $exception)
{
   Opt_Error_Handler($exception);
}

Zwróćmy uwagę, że OPT posiada interfejs zbliżony w użyciu do rozwiązań stosowanych we frameworkach. Po stronie skryptu operujemy na obiektach klasy Opt_View reprezentujących widoki. Przez widok rozumiemy szablon wraz z przypisanymi do niego danymi. Oczywiście cały widok może wchodzić w skład danych dla innego widoku - korzystamy z tego właśnie do umieszczenia widoku modułu w widoku layoutu. Wykonywaniem szablonów zajmują się systemy wyjścia decydujące, co zrobić z wyprodukowanym kodem wynikowym. Jedno z nich, Opt_Output_Http wysyła go do przeglądarki, a przy okazji pozwala także zarządzać nagłówkami HTTP.

Odnośniki zewnętrzne

  1. Strona domowa pakietu Open Power Libs, w którego skład wchodzi OPT