Dynamicky pristup ke staticky definovanym blokum v sablone
- arron
- Člen | 464
Resim nasledujici problem. Mam v layoutu definovane nejake bloky:
{block #left}
{/block}
{block #center}
{/block}
{block #right}
{/block}
V sablone stranky bych k temto staticky nadefinovanym blokum potreboval pristupovat dynamicky. Tedy neco v tomhle smyslu:
{foreach $content as $blockName => $blockContent}
{block $blockName}
{!$blockContent}
{/block}
{/foreach}
Je to za stavajiciho stavu vubec mozne? Jsem ochotny (do doby nez vyjde konecna verze 2) pouzit i nejaky hack…
Diky moc
- Mikulas Dite
- Člen | 756
Nezkoušel jsem to, ale nemělo by to být možné. Navíc to není potřeba: pokuď je dynamicky generuješ, určitě je i dynamicky vkládáš. Stačí prohodit block a foreach a je po problému.
- arron
- Člen | 464
tak jsem si rikal, ze bych to obesel tak, ze bych obslehnul, jak se makro block preklada do php a proste to tam do te sablony dal na tvrdo, ale nezvladam se prokousat LatteMacros tak moc do hloubky, takze to byl fail…Potreboval bych poradit, jak ev. upravit v LatteMacros generovani bloku, abych ke staticky nadefinovanemu bloku mohl pristupovat pres php promenou. A nebo se na to taky koukam ze spatne strany a pujde to udelat jeste uplne jinak, ale ja tu moznost proste ted nevidim:-)
- jasir
- Člen | 746
Nešlo by to nějak takhle?
{block #left}
{if $leftContent}
{!$leftContent}
{else}
{include #parent}
{/if}
{/block}
{block #center}
{if $centertContent}
{!$centerContent}
{else}
{include #parent}
{/if}
{/block}
{block #right}
{if $rightContent}
{!$rightContent}
{else}
{include #parent}
{/if}
{/block}
- arron
- Člen | 464
Jop, to je rozhodne docasny workaround:-)
Ucel je totiz v tom, ze chci mit za behu menitelnou sablonu s ruznymi bloky
(alias placeholdry pro obsah). Pak je tohle workaround pro jednu sablonu, ale
univerzalne to reseni neni. IMHO bez vyreseni tohoto problemu (odkazovani na
bloky dynamicky) neni mozne vytvorit opravdu plne modularni system…
- jansfabik
- Člen | 193
LatteFilter ty bloky překládá do PHP jako funkce, a ty v PHP nejde takhle
dynamicky vytvářet (function $blockName()
)
ale jak se tak dívám na ten tvůj příklad, tak ty vlastně ani dynamicky
vytvářet bloky nepotřebuješ, místo {block #left}{/block}
bys
tam mohl mít tohle:
{ifset $content['left']}
{!$content['left']}
{else}
výchozí kód
{/ifset}
pro lepší přehlednost si můžeš třeba napsat makro:
public function templatePrepareFilters($template)
{
$latte = new LatteFilter();
$latte->handler->macros['placeholder'] = '<?php if (isset($content[%%])): echo $content[%%]; else: ?>';
$latte->handler->macros['/placeholder'] = '<?php endif ?>';
$template->registerFilter($latte);
}
a v šabloně pak napíšeš jen
{placeholder left}výchozí kód{/placeholder}
- arron
- Člen | 464
Je to obdoba kodu vyse a uprimne, o vlastnim makru jsem vlastne ani neuvazoval (vubec me to zatim nenapadlo:-)), napad skvely, diky. Jinak tato metoda opravdu funguje bez problemu, ale gro je jeste trochu jinde.
Ja ty bloky opravdu dynamicky vytvaret nechci, jsou normalne staticky vytvorene v prislusnem layoutu. Jde mi o to, jak je dynamicky adresovat v konkretni sablone. Chci totiz aplikaci pod rukama menit layouty a v kazdem z nich muzou byt uplne jine bloky (nekde nebude #right, jinde bude treba #topLeft a #topRight atd.), ale nemuzu porad prepisovat danou sablonu, aby v ni jednou bylo:
{block #left}
{if...}
{* atd. podle kodu vyse *}
a podruhe treba
{block #topLeft}
{if...}
{* atd. podle kodu vyse *}
Vypisovat vsechny moznosti je samozrejme blbost, ze jo;-)
Cili (navazuji na zjednoduseny priklad vyse) ja se ani tak nesnazim napsat
neco takoveho function $blockName()
, ale pokud
$blockName = 'left'
, tak bych potreboval, aby se to prelozilo na
function left()
, coz by pri prekladu makra macroBlock
podle me jit melo, jenom se proste do vysledneho php musi vlozit ne samotne
‚$blockName‘, ale jeho vyhodnoceni ‚left‘. A na to proste nemuzu
prijit, jak to udelat:-)
Editoval arron (16. 2. 2011 1:09)