Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> 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

Posty w temacie


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: 15.10.2025 - 18:46