Dziś jest piątek, 22 sierpnia 2008 roku (z kalendarza...)

OP 1.1.0 na ukończeniu

Icon

30.11.2006, 18:00

Projekty

Komentarze (10)

Powrót

Za kilka dni ukaże się nowa wersja biblioteki Open Power Template oznaczona numerem 1.1.0. Miałem ją wypuścić na początku listopada, ale z powodu przeprowadzki na Linuksa, a później OI, nie byłem w stanie zrealizować tego zamiaru na czas. Wersja 1.1.0 przynosi ze sobą wiele nowości przydatnych szczególnie w nieco większych projektach, aczkolwiek także i w małych mogą się one przydać. Wśród nich wymienię: master templates, rendering drzew oraz wsparcie dla mechanizmów dzielenia na strony.

Ale po kolei. Master templates, które będą figurować w polskiej dokumentacji jako "szablony kompilacyjne", to specjalne szablony ładowane tylko w momencie inicjacji kompilatora. Ich działanie wyjaśnię przykładowo, bo pewnie nie wszyscy znają i używają np. instrukcji bind. Otóż w OPT są dwie takie instrukcje: bind oraz bindEvent, których zadaniem jest "przechowanie" fragmentu kodu szablonu do późniejszego użycia. W przeciwieństwie do capture przechwytującego wyjściowy kod HTML, taka wstawka zachowuje swój dynamiczny charakter, tj. jeśli po jej użyciu zmienimy dane i walniemy ją gdzieś ponownie, wprowadzone zmiany będą widoczne w wyniku. Instrukcje te są aktywne tylko podczas kompilacji, gdyż po jej wykonaniu informacja o ich istnieniu jest gubiona; zostaje tylko efekt działania w postaci wstawek, które umieściły posiadany przez siebie kod w różnych miejscach. Popatrzmy, co się z tym wiąże. Mamy pięć szablonów, w pierwszym definiujemy dodatkowo wszystkie wstawki, z których korzystają pozostałe cztery. Kiedy kompilowane są wszystkie naraz, wszystko jest OK. Ale wystarczy, żeby kompilacji ulegał tylko jeden z nich, np. trzeci. Wtedy okaże się, że nie zostaną doń wstawione żadne wstawki, ponieważ kompilator nie przetworzył definiującego je szablonu. Tu do akcji wchodzą szablony kompilacyjne. Są one ładowane tylko w momencie inicjacji kompilatora i służą temu, aby właśnie w nich poumieszczać takie wstawki, dzięki czemu będą one zawsze dostępne, kiedy najdzie nas potrzeba kompilowania czegoś :).

Kolejna sprawa to rendering drzew, o którym trąbiłem już jakiś czas. OPT 1.1.0 będzie wreszcie zawierać ten element. Instrukcja do wykonywania tego, tree, jest właściwie odmianą sekcji: pobiera te same parametry, co sekcja, może być stosowana z show, wpływają na nią te same ustawienia itd. Jedyna różnica to rezultat. Popatrzmy:

<ol>
{tree=mytree}
	{leaf}
	<li>{$mytree.title}</li>
	{/leaf}
	{opening}
	<li>{$mytree.title}<ol>
	{/opening}
	{closing}
	</ol></li>
	{/closing}
{treeelse}
	<li>No tree provided.</li>
{/tree}
</ol>

Wewnątrz znaczników {tree} i {/tree} mamy trzy tagi - opening, leaf oraz closing. Określają one wygląd poszczególnych elementów drzewa: elementu otwierającego nowy poziom, liścia oraz zamknięcia poziomu. W elementach dla takiego drzewa należy umieścić dodatkowy blok: depth definiujący ich głębokości (patrz: artykuł "Drzewa w PHP i MySQL"), na podstawie którego algorytm wylicza odpowiednie zależności i dobiera sposób jego wyświetlenia. Dodam, że ciekawscy mogą spróbować ustawić parametr "reversed" istniejący tylko dla zachowania kompatybilności z sekcją, ale rezultat nie jest interesujący - bo jak niby wyświetlić drzewko od tyłu? :)

Drzewka przeważnie renderuje się z użyciem HTML-owych wyliczeń: OL lub UL, dlatego nie ma sensu za każdym razem powtarzać tego samego opisu wyglądu drzewa. Można go wsadzić do nowej instrukcji bindGroup, tę umieścić w szablonie kompilacyjnym i po prostu podpinać raz zdefiniowany wygląd do kolejnych drzew:

{bindGroup name="mytree"}
	{leaf}
	<li>{$mytree.title}</li>
	{/leaf}
	{opening}
	<li>{$mytree.title}<ol>
	{/opening}
	{closing}
	</ol></li>
	{/closing}
{/bindGroup}
 
<p>Drzewko 1:</p>
 
{show=tree1}
<ol>
{tree}
	{use snippet="mytree"/}
{/tree}
</ol>
{showelse}
<p>No tree provided.</p>
{/show}
 
{show=tree2}
<ol>
{tree}
	{use snippet="mytree"/}
{/tree}
</ol>
{showelse}
<p>No tree provided.</p>
{/show}

PS. Zauważcie, że wewnątrz bindGroup używamy bloków $mytree.cośtam, a nasze drzewka to tree1 i tree2. Niezgodność nazw? W wersji 1.0.0 - owszem. Nowy OPT sobie automatycznie sam przekonwertuje nazwę.

Z nowym OPT można zintegrować system dzielenia wyników na strony. Aby to wykonać, należy zaimplementować w klasie tegoż systemu interfejs ioptPagesystem, wrzucić jego obiekt do parsera i zastosować instrukcję {pagesystem}. Podobnie, jak w wypadku drzew, definiujemy tu wygląd poszczególnych elementów w postaci nowych znaczników. Możemy je także utworzyć raz za pom. bindGroup i później ładować je w miarę potrzeby znacznikiem {use snippet="nazwa"/}. Oto przykład:

{pagesystem=ps}
  {page}[ <a href="{@url}">{@title}</a> ]{/page}
  {active}< <strong><a href="{@url}">{@title}</a></strong> >{/active}
  {separator}...{/separator}
  {next}<a href="{@url}"><<</a>{/next}
  {prev}<a href="{@url}">>></a>{/prev}
{/pagesystem}

Wracając jeszcze do sekcji... nie wiem, czy ktoś tego używał, ale w dotychczasowych wersjach w trybie kompatybilności z XML-em dostępny był ogranicznik w postaci atrybutu XML: opt:put="tresc". Jego zniknięcie jest jedyną niekompatybilnością wstecz, ponieważ jego miejsce zajmują tzw. atrybuty OPT, za pomocą których można robić różne ciekawe bajery. Oto, jak teraz wykonywane będzie naprzemienne kolorowanie elementów tabeli, robione dotąd funkcją cycle() na wzór Smarty:

<table>
<tr>
<td>Product name</td>
<td>Product Price</td>
</tr>
{section=products}
{cycle='class'; 'brighter'; 'darker'}
<tr>
<td opt:sectioncycle="products">{$products.name}</td>
<td opt:sectioncycle="products">{$products.price}</td>
</tr>
{/section}
</table>

Jeszcze tylko trzeba tu wymyślić jakiś elegancki sposób na wykorzystywanie raz zdefiniowanych wzorów cykli w wielu miejscach, ale idea pozostanie, jak powyżej. Atrybut opt:sectioncycle zostanie zastąpiony atrybutem class z wartością naprzemiennie: "brighter", "darker".

Jak się Wam podobają nowe możliwości?

Powrót

Komentarze

Napisał Diablos w piątek, 1 grudnia 2006 o 22:29

Nowe mozliwosci sa ok, ale musze przyznac ze sa zbedne. Na pewno wiekszosc programistów wykorzystujacych OPT radzila sobie doskonale mimo braków wyzej wymienionych.

Nie smiem kwestionowac Twoich priorytetów, ale przykladowo mojej osobie wieksza radosc sprawiłby tytuł "OPP 0.1" czy tez "OPS 0.1", a nawet "OPD 0.5".

OPT miał być przeciez podprojektem, a narazie rozwija sie zupelnie nieproporcjonalnie do innych (tak mi sie wydaje).

Szczerze powiedziawszy myslalem, ze wraz z wydaniem wersji finalnej 1.0 pojawi sie w Twoim grafiku czas na rozwijanie innych podprojektów, mniej uwagi bedzie poswiacanej OPT... mniej tzn. tylko na poprawe bledów.

Tak czy siak, dobra robota, pozdrawiam.

Napisał Zyx w sobotę, 2 grudnia 2006 o 09:59

Ad. nieproporcjonalności - masz rację, ale mogę zapewnić, że z OPT jest to na razie ostatni tak duży wyskok i jeszcze w grudniu wyjdzie Open Power Driver 1.0.0 (uwaga: niekompatybilny wstecz!), a na początku nowego roku - Open Power Forms 1.0.0.

Jednak muszę powiedzieć, że wersja 1.1.0 jest niezbędna, szczególnie z punktu widzenia tego ostatniego projektu. Niedawno ukończyłem silnik C-Z-W silnie maglujący taki właśnie zestaw, co ujawniło pewne hmmm... wybrakowanie gałęzi 1.0.x. Naprawdę, jeśli ma się dużo formularzy OPF do zrobienia, to szablony kompilacyjne są wręcz błogosławieństwem, podobnie jak możliwość zmuszenia OPT do parsowania przestrzeni nazw innych niż "opt" (tu kwestia wygody - nie trzeba pamiętać, które znaczniki są w przestrzeni "opt", które w "opf", które w jeszcze innej itd.).

Podsumowując, dopiero wersja 1.1.0 tworzy naprawdę spójną pod względem oferowanych możliwości całość, a ponieważ nie mam w tej chwili żadnych nowych pomysłów, kolejne wydania OPT będą co najwyżej poprawiały odkryte błędy, podczas gdy cała para pójdzie już w co innego.

Napisał Zyx w poniedziałek, 4 grudnia 2006 o 09:04

OK, skończyłem OPT 1.1.0. Pozostały już jedynie testy, dokumentacja i spakowanie tego. Wieczorem wrzucę wszystko na SVN.

Napisał Tweak w piątek, 8 grudnia 2006 o 18:15

Według mnie to właśnie OPT powinien być dalej w większym stopniu rozwijany. Dobrych systemów szablonów brakuje o Twoje Zyx pomysły bardzo ułatwiają życie. Z obsługą formularzy czy bazy danych można sobie spokojnie inaczej poradzić, tak samo pełno jest forów (tyczy się OPB).

Kiedy powinna wyjść spakowana pełna wersja?

Napisał NetJaro w niedzielę, 10 grudnia 2006 o 09:35

A ja uważam, że OPD tak samo jak OPT powinien być rozwijany - jest to wspaniała klasa umożliwiająca obsługę baz danych. Na niej opracowuję swój nowy, duży projekt - i mam nadzieję, że nie zawiodę się na funkcjonalności i wydajności.

Napisał Zyx w niedzielę, 10 grudnia 2006 o 21:51

OPD 1.0.0 jest niekompatybilne wstecz z wersją 0.4. W nowym wydaniu cache'owanie będzie odbywało się poprzez tzw. obiekty strażnika, w których będzie się włączać i wyłączać cache. Wprowadziłem takie coś z dwóch powodów:

1. aby przejrzyściej zorganizować przepływ danych ;)
2. dzięki takiemu rozwiązaniu możliwe są różne ciekawe bajerki, np. dodawanie nowych cache ID do zapytań prepare() w trakcie ich wykonywania, czy opóźnione blokowanie tabel (w sensie: OPD wie, że trzeba blokować, ale robi to dopiero wtedy, kiedy jakieś zapytanie musi już na gwałt iść do bazy).

Od strony samego PDO w dalszym ciągu zachowana jest maksymalna kompatybilność API, przy czym po przeniesieniu cache'u do osobnej klasy jest tam znacznie mniej kodu :).

Ad. OPT - to jak chcecie. Albo szybko bez kompletnej dokumentacji, albo trochę później z dokończoną pełną dokumentacją w formacie HTML. Jest też taka sprawa, że sobie SVN muszę na Linuksie skonfigurować :).

Napisał Tweak w poniedziałek, 11 grudnia 2006 o 07:56

A może rozdzielić dokumentację od kodu? Bo po co za każdym razem ją pobierać skoro np. były tylko drobne zmiany w kodzie? Osobiście uważam że bardziej by się przydał changelog dołączony do projektu + ewentualnie krótkie wytłumaczenie jak nową funkcjonalność wykorzystywać.

Napisał Zyx w piątek, 19 stycznia 2007 o 15:30

OPT 1.1.0 zostało wydane w dwóch wersjach: z dokumentacją oraz bez niej. Teraz każdy może sobie pobrać to, co mu pasuje. Dodam też, że z powodu przejścia na HTML, rozmiar spakowanych archiwów uległ odczuwalnemu zmniejszeniu :).

Napisał polon w sobotę, 20 stycznia 2007 o 12:21

dobre dobre zaraz zasse

Napisał Zyx w sobotę, 27 stycznia 2007 o 20:33

A tak się zastanawiam, ile osób zauważyło, że w tytule tego wpisu brakuje literki "T"? :D

Strona 1 z 1 :: 1

Skomentuj

NickInformacja
E-mailTylko do użytku wewnętrznego.
WWWNie zapomnij o http://
LayoutNapisz tu, czy widzisz dzienny czy nocny layout.
WpisFormatowanie wiki
Internauto, pamiętaj! Wolność to nie samowola - dbaj o kulturę wypowiedzi oraz dyskusji w sieci.

Na Zyxist.com panuje swoboda wyrażania opinii oraz krytyki pod dowolnym adresem. Jedyny warunek: musi być ona kulturalna i rzeczowa. Na chamstwo, prostactwo lub jawne obrażanie kogokolwiek nie ma tu miejsca i takie komentarze są bardzo szybko usuwane. Jeśli zamierzasz polemizować z treścią wpisu, wpierw uważnie ją przeczytaj.

© Tomasz "Zyx" Jędrzejewski 2005 - 2008 | Wykonanych zapytań: 2 | Serwer wirtualny zapewnia