Na stronie museum.webcity.pl jest przykład jak zrobić parser szablonów bez subsekcji.
Już nie raz ktoś pytał na tym forum jak zrobić by miał subiekcje. Odpowiedzi były rożne, a nawet dostałem, gdy sam pytałem taką, że to jest "wymyślanie na nowo kola"...:| no może i jest ale i tak dalej drążyłem ten temat i po paru(nastu) ;p nie przespanych nocach udało się!! :]
Pytanie jest tylko czy to jest wydajne i co o tym sadzicie? W razie pytań piszcie :]
plik class_template.php
<?php // parser szablonów class template { var $parsed = ''; //#nowe# var $subFile = ''; // sciezka do pliku do metody subsection var $subRange =''; // przechowuje zakres subsekcji function load($plik) { //#nowe# } //#nowe function sub_range($subStrings) { $subUnprased = $this -> subFile; foreach($subStrings as $subString) { // wyciągam sobie zakres zmiennych $subRangeResult['{'.$subString.'}']=$subResult[1]; // podmieniam zakres zmiennych na tymczasowe inne zmienne do szablonu $subUnprased=preg_replace("#<!--[".$subString."]-->(.*?)<!--[/".$subString."]-->#is",'{'.$subString.'}',$subUnprased); } // zamieniam bloki z zakresem w tablicy ze stringa na kolejny wymiar tablicy // dlaczego?? poniewaz funkcja load wczytuje plik metoda file // ktora zamienia plik szablonu na tablice foreach($subStrings as $subString) { $subRangeResult['{'.$subString.'}']=preg_split("/(r?\n)/", trim($subRangeResult['{'.$subString.'}'])); } $this -> subRange = $subRangeResult; } function parse() { $this -> parsed = ""; for($i = 0; $i <= $cnt; $i++) { $tekst = $this -> unparsed[$i]; { foreach($found[1] as $block) { $block_names[] = '{'.$block.'}'; $block_values[] = &$this -> blocks[$block]; } } $this -> parsed .= $tekst; } } } ?>
plik index.php
<?php // dodatkowa funkcja - opcjonalne function subDestylate($text) { return $text; } include_once('class_template.php'); $tpl = new template; $tpl -> load("main_index"); // wyznaczam zakres bloków subsekcji i wpisuję ich nazwę // wrzucam tablice z zakresem w celu "wyciecia blokow zakresu" $tpl -> sub_range($subStrings); // w tej zmiennej przechowywane sa w tablicy "bloki zakresu" $subBlocks = $tpl -> subRange; // zamiana danych w bloku subsekcji // tablica ze zmiennymi ktore chce wprowadzic // TUTAJ ISTOTNA SPRAWA !! // przypisuje do $tpl -> unprased tablice $subArray z kluczem takim // jaki nazwa bloku ktory podmieniam + klamry // czyli: {"nazwa"} , tutaj bedzie {test} $tpl -> unparsed = $subBlocks['{test}']; // wrzucam zmienna tpl w petle i podmieniam zgodnie // z podanym wzorcem na stronie museum.webcity.pl foreach($tablica_test as $zmienna) { $tpl -> parse(); // wynik dodaje do zmiennej $sub_test // a "\n" jest po to by kolejne bloki byly // w nowych liniach podczas podgladu zrodla strony w przegladarce $sub_test .= "\n". $tpl -> parsed; } // przypisuje do $tpl zamiast funkcji "load()" // tymczasowy szablon (patrz klasa) $tpl -> unparsed = $tpl -> subTpl; // podmieniam bloki szablonu tymczasowego // i otrzymuje ostateczny rezultat "BLOK1" => "dana1", "BLOK2" => "dana2", "BLOK3" => "dana3", // bardzo istotna rzecz !! // w miejscu gdzie mielismy zakres // funkcja sub_range wstawila nazwe zakresu subsekcji // do szablonu tymczasowego tutaj nazywa sie "test" // a wstawila w sposob "{test}" by pozniej jak bedzie parser // parsowal szablon tymczasowy podmienila ja na zmienna sub_test // czyli wynik parsowania bloku subsekcji (zakresu) "test" => subDestylate($sub_test) // wykorzystalem jeszcze sobie funkcje subDestylate // ktora ladnie uklada nam bloczek w podgladzie zrodla strony w przegladarce ); // szablon tymczasowy parsuje $tpl -> parse(); // wyswietlam wynik koncowy ?>
plik szablonu, main_index.html, tu akurat umieszczony w katalogu tpl