Autor Zpráva
RastyAmateur
Profil
Krásné dopoledne přeji!

Chtěl bych se zeptat na pár věcí ohledně šablonovacích systémů. Jak se ty šablonovací systémy vytvářejí? Co jsem se tak ptal a četl, tak přes reguláry to není moc dobré. Prý se to dělá přes DOM. Sice bych to asi nezvládl, ale zajímá mě to.

A ještě jedna otázka. Doporučí mi někdo nějaký jiný šablonovací systém? Znám např. Smarty, ale ještě jsem ho nezkoušel...

Děkuji, RA
Str4wberry
Profil
Samo o sobě je PHP šablonovací systém. Tedy jde používat obyčejné PHP.

Šablonovací systémy, které jsou asi v dotazu myšleny, potom fungují zpravidla tak, že vezmou obsah zapsaný v nějaké jednodušší syntaxi a převedou ji a uloží do obyčejného PHP.

Zjednodušeně řečeno se {$promenna} nahradí za <?php echo $promenna; ?>. Tuhle náhradu teoreticky jde zajistit i regulárními výrazy. Jak se ale začnou používat cykly, podmínky a další bloky, přestávají regulární výrazy stačit.

Doporučil bych ještě třeba Latte.
Alphard
Profil
Str4wberry:
Zjednodušeně řečeno se {$promenna} nahradí za <?php echo $promenna; ?>
Možná by bylo dobré tolik nezjednodušovat a říct, že v závislosti na kontextu může z {$promenna} vzniknout např. <?php echo escapeHtml($name, ENT_NOQUOTES); ?>. A to je právě věc, která by se reguláry neřešila moc dobře...
RastyAmateur
Profil
Str4wberry:
No právě. Nahrazení proměnných je jednoduché, ovšem jak na cykly a podmínky?

Alphard:
Tento šablonovací systém bych využíval jen já. Není důležité ho nějak extrémně zabezpečovat (pokud jsem správně pochopil Vaši reakci).
final_
Profil *
Dajú sa takým štýlom spraviť aj cykly, podmienky, ale je to naozaj dosť krkolomné. Ak chceš nechaj mi tu na seba e-mail a po víkende ti pošlem link na moje riešenie. Upozorňujem ale, že to nemusí byť správne riešenie(ani nie je).
Alphard
Profil
RastyAmateur:
Tento šablonovací systém bych využíval jen já.
I jako jediný uživatel někde v intranetu?

Šablonovací systém je kompilátor a kompilátory se typicky skládají z několika vrstev, které budou přítomné i tady. Začíná se lexikální analýzou a parsováním, při kterém se postupně načítá vstup a na základě definované gramatiky se vytváří vnitřní reprezentace kódu. Jeho jednotlivé fragmenty se nazývají tokeny a z nich se vytváří syntaktický strom (stromový graf). Ve chvíli, kdy je vstup takto zpracovaný, se začně syntakticý strom procházet a jednotlivé uzly se začnou definovaným způsobem transformovat a zapisovat na výstup.
Např. Latte\Parser je na github.com/nette/latte/blob/master/src/Latte/Parser.php.

Pokud si to chce někdo vyzkoušet, doporučil bych napsat si matematický parser a kalkulačku, ani to není triviální.

final:
Ak chceš nechaj mi tu na seba e-mail a po víkende ti pošlem link na moje riešenie.
Nic ve zlém prosím, ale jestli chceš někoho učit, jak vytvářet šablonovací systém pomocí regulářů, radši to nedělej :-)
RastyAmateur
Profil
final:
Klidně to můžeš někam nahrát a hodit sem odkaz. Rád se na to podívám.

Alphard:
Děkuji za vysvětlení. Vydím to tak, že se asi naučím s Latte nebo Smarty.

Zná někdo ještě jiné šablonovací systémy? Smarty mi přijde na mé malé projekty zbytečně moc dokonalý.
Kubo2
Profil
Najjednoduchší šablónovací systém by vyzeral možno takto:

function vyparsovaťŠablónu($súbor, array $parametre = []) {
    return str_replace(
        array_map(function($názov) {
            return "{\$$názov}";
        }, array_keys($parametre)),
        array_values($parametre),
        file_get_contents($súbor)
    );
}

Na tému šablónovacích systémov by som sa najradšej rozpísal viac, no na virtuálnej klávesnici môjho smart fónu to žiaľ nie je veľmi pohodlné.

A za mňa tiež odporúčam Latte, prehľadná syntax a vysoká rýchlosť, mám s ním dobré skúsenosti. Narozdiel od Smarty, kde minimálne tá syntax teda nie je nič moc.
Str4wberry
Profil
Nejjednodušší nahrazení {$proměnných} v šabloně používá tato diskuse. :–)

Zjednodušeně:

function sablona($soubor) {
  $tpl = file_get_contents($soubor);
  return eval("return <<<EOT\n$tpl\nEOT;\n");
}

Používat to ale moc nedoporučuji.
RastyAmateur
Profil
Kubo2, Str4wberry:
To nahrazení proměnných není tak těžké. Mně jde o to, jak udělat podmínku a foreach. To jsou asi 2 věci (nepočítaje proměnné), bez kterých to nemá cenu dělat...
Krakatoa
Profil
RastyAmateur:
Šablonování se tu řešilo už několikrát. Nějak nechápu co řešíš, prostě udělej proměnné jako proměnné, podmínky jako if a foreach jako foreach normálně v php kódu.
Mně se líbí tento jednoduchý hezký příklad (Raw PHP):
vkládání meta tagů pomoci php

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: