Dynamicky pristup ke staticky definovanym blokum v sablone

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
arron
Člen | 464
+
0
-

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
+
0
-

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
+
0
-

Trošku vic to prosim rozepis, protoze bud jsem to Tvoje reseni nepochopil, nebo jsi nepochopil Ty me :-) Diky moc:-)

arron
Člen | 464
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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)