Invenzzia »

Pages: [1]   Go Down
  Print  
Author Topic: OPTv2: Opt sam zamyka znaczniki  (Read 1342 times)
0 Members and 2 Guests are viewing this topic.
Agares
User

Offline Offline

Posts: 16

Zbanowany


View Profile
« on: August 03, 2008, 09:19:26 »

Witam,
mam OPTv2.0.0-dev6. Gdy chcę przeparsować stronę która składa się z 3 szablonów(np. <html /> otwarte na w top.tpl, zamknięte w bottom.tpl) to OPT zamyka mi <html /> przed drugim szablonem(index.tpl). Dlaczego tak się dzieje? Co robię źle? Z góry dzięki za pomoc.
Logged
megaweb
Invenzzia
User
*****
Offline Offline

Posts: 80


View Profile
« Reply #1 on: August 03, 2008, 11:48:44 »

Bo OPTv2 domyślnie skraca znaczniki. Poza tym niepoprawne jest stosowanie w ten sposób z OPT'a - dużo lepiej działa dziedziczenie szablonów - np. news.tpl dziedziczy po bottom.tpl, a ten dziedziczy po main.tpl - w ten sposób możesz złożyć stronę parsując jedynie news.tpl - OPT automatycznie skorzysta z bottom.tpl (np. do wstawienia footer'a) i main.tpl (w którym będzie szkielet strony).
Logged
Zyx
Your programmer
Administrator
User
*****
Offline Offline

Posts: 291



View Profile WWW
« Reply #2 on: August 10, 2008, 17:21:28 »

Konkretniej chodzi o to, że w jedynym dostępnym na chwilę obecną trybie XML znacznik musisz zamknąć w tym samym szablonie, w którym go otworzyłeś. Co więcej, OPT nie zezwoli Ci na przeparsowanie i wysłanie do przeglądarki więcej, niż jednego szablonu metodą parse(). Modularyzację zapewniasz na dwa sposoby:
1. Dziedziczenie, jak poradził megaweb
2. Instrukcja INCLUDE.

W wersji finalnej będzie jeszcze tryb QUIRKS pracujący podobnie, jak OPT 1, tj. parsuje wyłącznie znaczniki OPT, a resztę traktuje jak tekst i tam opisywany przez Ciebie zabieg będzie możliwy :).

Od siebie dodam, że choć kompilacja szablonów z użyciem dziedziczenia zużywa odczuwalnie więcej zasobów (również pliki wynikowe mają większe rozmiary), za to ich kod jest optymalniejszy pod względem ilości wykonywanych operacji dyskowych, także często będzie działać szybciej. Trzeba się jednak liczyć z tym, że dziedziczenie ściśle związane jest z kompilacją i nie możesz sobie wczytać nazwy dziedziczonego szablonu np. z bloku albo z wyrażenia (mam pewien pomysł, jak to można zmienić, ale nie będzie to w pełni czyste wyjście):

Code:
<!-- poniższy kod da błąd: plik musi być określony na sztywno -->
<opt:extend file="$blok">
  ... snippety
</opt:extend>

PS1. Kod na SVN-ie automatycznie skraca już tylko te znaczniki, które były zapisane w skróconej wersji w szablonie, nawet jeśli nie zawierają żadnej treści.

PS2. Dzięki za znalezienie babola - w opisanej sytuacji OPT powinien zgłosić Ci błąd, że nie domknąłeś znacznika :).
« Last Edit: August 10, 2008, 17:25:28 by Zyx » Logged

PozDrX, Zyx
---Invenzzia group---
megaweb
Invenzzia
User
*****
Offline Offline

Posts: 80


View Profile
« Reply #3 on: August 12, 2008, 12:24:27 »

A nie lepiej zrobić to po stronie PHP? Powiedzmy, że mamy szablon składający się z 3 plików - main.tpl (szkielet), menu.tpl (menu) i news.tpl (nowości). Dziedziczone po kolei od tyłu. Jak chcemy mieć zamiast news.tpl, download.tpl to parsujemy jego i po problemie. Ew. jak jeszcze inne menu to download.tpl będzie sobie dziedziczył po menu_download.tpl (na przykład) i sprawa załatwiona... Przynajmniej wg. mnie to dość optymalne rozwiązania, patrząc na to, że można sobie zmodyfikować każde menu osobno :) I łatwo zmienić dziedziczenie.
Logged
Zyx
Your programmer
Administrator
User
*****
Offline Offline

Posts: 291



View Profile WWW
« Reply #4 on: August 12, 2008, 20:59:33 »

To tak właśnie jest to już teraz rozwiązane :). Ty wybierasz szablon najwyższego rzędu (news.tpl, download.tpl, foo.tpl itd.), natomiast po atrybutach file w instrukcji opt:extend OPT schodzi do szablonu głównego. Mam na myśli coś innego. Czasem zdarza się, że mamy szablon jakiegoś formularza, który musimy wyświetlić np. w adminie oraz w panelu użytkownika, a obie te części mają zupełnie inną obudowę. Używając INCLUDE, można tym na bieżąco manipulować bez problemu, wprowadzając nazwę właściwego szablonu do bloku i ładując szkielet admina lub czegoś innego, zależnie od potrzeb.

W dziedziczeniu masz póki co dwa wyjścia:
1. Zrobić dwie kopie tego samego szablonu z tą samą treścią, ale dziedziczące po innych plikach.
2. Wykorzystać gałęzie, jednak tu też wszystkie dozwolone wybory muszą być na sztywno zapisane w szablonie, co dalej może niektórym przeszkadzać.
3. póki co pociąć się :)

Wyjście znalazłem następujące. Chcemy, aby to skrypt PHP mógł ustawić, po czym dany szablon ma dziedziczyć. Nic prostszego - w API pojawi się metoda inherit():

Code:
$tpl->inherit('news.tpl', 'menu_jakiestam.tpl');

Wystarczy jeszcze powiadomić kompilator w szablonie, że ma respektować te ustawienia, co nie zwalnia nas z obowiązku zdefiniowania domyślnego szablonu:

Code:
<opt:extend file="domyslne_menu.tpl" dynamic="yes">
....
</opt:extend>

Teraz wszystko jest w porządku. Ewentualnie może być jeszcze robiona korekta nazewnictwa. Pomysły na obecną nazwę przyszły mi dzisiaj, jak łączyłem napisaną w lipcu dokumentację nowego API ze starymi stronami dokumentacji z okolic maja/czerwca.
Logged

PozDrX, Zyx
---Invenzzia group---
Pages: [1]   Go Up
  Print  
 
Jump to:  

Subject Started by Replies Views Last post
OPTv2: OPT 2.0.0 « 1 2 3 » Zyx 42 8401 Last post March 25, 2009, 21:31:09
by Zyx
OPTv2: Renderowanie drzewka kategorii Agares 1 1153 Last post August 02, 2008, 13:08:01
by Zyx
OPTv2: opt:extends i zmienne metaxy 1 950 Last post April 07, 2009, 13:47:11
by Zyx
OPT: wersja 1.1.5 w repozytorium gizmo 5 757 Last post September 15, 2009, 18:42:40
by gizmo
OPTv2: Własne biblioteki znaczników deallas 1 484 Last post March 11, 2010, 12:13:59
by Zyx