Istotna zmiana dotyczy zasobów oraz dyrektywy sourceDir. Zrezygnowałem z pojęcia zasobu oraz interfejsu Opt_Resource_Interface na rzecz strumieni PHP, które również można dowolnie oprogramowywać, a przy okazji oferują one znacznie większe możliwości przy wykorzystaniu standardowych funkcji. Ich konfigurowanie odbywa się teraz poprzez dyrektywę sourceDir, która może teraz przyjmować jako wartość również tablicę asocjacyjną:

$tpl->sourceDir = array(
   'file' => '/sciezka/templates/',
   'db' => 'database://moja_baza/'
);

// system plików
$tpl->parse('szablon.tpl');

// baza danych
$tpl->parse('db:szablon.tpl');

Oczywiście we wspomnianym przykładzie trzeba ręcznie sobie strumień "db" utworzyć, a szczegóły znajdują się w dokumentacji PHP.

Nowa instrukcja, opt:selector, jest połączeniem sekcji oraz czegoś w rodzaju instrukcji "switch". Umożliwia proste definiowanie różnych wariantów wyświetlenia elementu, a wybór odpowiedniego następuje na podstawie jednego z pól elementu, domyślnie o nazwie "item". Od strony kodu, wygląda to bardzo podobnie do składni dawnej instrukcji opt:paginator, którą nawiasem mówiąc można bardzo łatwo odtworzyć:

<opt:selector name="strony">
  <opt:page>[ <a parse:href="$strony.adres">{$strony.numer}</a> ]</opt:page>
  <opt:active>[ <a parse:href="$strony.adres" class="active">{$strony.numer}</a> ]</opt:active>
  <opt:dots>...</opt:dots>
</opt:selector>

Całość współpracuje ze snippetami i posiada wszystkie inne właściwości sekcji, włącznie z opt:selectorelse, a nawet atrybutem opt:selector pozwalającym zmienić dowolny znacznik w tę instrukcję.

System dziedziczenia szablonów został wzbogacony o nową możliwość, mianowicie dołączanie dodatkowego szablonu, tylko że w przeciwną stronę (coś na wzór szablonów kompilacyjnych z OPT 1.x):

<!-- szablon.tpl -->
<opt:root include="inny_szablon.tpl">
  <p>Tutaj mamy jakiś kod...</p>
  <p>I możemy użyć snippetów z pliku inny_szablon.tpl</p>
  <opt:insert snippet="foo" />
</opt:root>

<!-- inny_szablon.tpl -->
<opt:root>
  <opt:snippet name="foo">
    Treść snippetu.
  </opt:snippet>
</opt:root>

Niestety, ta jedna rzecz musi być kompilowana rekurencyjnie, przynajmniej na razie, dlatego odradzam robienie jakichś super-długich łańcuchów w stylu "A dołącza B, który dołącza C, który dołącza D, który dołącza E" itd. Na pocieszenie dodam, że i tutaj został zamontowany wykrywacz nieskończonej rekurencji, który przerwie dołączanie, jeśli stwierdzi, że doprowadzi to do zapętlenia.

Ostatnia zmiana, to tryb quirks. Nie wiem, czy oczekiwany przez wszystkich, ale na pewno potrzebny, by OPT mógł sięgać tam, gdzie żaden zwykły kompilator XML nie sięgnie - do przetwarzania dowolnych dokumentów tekstowych. W skrócie - kompilator wyłapuje wtedy wyłącznie znaczniki należące do OPT (instrukcje), cała reszta traktowana jest natomiast jak zwykły tekst, podobnie jak to miało miejsce w OPT 1.1.x. Włączyć go można globalnie albo lokalnie dla pojedynczego szablonu:

$tpl->mode = Opt_Class::QUIRKS_MODE;
$tpl->parse('szablon.tpl', Opt_Class::OUT_SCREEN, NULL, Opt_Class::QUIRKS_MODE);

Najnowsza wersja kodu dostępna jest w SVN-ie, niedługo zaś pojawi się OPL 2.0.0-dev8.