Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Własny system szablonów
Denver
post 7.03.2004, 09:32:23
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 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
 
Start new topic
Odpowiedzi (1 - 7)
Lucky
post 7.03.2004, 09:38:37
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.


--------------------
My name is Luke... Lucky Luke
Go to the top of the page
+Quote Post
Denver
post 7.03.2004, 09:50:37
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 7.03.2004, 10:12:44
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 7.03.2004, 12:05:49
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 7.03.2004, 13:54:06
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 7.03.2004, 14:52:43
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 9.03.2004, 18:06:20
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
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 18.07.2025 - 03:00