Webcity.pl


  [tutorial] Realistyc...

  Własny mechanizm ses...

  Galeria w PHP

  SimpleXML nadchodzi!

  Obsługa MySQL'a w PH...

 

 02.02.06 - [new] E-video - artykuł

 30.01.06 - [update] Artykuł o sesjach

 18.12.05 - [update] PDO - artykuł

 19.08.05 - [new+upd] Aktualizacja materia...

 26.04.05 - [update] Nowy artykuł



  Pomocy WML
[php]Sesje nie działają, ...
[actionscript 2.0] [flash...
Problem z talicami w php
[ocena] llll.pl darmowe a...
Kamera na stronie interne...
Kamera na stronie interne...
[xml] Jak wyciągnąć dane
Wizualizacja w JS - POMOC
Web Developer - stała / f...

... i wiele innych wątków na forum ›

Partnerzy
› allRSS.info - katalog zasobów RSS
› iloveflyer.org - webdesign
› webserv.pl - serverpack
› skryptoteka.pl - mnóstwo skryptów
› vel.pl - hosting
› TelePraca.net - pracuj swobodnie
› PHP Solutions - magazyn PHP
› HELION - wydawnictwo informatyczne

Ksišżka dnia

CityMag
Wpisz swój e-mail, aby zaprenumerować nasz Magazyn, który zawiera najnowsze informacje ze świata i najciekawsze teksty.
 

Szukasz czegoś?
Nasza wyszukiwarka znajdzie wszystko, czego szukasz.
 

Szukanie zawansowane


  Reklama
  Redakcja
  Hosting
  Kanał

© WebCity.pl Team
 
 
  Forum Forum
Kursy Kursy
Porady Porady
Recenzje Recenzje
Newsy Newsy
Katalog stron WWW Katalog
Skrypty PHP Skrypty
Download Oferty i praca
Artykuły:
 Teoria
 Praktyka
 Promocja
 Inne
 

 Webcity.pl |

Open Power Template - rzut okiem

Autor: Zyx
   Rynek systemów szablonów jest zdominowany przez Smarty'ego. Jest on z pewnością najszybszym i najbardziej wydajnym rozwiązaniem, aczkolwiek nie jest pozbawiony wad. Nic dziwnego zatem, że powstał właśnie system, który w przyszłości stać się może poważną alternatywą dla tego systemu - Open Power Template. Tym bardziej cieszyć powinno, że jest on tworzony przez Polaków.
   Open Power Template domyślnie powstaje z myślą o innym polskim projekcie: Open Power Board (http://www.opbp.info/) mającym na celu stworzenie polskiego forum dyskusyjnego mogącego konkurować z takimi gigantami, jak InvisionBoard, czy phpBB. Nic nie stoi jednak na przeszkodzie, by wykorzystać go u siebie, gdyż będzie dostępny również jako osobna dystrybucja. Jego składnia oraz API są wzorowane na Smarty'm, ale właśnie - wzorowane. W kwestii składni wprowadzono wiele niewielkich poprawek, dzięki którym tworzenie szablonów jest o wiele bardziej intuicyjne (np. uproszczona została obsługa sekcji). Jeśli chodzi o API, to zostało tak zaprojektowane, by całość można było łatwo integrować z serwisem WWW.
   OPT dostępny jest dopiero w wersji 0.06 (stan na 22.12.2004), ale już pokazuje pazury. Nawet na tym etapie prac potrafi wykonać całkiem sporo zadań:
  • Obsługa sekcji
  • Obsługa instrukcji warunkowych i wyrażeń
  • Wbudowane wsparcie dla wielojęzycznych interfejsów
  • Możliwość dołączania jednego szablonu z poziomu innego
  • Obsługa polecenia CAPTURE
  • Obsługa funkcji
  • Możliwość tworzenia własnych instrukcji sterujących oraz funkcji
  • Wiele dodatkowych opcji związanych z wysyłaniem treści do przeglądarki: wbudowane systemy kompresji GZip, system obsługi nagłówków HTTP
  • Algorytm zmniejszający objętość kodu HTML poprzez usuwanie białych znaków (spacji, tabulatorów itd.)
    W planach znajduje się jeszcze dużo rzeczy, zaś sam parser jest niesamowicie szybki - w testach wyprzedza (choć nieznacznie) Smarty'ego. Użyto w nim identycznego systemu przetwarzania szablonów polegającego na uprzednim ich skompilowaniu do postaci kodu PHP. Rozwiązanie to jest bardzo wydajne, a jednocześnie proste do zaimplementowania. Do niedogodności można wciąż zaliczyć fakt, że OPT daje się uruchomić jedynie na PHP 5, choć w sumie dzięki temu dopełnia Smarty'ego, który z kolei bez ręcznych poprawek na tejże wersji właśnie działać nie chce :).
       Cała obecna dokumentacja o OPT mieści się w jednym pliku znajdującym się pod tym adresem: http://www.opb.ibplanet.pl/work/dev/zyx/opt.html. Znajdują się tam także linki do najnowszych wersji zawierających: bibliotekę, przykłady oraz dokumentację kodu źródłowego.

       Podstawy
    Zacznijmy od utworzenia dwóch katalogów niezbędnych do pracy. W templates będziemy zapisywać kody źródłowe naszych szablonów, natomiast w cache OPT przechowywać będzie ich skompilowane wersje. Następnie musimy utworzyć konfigurację. OPT daje nam tu dużo swobody: możemy umieścić ją w pliku INI, możemy zapisać w PHP w postaci tablicy, a nawet ręcznie ustawiać wszystkie dyrektywy odpowiednim poleceniem! My wybierzemy wariant pierwszy, gdyż wszystkie przykłady pracować będą na jednej konfiguracji i nie potrzebujemy jej dublować za każdym razem. Składnia pliku jest identyczna z tą z php.ini:

    ; <?php die(); ?>

    root = "./templates/"
    cache = "./cache/"
    gzip_compression = OPT_ENABLED
    cut_whitechars = OPT_ENABLED
    not_found_errors = OPT_NOT_FOUND_ERROR

    Plik nazwijmy config.ini.php. Pierwsza linijka jest komentarzem zawierającym krótki kod PHP. Dzięki niemu oraz temu, że plik ma rozszerzenie PHP, nikt przy pomocy przeglądarki nie podejrzy naszych ustawień. Pierwsza dyrektywa wskazuje na katalog, w którym są szablony, druga na katalog cache. Przy użyciu gzip_compression możemy włączać lub wyłączać kompresję GZip. Jest to bardzo przydatny bajer, szczególnie na powolnych łączach. Sprawia on bowiem, że do przeglądarki cały wysyłany kod HTML trafia w postaci spakowanej algorytmem GunZip, zatem zajmuje znacznie mniej miejsca. Jest jednak pewien haczyk, a nawet dwa. Po pierwsze - nie wszystkie przeglądarki obsługują taki rodzaj przesyłu danych (w tym najpopularniejszy, co jednak nie znaczy, że najlepszy, Internet Explorer). OPT w chwili obecnej uruchamia kompresję dla Opery, Mozilli i Firefoxa, ale w przyszłości można się spodziewać zwiększenia ich liczby. Kolejna sprawa - twoje PHP musi mieć odpowiedni moduł do obsługi GunZipa, gdyż bez niego ani rusz. Moduł nazywa się Zlib i jest aktywny na dość dużej liczbie serwerów. cut_whitechars to inna przydatna opcja mająca na celu zmniejszenie objętości kodu HTML. Twórcy layoutów z powodów czytelności stosują całe mnóstwo wcięć w kodzie, aby było mniej więcej wiadomo, jakie znaczniki leżą w których już na pierwszy rzut oka. Przeglądarce jednak te znaki nie są do niczego potrzebne, podobnie jak przeglądającemu stronę. Dlaczego zatem zmuszać go do ich przyjmowania? Uruchommy tę właśnie opcję, a OPT podczas kompilacji szablonów wytnie takie bezużyteczne spacje. Kod stanie się przez to o wiele bardziej nieczytelny, ale przynajmniej zajmować będzie mniej miejsca. Należy nadmienić, iż usuwane są jedynie te znaki, które nie mają żadnego wpływu na to, jak całość wygląda w przeglądarce. Ostatnią dyrektywą jest not_found_errors. Mówi ona OPT, co ma zrobić, jeżeli nie będzie potrafił obsłużyć danego znacznika. My włączyliśmy opcję OPT_NOT_FOUND_ERROR sprawiającą, że wygeneruje wtedy błąd. Istnieje również inny wariant - OPT_NOT_FOUND_RETURN. W tym wypadku taka instrukcja zostanie potraktowana jak część tekstu i zwyczajnie wyświetlona.
       Przejdźmy zatem do pierwszego przykładu. Zajmiemy się najpierw szablonem:

    <html>
    <head>
    <title>{$tytul}</title>
    </head>
    <body>
    <b>Blok1: </b> {$blok1}<br/>
    <b>Blok2: </b> {$blok2}<br/>
    </body>
    </html>

    Podobnie, jak w Smarty'm, wszystkie instrukcje parsera umieszczone są w nawiasach klamrowych. Bloki, tj. miejsca, w które należy wstawić dane ze skryptu, rozpoczynają się od znaku dolara.

    <?php
       require('../lib/opt.class.php');

       $tpl = new opt_template;
       $tpl -> conf_load_file('./config.ini.php');
       $tpl -> init();
       $tpl -> http_headers(OPT_HTML);

       $tpl -> assign('tytul', 'OPT przykład 1 ('.date('d.m.Y H:i:s').')');

       $tpl -> assign('blok1', 'Jestem sobie blokiem OPT');
       $tpl -> assign('blok2', 'Jestem sobie innym blokiem OPT');
       $tpl -> parse('przyklad1.tpl');

       $tpl -> shutdown();
    ?>

    Jak wspominałem, także i API wzorowane jest na Smarty'm. Każdy, kto bawił się tamtym systemem, nie powinien mieć żadnych problemów z wprowadzaniem danych do bloków metodą assign() oraz uruchamianiem przetwarzania szablonów metodą parse(). Więcej wyjaśnień mogą wymagać pozostałe komendy. conf_load_file() wczytuje konfigurację z pliku. Następnie musimy wywołać init(). Dzięki temu PHP wczyta informacje o katalogu CACHE oraz zainicjuje parser zgodnie z ustawieniami konfiguracji. Kolejna komenda ujawnia następną przydatną rzecz zaimplementowaną w OPT. http_headers() potrafi bowiem wysłać do przeglądarki zestaw nagłówków HTTP zgodnie z naszymi preferencjami. Pierwszy parametr to typ zawartości. Do wyboru mamy kilka stałych, np. OPT_HTML, OPT_XML czy OPT_XHTML. Jeżeli nie znajdziemy nic, co by nas interesowało, możemy sami wpisać odpowiedni typ: http_headers('image/png'). Opcjonalnie mamy możliwość określenia również drugiego parametru, przy pomocy którego możemy wymusić na przeglądarce/serwerze proxy, aby nie cache'owała wysyłanych do niej treści: http_headers(OPT_HTML, OPT_NO_HTTP_CACHE);. Na samym końcu skryptu musimy wywołać metodę shutdown(). Jej zadaniem jest kompresja GZip (jeśli włączona) oraz zapisanie ewentualnych zmian w katalogu CACHE do pliku cache.dat.

       W poprzednim przykładzie wprowadzaną datę i resztę danych obrabialiśmy jeszcze w skrypcie PHP. Jednak nie jest to niezbędne. OPT dostarcza zestaw funkcji, które można wywoływać z poziomu szablonów i przy ich pomocy operować na danych. Ma to swoje zalety, gdyż czasami sposób formatowania niektórych tekstów może zależeć wyłącznie od używanego szablonu, zatem nie można go zakodować na sztywno w kodzie.
       Wywoływanie funkcji jest niezwykle podobne do analogicznego procesu w PHP. Jedyna różnica jest taka, że musi być to objęte w komentarze:

    <html>
    <head>
    <title>{$tytul} ({date("d.m.Y H:i:s")})</title>
    </head>
    <body>
    <b>Blok1: </b> {upper($blok1)}<br/>
    <b>Blok2: </b> {lower($blok2)}<br/>
    </body>
    </html>

    Za parametry możemy podawać zarówno wartości stałe (tekst koniecznie w cudzysłowach!), jak i bloki. W przyszłości będzie najprawdopodobniej możliwa obsługa całych złożonych wyrażeń, a co za tym idzie, zagnieżdżania funkcji, ale w obecnej wersji (0.06) jest to niemożliwe. Do uruchomienia tego szablonu potrzebny będzie następujący kod PHP:

    <?php
       require('../lib/opt.class.php');

       $tpl = new opt_template;
       $tpl -> conf_load_file('./config.ini.php');
       $tpl -> init();
       $tpl -> http_headers(OPT_HTML);

       $tpl -> assign('tytul', 'OPT przykład 2');

       $tpl -> assign('blok1', 'Jestem sobie blokiem OPT');
       $tpl -> assign('blok2', 'Jestem sobie innym blokiem OPT');
       $tpl -> parse('przyklad2.tpl');

       $tpl -> shutdown();
    ?>

    Kod jest prawie identyczny z poprzednim, dlatego nie będę go omawiał. Zainteresowani mogą również tworzyć własne funkcje dla OPT. Szczegóły w dokumentacji.

       Wiele serwisów oraz for dyskusyjnych umożliwia wyświetlanie napisów interfejsu w jednym z kilku wybranych języków. Zmusza to programistę do zgromadzenia wszystkich tych tekstów osobno oraz ręcznego wstawiania ich w odpowiednie miejsca w szablonie. OPT znacznie ułatwia ten proces. Można go bezproblemowo podłączyć do systemu językowego serwisu tak, aby stamtąd automatycznie pobierał potrzebne mu dane. Rozwiązanie to jest niezwykle wygodne i praktycznie niespotykane w innych systemach szablonów.

    <html>
    <head>
    <title>{$tytul} ({date("d.m.Y H:i:s")})</title>
    </head>
    <body>
    <b>{$przyklad@blok1}: </b> {$blok1}<br/>
    <b>{$przyklad@blok2}: </b> {$blok2}<br/>
    </body>
    </html>

    Nazwa bloku językowego musi zaczynać się od symbolu dolara, a w środku dodatkowo potrzebny jest znak małpy. Rozdziela on cały zapis na dwie części. Dlaczego, już wyjaśniam. Otóż OPT wymaga, aby zestawy tekstów dla interfejsu podzielone były na kategorie, w których dopiero znajdowałyby się właściwe dane. Pierwsza część tak rozgraniczonego zapisu odnosi się własnie do jednej konkretnej kategorii, natomiast druga to nazwa interesującego nas pola. Naturalnie wszystkie kategorie powinny być zgromadzone w jednej mega-tablicy tak, aby łatwiej je było czytać. Widać to na załączonym kodzie PHP:

    <?php
       require('../lib/opt.class.php');

       $jezyk = array(
          'przyklad' => array(
             'blok1' => 'Blok 1',
             'blok2' => 'Blok 2'
          )
       );

       $tpl = new opt_template;
       $tpl -> conf_load_file('./config.ini.php');
       $tpl -> register_language($jezyk);
       $tpl -> init();
       $tpl -> http_headers(OPT_HTML);

       $tpl -> assign('tytul', 'OPT przykład 3');

       $tpl -> assign('blok1', 'Jestem sobie blokiem OPT');
       $tpl -> assign('blok2', 'Jestem sobie innym blokiem OPT');
       $tpl -> parse('przyklad3.tpl');

       $tpl -> shutdown();
    ?>

    Rolę pojemnika na poszczególne kategorie (tutaj jest tylko jedna, w dodatku z dwoma elementami) pełni tutaj tablica $jezyk. Przy pomocy metody register_language() powiadamiamy parser, iż właśnie z niej powinien brać dane do bloków językowych. Tablicy nie można wprowadzić bezpośrednio, gdyż wymagana jest tutaj jedynie referencja (odnośnik) do właściwej. Jest to spowodowane tym, że takie tablice mają niejednokrotnie potężne rozmiary, a kopiowanie wszystkiego, które wykonuje się przy normalnym wprowadzaniu, zajęłoby za dużo pamięci oraz czasu.

       Sekcje
       Sekcje są olbrzymim udogodnieniem dla programisty, gdyż pozwalają przy pomocy jednego tylko szablonu tworzyć rozmaite listy. Wystarczy, że ograniczymy fragment kodu HTML odpowiednimi znacznikami, a OPT powtórzy go tyle razy, ile wprowadziliśmy do niego zestawów danych. Niestety implementacja tego elementu dzieli się na trzy rodzaje: dobre, przeciętne i tragiczne. Tutaj pozwolę sobie omówić to krótko. Kiedy zaczęto tworzyć parsery szablonów w PHP, implementacje sekcji były tak nieziemsko udziwnione, że aż odechciewało się tego używać. Pokrótce polegało to na tym, że musieliśmy sami zadbać, by każdy wprowadzony zestaw danych rzeczywiście spowodował powielenie zaznaczonego kodu, sami musieliśmy ten kod buforować, sami później musieliśmy zadbać, by został on wstawiony w odpowiednie miejsce (!!!). Parserami działającymi w ten sposób były np. FastTemplate (nigdy nie rozumiałem jego popularności), TemplatePower, czy PEAR Sigma. Krok naprzód w tej dziedzinie stanowił Smarty, który brał cały obowiązek na siebie. Niestety tu z kolei sama budowa odpowiedniego znacznika mogła przyprawić o zawrót głowy początkujących i nie tylko. Wiem, bo sam miałem z tym urwanie głowy. OPT tymczasem łączy w sobie te dwa style - prostotę budowy znacznika oraz automatyczną obsługę całości. Proszę tylko zobaczyć na przykład:

    <html>
    <head>
    <title>Liczby losowe</title>
    </head>
    <body>
    <ul>
    {section=losowe}
    <li><font color="{$losowe.kolor}">{$losowe.los}</font></li>
    {sectionelse}
    <li>Nic nie wylosowano!</li>
    {/section}
    </ul>
    </body>
    </html>

    Tutaj cała sztuka polega jedynie na określeniu nazwy sekcji. Instrukcja {sectionelse} pozwala wyświetlić alternatywną treść, gdyby nie wprowadzono żadnego zestawu danych. Aby do tego się z kolei odwołać, potrzebne są specjalne bloki o budowie: {$nazwa_sekcji.element_zestawu_danych}. Wprowadzenie zestawów ukazane jest na poniższym przykładzie:

    <?php
       require('../lib/opt.class.php');

       $tpl = new opt_template;
       $tpl -> conf_load_file('./config.ini.php');
       $tpl -> init();
       $tpl -> http_headers(OPT_HTML);

       $kolory = array(0 => '#000000', '#FF0000', '#009900', '#000099');

       $losowe = array();
       for($i = 0; $i < rand(0,10); $i++){
          $losowe[] = array(
                'los' => rand(0,1000),
                'kolor' => $kolory[rand(0,3)]
             );
       }
       $tpl -> assign('losowe', $losowe);

       $tpl -> parse('przyklad4.tpl');

       $tpl -> shutdown();
    ?>

    Wszystko wygląda tutaj niemal identycznie, jak w Smarty'm: tworzymy tablicę zestawów, a następnie wprowadzamy ją do parsera metodą assign().

       Nic nie stoi na przeszkodzie, aby sekcje zagnieździć w sobie do wygenerowania listy pozycji z kategoriami.

    <html>
    <head>
    <title>Menu w OPT</title>
    </head>
    <body>
    <ul>
    {section=kategoria}
    <li><b>{$kategoria.nazwa}</b><ul>
       {section=pozycja}
       <li>{$pozycja.nazwa} lub {$kategoria.pozycja.nazwa}</li>
       {/section}
    </ul></li>
    {/section}
    </ul>
    </body>
    </html>

    Mamy możliwość odwoływania się do elementów zestawów zarówno jednej, jak i drugiej sekcji. Jako ciekawostkę należy nadmienić, że odwołanie do sekcji podrzędnej możemy utworzyć na dwa sposoby: albo podajemy pełną ścieżkę: {$kategoria.pozycja.nazwa}, albo podajemy nazwę jedynie ostatniej (najgłębszej) sekcji: {$pozycja.nazwa}. Dla
    parsera nie robi to żadnej różnicy, gdyż potrzebne mu są jedynie dwa ostatnie elementy nazwy.
       Obsługa sekcji zagnieżdżonych od strony PHP jest również identyczna, jak w Smarty'm. Tworzymy osobne tablice dla każdej z nich, z tym że te podrzędne muszą być dwu- i więcej-poziomowe, aby parser mógł sobie je powiązać z pozostałymi:

    <?php
       require('../lib/opt.class.php');

       $tpl = new opt_template;
       $tpl -> conf_load_file('./config.ini.php');
       $tpl -> init();
       $tpl -> http_headers(OPT_HTML);

       $menu = simplexml_load_file('./menu.xml');

       $kategorie = array();
       $pozycje = array();
       $i = 0;
       foreach($menu -> kategoria as $kategoria){
          $kategorie[$i] = array('nazwa' => $kategoria['nazwa']);
          foreach($kategoria -> pozycja as $pozycja){
             $pozycje[$i][] = array('nazwa' => $pozycja['nazwa']);
          }
          $i++;
       }

       $tpl -> assign('kategoria', $kategorie);
       $tpl -> assign('pozycja', $pozycje);

       $tpl -> parse('przyklad5.tpl');

       $tpl -> shutdown();
    ?>

    Przykład ten czyta dane z pliku XML, dlatego podajemy także jego kod (menu.xml):

    <?xml version="1.0" encoding="iso-8859-2"?>
    <menu>
       <kategoria nazwa="Serwis">
          <pozycja nazwa="Strona glowna"/>
          <pozycja nazwa="Archiwum"/>
          <pozycja nazwa="Redakcja"/>
          <pozycja nazwa="Kontakt"/>
       </kategoria>
       <kategoria nazwa="Zasoby">
          <pozycja nazwa="Artykuly"/>
          <pozycja nazwa="Porady"/>
          <pozycja nazwa="Tutoriale"/>
          <pozycja nazwa="Recenzje"/>
          <pozycja nazwa="Download"/>
       </kategoria>
       <kategoria nazwa="Inne">
          <pozycja nazwa="Katalog WWW"/>
          <pozycja nazwa="Forum"/>
       </kategoria>
    </menu>


       Instrukcje warunkowe
       Instrukcje warunkowe są jeszcze jednym dobrodziejstem, dzięki któremu twórca szablonu może być jeszcze bardziej elastyczny i uniezależniony od programisty. To m.in. dzięki nim nie trzeba robić dwóch osobnych szablonów dla menusów z elementami systemu logowania: jednego z formularzem (dla niezalogowanych), a drugiego z informacją powitalną (dla zalogowanych). Wystarczy umieścić w nim warunek: jeśli ustawiony taki a taki blok, wyświetl formularz, jak nie - informację powitalną.
       W OPT instrukcje warunkowe tworzy się instrukcją {if warunek}...{/if}. Pomiędzy nimi można umieścić również {elseif warunek} oraz {else} działające tak, jak analogiczne konstrukcje w PHP. Jeżeli chodzi o warunek, to możemy napisać go sami, łącząc operatorami (ich zestawienie w dokumentacji) bloki oraz wartości stałe. Istnieją również dwa predefiniowane warunki związane z obsługą sekcji, ale o nich dalej.
       Działanie instrukcji warunkowych możemy zobaczyć na poniższym przykładzie:

    <html>
    <head>
    <title>Menu w OPT</title>
    </head>
    <body>
    <ul>
    {section=kategoria}
    <li><b>{$kategoria.nazwa}</b><ul>
       {section=pozycja}
       <li>{$pozycja.nazwa} lub {$kategoria.pozycja.nazwa}</li>
       {/section}
    </ul></li>
    {/section}
    </ul>

    {if $user_logged neq 1}
    <form action="login.php" method="post">
    Login: <input type="text" name="login" /><br/>
    Hasło: <input type="password" name="haslo" /><br/>
    <input type="submit" value="Dodaj" />
    </form>
    {else}
    <b>Witaj, {$user_nick}</b>
    {/if}
    </body>
    </html>

    Jest to w zasadzie bardziej rozszerzony przykład poprzedni. Różni się on dodaniem instrukcji warunkowej decydującej, czy wyświetlić formularz logowania, czy też informację powitalną. W warunku znajduje się operator neq ("not equal") odpowiadający PHP'kowemu !=. Naturalnie jeżeli z tych czy innych powodów nie lubimy tekstowych operatorów, możemy skorzystać z ich symbolicznych wersji, jako że praktycznie każdy z nich występuje i w takiej postaci. Wyrażenia obsługują wszystkie rodzaje bloków (nawet językowe, tylko w ich przypadku raczej nie ma to dużego sensu), w niedługim czasie powinno pojawić się także wsparcie dla funkcji.
       Kod PHP obsługujący ww. szablon niewiele się różni:

    <?php
       require('../lib/opt.class.php');

       $tpl = new opt_template;
       $tpl -> conf_load_file('./config.ini.php');
       $tpl -> init();
       $tpl -> http_headers(OPT_HTML);

       $menu = simplexml_load_file('./menu.xml');

       $kategorie = array();
       $pozycje = array();
       $i = 0;
       foreach($menu -> kategoria as $kategoria){
          $kategorie[$i] = array('nazwa' => $kategoria['nazwa']);
          foreach($kategoria -> pozycja as $pozycja){
             $pozycje[$i][] = array('nazwa' => $pozycja['nazwa']);
          }
          $i++;
       }

       $tpl -> assign('kategoria', $kategorie);
       $tpl -> assign('pozycja', $pozycje);

       $zalogowany = rand(0,1);
       if($zalogowany){
          $tpl -> assign('user_logged', 1);
          $tpl -> assign('user_nick', 'Zyx');
       }

       $tpl -> parse('przyklad7.tpl');

       $tpl -> shutdown();
    ?>

    Wspomniałem wyżej o predefiniowanych warunkach. Aktualnie są ich tylko dwa, w całości związane z obsługą sekcji, aczkolwiek powinno to wystarczyć. W każdym razie dzięki ich pomocy można sprawdzić, czy w sekcji przetwarzany jest pierwszy/ostatni zestaw danych. Pokażę to na podstawie wcześniejszego przykładu z liczbami losowymi. Do warunków uzyskujemy dostęp poprzez specjalny blok $opt, mający też wiele innych ciekawych właściwości (o nich dalej).

    <html>
    <head>
    <title>Liczby losowe</title>
    </head>
    <body>
    <ul>
    {section=losowe}
    {if $opt.section.losowe.first}
    <li><i><font color="{$losowe.kolor}">{$losowe.los}</font></i></li>
    {else}
    <li><font color="{$losowe.kolor}">{$losowe.los}</font></li>
    {/if}
    {sectionelse}
    <li>Nic nie wylosowano!</li>
    {/section}
    </ul>
    </body>
    </html>

    $opt.section.nazwa_sekcji.first tworzy warunek sprawdzający, czy w sekcji nazwa_sekcji przetwarzany jest pierwszy element. Analogicznie możemy użyć konstrukcji $opt.section.nazwa_sekcji.last, która reaguje na ostatni zestaw. Ponadto pozdbiór section daje nam dostęp do wielu ciekawych informacji o naszej sekcji:
  • {$opt.section.nazwasekcji.count} - zwraca ilość zestawów w danej sekcji
  • {$opt.section.nazwasekcji.id} - zwraca identyfikator aktualnie przetwarzanego zestawu danych (do używania wewnątrz sekcji)
  • {$opt.section.nazwasekcji.size} - zwraca ilość elementów w aktualnie przetwarzanym zestawie danych (do używania wewnątrz sekcji)

       Zakończenie
    Opisana tu została jedynie część zagadnień związanych z OPT. Jednak celem artykułu nie było dokładne przedstawienie wszystkiego, ale zachęta do zainteresowania się tym projektem oraz macierzystym Open Power Board. Są one dopiero we wczesnej fazie powstawania, lecz nikt nie może zaprzeczyć, iż inicjatywy są niezwykle ciekawe oraz że właśnie poprzez żywy oddźwięk ze strony przyszłych ewentualnych użytkowników wyrażający się nowymi pomysłami, koncepcjami, a także wykrywaniem błędów w tych wczesnych wersjach, sprawia, że mają one realne szanse powodzenia. W końcu tworzy się je dla innych, nie dla siebie.

    Update
    Obecnie zbliżają się do końca prace nad OPT 1.0.0-RC1. Wszystkie informacje o projekcie znajdują się na stronie http://opt.openpb.net. Jest tam także dokumentacja (jeszcze niekompletna), forum dyskusyjne, bugtracker i trochę przykładów. Najnowsze wersje można pobrać z repozytorium SVN.

  • Powrót

     
     
    E-commerce articles | Multiple Domain Hosting | Compare Savings | Submit articles | Package Holidays