Dziś jest poniedziałek, 13 października 2008 roku (z kalendarza...)

Rendering drzew w OPT

Icon

15.05.2006, 19:46

PHP

Komentarze (0)

Powrót

Podczas ostatnich dwóch miesięcy miałem okazję robić już dwa projekty, w których trzeba było renderować za pomocą systemu szablonów drzewa. Standardowe sekcje nie bardzo się w takim wypadku sprawdzają, gdyż wymaga to dodatkowych zabiegów zarówno po stronie kodu PHP (umieszczenie informacji dla renderera o każdym węźle), jak i po stronie szablonów (trzy dodatkowe ify i pętla for). Sprawa została poruszona również na forum projektu, więc w wolnych chwilach myślę, jak by ułatwić to zadanie i nieco je zautomatyzować.

Zacznijmy od tego, że niedługo chyba za świętą uznam chwilę, gdy posłuchałem Waszej rady ad. komponentów i napisałem nowy kompilator, wzorowany na XML'owym :). Pomogła ona przy komponentach, pozwalając narodzić się Open Power Forms, teraz pomoże przy drzewach. Nie obejdzie się bowiem prawdopodobnie bez instrukcji złożonej, gdzie trzeba będzie zdefiniować wygląd np. liścia, węzła z podelementami, zakończenia danego poziomu itd. Mogłoby to wyglądać w ten sposób:

<ul>
<opt:tree name="stromcek">
  <opt:openingNode>
   <li>{$stromcek.tytul} <ul>
  </opt:openingNode>
  <opt:leaf>
   <li>{$stromcek.tytul}</li>
  </opt:leaf>
  <opt:closingNode>
   </ul>
  </opt:closingNode>
</opt:tree>
</ul>

Ujawnia się tu kolejne błogosławieństwo kompilatora: OPT traktuje cały kod HTML jak zwykły tekst, w związku z czym zupełnie nie przeszkadza mu taka konstrukcja:

  <opt:closingNode>
   </ul>
  </opt:closingNode>

Uczciwie należy dodać, że stawiany mi onegdaj za wzór WACT także takie coś by zaakceptował, co grzebie ideę "XML albo śmierć" używaną wtedy jako główny argument przeciwko OPT. Oto przykład z dokumentacji tego projektu:

<list:list id="mylist">
<list:item>
<core:default for="ListRowOdd"><font color="red"></core:default>
<core:optional for="ListRowOdd"><font color="blue"></core:optional>
</font>
<list:item>
</list:list>

Wróćmy jednak do tematu... trzeba się teraz zastanowić, jakich danych OPT potrzebuje, aby wykorzystać hipotetyczną instrukcję tree. Pierwsza na myśl nasuwa się wielowymiarowa tablica, lecz jej generowanie od strony programistycznej wymaga różnych zabiegów i podejrzewam, że nikomu nie będzie się chciało bawić ze stosami oraz innym śmieciem. Przecież drzewo można wygenerować z zupełnie płaskiej listy, w której rekordy zaopatrzone są w blok depth, notabene dodawany i liczony automatycznie, jeśli rendering odbywa się metodą opisaną w artykule "Drzewka w PHP i MySQL" dostępnym na Zyxist.com. Oprócz tego przydałoby się wbudować w OPT jakąś funkcję będącą odpowiednikiem str_repeat() w PHP, aby drzewka mogły być też generowane w trybie tekstowym.

Powyższe ustalenia na pewno nie pojawią się w OPT 1.0.0, gdyż naprawdę już czas, aby ta wersja final wreszcie się ukazała. Nic jednak nie stoi na przeszkodzie, aby instrukcja tree znalazła się w wersji 1.1.0.

Powrót

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ń: 1 | Serwer wirtualny zapewnia