<?php
$str = 'Ahoj <?php echo "světe!" ?>';
eval('?>'.$str.'<?php ');
?>
NormálnÄ› se eval() chová tak, že oÄekává PHP kód. Vtip je v tom, že ten se dá běžným způsobem uzavÅ™Ãt a na konci znovu otevÅ™Ãt, ÄÃmž uprostÅ™ed zÃskáváme prostor pro HTML Äi jiný Äistý text. A koneÄnÄ›, ten může znovu obsahovat PHP vsuvky, zkrátka se promÄ›nná zpracuje zrovinka jako by se includoval soubor. Pokud vám zmÃnÄ›ný trik fungovat nebude, budu vdÄ›Äný, když se v komentářÃch ozvete. Rád bych si udÄ›lal pÅ™ehled o kompatibilitÄ›. Já testoval na PHP 4.3.10-16 a 4.4.4.
Pokud mi najdeÅ¡ lepšà způsob, jak zpracovat napÅ™. data z databáze jako PHP soubor, tak k niÄemu :-)
Máš tÅ™eba v DB stránku, která obsahuje HTML kód, a najednou je potÅ™eba v tom HTML zavolat nÄ›jakou PHP fci. Musel bys data buÄ doÄasnÄ› uložit a pak includovat (zdlouhavé a pomalé), nebo použÃt zmÃnÄ›ný trik. Koukal jsem, že rychlost je vÃc než dobrá.
Tenhle pÅ™Ãpad mÄ› nenapadl, mám totiž vždy oddÄ›len php a html kód Å¡ablonou. Ale pro tvůj pÅ™Ãklad chápu, že je to vÃce než užiteÄné.
[3] Taky použÃvám Å¡ablony... a nakonec jsem se vrátil k úplnÄ› jednoduché "pseudo-Å¡ablonové" tÅ™ÃdÄ›, která neprovádà kompilaci. Å ablony se tak vlastnÄ› už pÃÅ¡ou v kompilované podobÄ› - má to výhody:
1) nenà tÅ™eba hlÃdat, jestli je kompilace vždycky aktuálnÃ
2) nenà tÅ™eba vytvářet kompilaÄnà adresář a nastavovat mu pÅ™Ãstupová práva
3) žádné zpomalenà prvnà kompilacÃ
4) úplná kontrola nad kódem
Jedinou nevýhodou je, že Å¡ablona je troÅ¡ku mÃň pÅ™ehledná. Jenže mÄ› nepÅ™ijde zase tak velký rozdÃl mezi:
Smarty:
{$promenna|escape:'html'}
a
<?=htmlspecialchars($promenna)?>
když ten druhý zápis přinášà tolik výhod. Ale je jasné že Smarty toho umà spoustu, záležà na programátorovi co si vybere.
Chci o tom napsat Älánek, proto jsem se tak rozepsal.
SmÃm se zeptat, který Å¡ablonový systém použÃváš?
Já použÃvám vlastnà šablonovacà systém se syntaxà tÅ™eba pro promÄ›nnou: {variable name='jmeno' /♀♀} Když si totiž tohle ÄlovÄ›k navrhne a udÄ›lá sám, tak to má výhodu, že se kompilace nikdy nezdržuje vÄ›cmi, které v projektu nevyužijeÅ¡ - tÅ™eba Smarty je se vÅ¡emi svými volbami skoro nepomalejšà systém na Å¡ablony.
Tvůj systém Å¡ablon má taky nÄ›co do sebe, tady hlavnÄ› záležà na tom, co zrovna vytvářÃÅ¡, jestli na tom dÄ›lá vÃc lidÃ... Když vezmu tÅ™eba tvoje výhody:
1) Å™eÅ¡Ãm smazánÃm pÅ™ÃsluÅ¡né pÅ™ekompilované Å¡ablony pÅ™i zmÄ›nÄ› dat
2) tohle podle mě nenà jeden z neřešitelnách problémů :)
3) prvnà kompilace zabere (tÅ™eba u mÄ›) v nejsložitÄ›jšà šablonÄ› asi 10ms, ale pro vÅ¡echny dalšà pÅ™Ãstupy už jenom poÅ¡lu na výstup běžný html soubor, což nezabere takÅ™ka žádný Äas a uÅ¡etÅ™Ãm si pÅ™ipojovánà k databázi, provádÄ›nà vÅ¡ech dotazů a výpoÄtů (v podstatÄ› vÅ¡echno), což je už hodnÄ› velké zrychlenÃ
4) nÄ›kdy výhoda a nÄ›kdy ne - tÅ™eba když poskytneÅ¡ zákaznÃkovi eshop s tÃm, že si může upravit vzhled Å¡ablonami a css, tak kdyby v nich mÄ›l plný pÅ™Ãstup k php kontextu, asi by se mi to moc nelÃbilo :)
Zkrátka je to hlavně o tom, jak rozsáhlý děláš projekt, ono se pro každou věc hodà něco jiného.
[5]
3) - když posÃláš na výstup dál jen HTML, nejde mi do hlavy, jak u dynamických dat zjišťujeÅ¡ kdy je tÅ™eba pÅ™erenderovat (tzn. kdy jsou nová), bez pÅ™ipojenà k DB.
Jo radÅ¡i pÃÅ¡u vÅ¡echno na mÃru, vlastnÃ, je to až chorobné :) Mimochodem, vsadÃm se, že to zakonÄenà /♀♀} je kvůli tomu, aby preg_replace_callback neuzavÅ™el promÄ›nnou pÅ™i výskytu '}' nÄ›kde uvnitÅ™ v Å™etÄ›zci. Velké to trápenÃ, vždycky záležà na kontextu kde se ten znak nacházà :)
3) Nezjišťuji to vůbec, ale posÃlám vždy pÅ™ekompilovanou Å¡ablonu. A když se provádà zmÄ›na dat v databázi (tÅ™eba pÅ™idánà nového pÅ™ÃspÄ›vku pod Älánek), tak dotyÄnou Å¡ablonu smažu.
No a zakoneÄnà /} je spiÅ¡ kvůli návyku na správnou syntaxi po vzoru XML :). Když mám znaky { a } v Å™etÄ›zci, tak je nahradÃm pÅ™ÃsluÅ¡nými entitami { a } a je po problému.
[7] To mě nenapadlo, zachytit změnu takhle. Bezva.
U zakonÄenà mÄ› zmátly ty znaky ♀♀ které se tam zÅ™ejmÄ› vloudily omylem, ale pÅ™iÅ¡lo mi to použitelné.
[2] Data z databáze jako PHP soubor by se dala zpracovat použitÃm funkce stream_wrapper_register(). Ale z bezpeÄnostnÃho hlediska to je docela odvážné, lepšà mi pÅ™ijde nahrazovat jen povolené konstrukce.
[9] S tou databázà jsem nedal nejšťastnÄ›jšà pÅ™Ãklad. Tady bych to sice neváhal použÃt (a v budoucnu se tak stane), ale je pravda že mÃt PHP kód v DB je loterie.
Tohle mi sakra pomohlo...delal jsem si vlastni prekladovej system a potrebuju v urcitejch specialnich pripadech prohnat soubor vlastnim parserem pred poslanim uzivateli... Bez tohodle vec nemozna... Diky!
stará známá věc, ale!
- urÄitÄ› nadávat do polÃÄek kam muže psát klient, nebo nedÄ›jbože uživatel ;o) to budete mÃt sql injekci bÄ›hem chvilky ;o)
ZajÃmavý, ale nÄ›jak nechápu, k Äemu je to dobrý :)