Witam!
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 $unparsed = array(0 => ''); var $parsed = '';
var $blocks = array('default' => ''); //#nowe#
var $subFile = ''; // sciezka do pliku do metody subsection
var $subRange =''; // przechowuje zakres subsekcji
var $subTpl = array(0 => ''); // tymczasowy szablon z tymczasowymi zmiennymi
function load($plik)
{
$this -> unparsed = @file('./tpl/'.$plik.'.html'); // podaje adres szablonów //#nowe#
}
//#nowe
function sub_range($subStrings)
{
$subUnprased = $this -> subFile;
foreach($subStrings as $subString)
{
// wyciągam sobie zakres zmiennych
preg_match("#<!--[".$subString."]-->(.*?)<!--[/".$subString."]-->#is", $subUnprased, $subResult); $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;
$this -> subTpl = preg_split("#(\n)#is", $subUnprased); }
function parse()
{
$this -> parsed = "";
$cnt = count($this -> unparsed); for($i = 0; $i <= $cnt; $i++)
{
$tekst = $this -> unparsed[$i];
{
foreach($found[1] as $block)
{
$block_names[] = '{'.$block.'}';
$block_values[] = &$this -> blocks[$block];
}
$tekst = str_replace($block_names, $block_values, $tekst); }
$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ę
$subStrings = array('test'); // 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
$tablica_test=array('test1', 'test2', 'test3', 'test4'); // 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 -> blocks = array('$d' => $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
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<!--[test]-->
<!--[/test]-->
Ten post edytował Rudi1204 9.04.2009, 10:09:00