Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Własny system szablonów
Forum PHP.pl > Forum > PHP
Denver
Witam.
Próbuję napisać własny system szablonów. Właściwie to go napisałem, ale niestety chodzi on zdecydowanie za wolno, więc próbuję go napisać od nowa smile.gif

Mam pytanie odnośnie parsowania szablonu.


Załóżmy że mamy taki plik test.tpl

Kod
<!-- BEGIN nazwa_sekcji -->



Stała: {JAKAS_STALA}<br>

Sekcja językowa: {L_User}<br>

Przesłane ze skryptu: {V_TEST_VALUE}<br>



<!-- END nazwa_sekcji -->



I teraz w kodzie php:

[php:1:c76ea6911f]<?

$Tpl = new Tpl();

// ustawiamy aktualny szalbon na test.tpl
$Tpl -> set ("test");

// dodajemy do szablonu jakas wartosc
$Tpl -> add ("TEST_VALUE", "wartosc");

// ustalamy stałą
define ('JAKAS_STALA', "wartosc_stalej");

// i jeszcze wartosc z jakiejs tablicy
$lang = array();
$lang['User'] = "Użytkownik";


// pokazujemy zparsowany szablon
print $Tpl -> get ("nazwa_sekcji");

?>[/php:1:c76ea6911f]




I tutaj moje pytanie: jak napisać metodę klasy Tpl, żeby sprawdzała 3 różne typy zmiennych: stałe, przesłane ze skryptu oraz indeksy tablicy... Czyli żeby zamieniała:

{L_Index} na $lang['Index']
{CONST} na constant("CONST")
{V_ZMIENNA} na $this->data["ZMIENNA"] (czyli przeslana ze skryptu)



Ten kod działa, ale bardzo wolno się wykonuje... Może jakieś sugestie?

[php:1:c76ea6911f]<?

/*
pominalem tutaj definicje klasy itd., to jest metoda parse()
*/


function parse($section, $txt)
{

// wylapujemy sekcje z pliku
//

$pattern = "#<!-- BEGIN ".$section." -->(.*?)<!-- END ".$section." -->#s";
preg_match_all ($pattern, $txt, $_arr);
$txt = $_arr[1][0];



// teraz wylapujemy wszystko w nawiasach klamrowych {jakis_tekst}
//

preg_match_all ("/{(.*?)}/si", $txt, $words);
$patterns = array ();
$replacements = array ();

foreach ($words[1] as $key => $value)
{
$word = $words[1][$key];
$start = substr ($word, 0, 2);
$patterns [] = "{$word}";


if ($start == "L_")
{
$word = $lang [substr ($word, 2)];
}
elseif ($start == "C_")
{
$word = $c_lang [substr ($word, 2)];
}
elseif ($start == "V_")
{
$word = $this -> V_[substr ($word, 2)];
}
else
{
if (defined ($word)) $word = constant ($word);
else $word = "";
}

$replacements [] = $word;
}
$i = count ($patterns);
while ($i--)
$txt = ereg_replace ($patterns[$i], $replacements[$i], $txt);

return $txt;
}

?>[/php:1:c76ea6911f]




Naprawde sie troche z tym mecze i bede wdzieczny za wszelkie podpowiedzi... Jak to da sie zrobic prościej?

pozdrawiam
Denver
Lucky
Co do prędkości to najlepszym wyjściem jest cache.

A co do parsowania, to możesz np. pozmieniać ograniczniki, inne do tablic, inne do stałych itd.

Możesz również ująć to w nazwie, czyli nazwę tablicy zaczynaj od A_, stałej od C_, a zmiennej od A_. Potem po ich pobraniu po prostu to sprawdzaj.
Denver
Tylko ja sie zastanawiam, czy nawet po zmianie stałych na {C_STAŁA} i zmiennych indeksow tablicy na {T_Indeks} nadal zostawić moje rozwiązanie? Czy ono jest wystarczająco wydajne do wykorzystania w skryptach forum?
Denver
Chciałbym nadmienić, że w przypadku niekorzystania z systemu szablonów na moim forum, czyli gdy daję po prostu print nie bawiąc się w szablony, to skrypt chodzi błyskawicznie, natomiast z szablonami - około 0,7-0,8 sekundy podczas przeglądania topica...
Ace
Ja napisalem swoj system szablonow. Wykonuje sie calkiem szybko, ok 25 pol wyciaganych jest z bazy danych, ladowanych do tabeli, nastepnie wyciaga inne dane w zalerznosci od tego jaki jest autor , np : jesli autor = Ace to szuka jego hasla i wstawia je, dodatkowo includowanie, oraz funkcja warunkowa.
wszystko wykonuje sie w ok 0.1 sek... ale porzucilem projekt szablonow bo funkcja warunkowa psula sie czesto - tzn nie wszystkie warunki dzialaly...

wlasnie pytanie mam... w jakis sposob zrobic cache'owanie ? na jakiej zasadzie mozna to zrobic, jakies funkcje sa potrzebne. Nie wiem na jakiej zasadzie dziala takie cachowanie w generowaniu strony. Jesli moglby ktos wytlumaczyc mi jak to dziala, byl bym wdzieczny.
Denver
Zdaje sie ze chodzi tu o to, ze pliki szablonow sa parsowane przed ich uruchomieniem, aby strona nie musiala za kazdym razem ich parsowac - robi to parser tylko jeden raz, a strona korzysta juz z gotowego sparsowanego kodu.
Ace
hm.. no dobra, to wiedzialem, ale chodzi mi bardziej o to czy musze napisac sam jakies funkcje ktore sprawdza czy plik istnieje z cache , jesli nie to parsuje, jesli jest to otwiera go i pomija parsowanie... czy istnieja juz funkcje ktore ulatwiaja to ?
czyli, mam pisac sam funkcje do cacho'wania, czy sa jakies gotowe funkcje w php... ?
Ace
Napisalem swoj system do cache... W sumie na moich szablonach uzyskuje predkosc 0.025 - 0.03 przy odczytywaniu z cache, gdy normalnie odczytywanie danych trwalo by ok 0.07 sek... musze sprawdzic jeszcze jak to dziala na duzo wiekszych obliczeniach
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.