Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Własny system szablonów
Denver
post
Post #1





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 24.09.2003
Skąd: Giżycko / Wrocław

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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
Go to the top of the page
+Quote Post
Lucky
post
Post #2





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 2.03.2004
Skąd: Ziemia Giżycka

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Denver
post
Post #3





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 24.09.2003
Skąd: Giżycko / Wrocław

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Denver
post
Post #4





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 24.09.2003
Skąd: Giżycko / Wrocław

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
Ace
post
Post #5





Grupa: Zarejestrowani
Postów: 216
Pomógł: 0
Dołączył: 9.08.2003
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Denver
post
Post #6





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 24.09.2003
Skąd: Giżycko / Wrocław

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Ace
post
Post #7





Grupa: Zarejestrowani
Postów: 216
Pomógł: 0
Dołączył: 9.08.2003
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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... ?
Go to the top of the page
+Quote Post
Ace
post
Post #8





Grupa: Zarejestrowani
Postów: 216
Pomógł: 0
Dołączył: 9.08.2003
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 7.10.2025 - 19:11