podmíněný block podle šablony

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

Ahoj,
nejprve chci smeknout před všemi, co dělali a dělají na nette. Je vážně radost v tom programovat.

Ale teď k mému problému:
mám společnou šablonu @layout.phtml a potřebuju v ní zobrazit block, který je definovaný jen v některých šablonách akcí – prostě na různých stránkách se zobrazí HTML kód nebo ne.
Pokud si nadefinuju v nějaké šabloně block a v @layout.phtml ho naincluduju, tak mi to vyhazuje chybu na stránkách v jejíchž šablonách ten block není definovaný.

Přihodím příklad, který nefunguje (ale něčeho takového bych chtěl docílit):

// @layout.phtml
<html>
  <head></head>
  </body>
    <div id="jedna">
      {include #obsahPodlePresenteru}
    </div>
    <div id="dve">
      {include #nekdy}
    </div>
  </body>
</html>


//template pro presenterA - kdyz se vykresluje tenhle prezenter, vykresli se i block "nekdy"
{block #nekdy}<div>cokoli</div>{/block}
{block #obsahPodlePresenteru}<div>bla bla bla</div>{/block}


//template pro presenterB - kdyz se vykresluje tenhle prezenter, block "nekdy" se nevykresli, neni ani definovany
{block #obsahPodlePresenteru}<div>kvak kvak kvak</div>{/block}

napadá vás jak to řešit? Předem děkuju za případné odpovědi.

PS: omlouvám se, pokud se to tu už řešilo, já jsem nic nenašel, asi se vyhledávače špatně ptám.

Nilp
Člen | 65
+
0
-

Můžeš v potomcích definovat prázdný blok: {block #nekdy}{/block}.

iguana007
Člen | 970
+
0
-

Zkus toto:

// @layout.phtml
<html>
  <head></head>
  </body>
    <div id="jedna">
      {include #obsahPodlePresenteru}
    </div>
    <div id="dve">
	{ifCurrent PresenterA:*}
		{include #nekdyA}
	{/if}
	{ifCurrent PresenterB:*}
		{include #nekdyB}
	{/if}
    </div>
  </body>
</html>

Pro komplikovanější definici té podmínky (více presenterů/akcí v jednom makru) si pročti toto vlákno:
https://forum.nette.org/…urrent-makru

Editoval iguana007 (7. 9. 2010 21:20)

cuga
Člen | 210
+
0
-

ja tohle neresim includem, ale prazdnym blokem, takze udelam

// @layout.phtml
<html>
  <head></head>
  </body>
    // vsude spolecne
    {include #content}

    {block #a}{/block}

    {block #b}{/block}
  </body>
</html>

//a.phtml

{block #a}
tohle bude v sablone a.phtml
{/block}

{block #content}

...

//b.phtml

{block #a}
toz A se taky hodi pouzit
{/block}

{block #b}
tohle bude jenom v B
{/block}

{block #content}
a neco spolecneho

toz takze tak :)

iarro
Člen | 4
+
0
-

to cuga, nilp:
Prázdný blok mi příjde hloupý, protože ho musím definovat ve všech šablonách potomků (kterých může být pidlión). Tohle řešení mě taky napadlo, ale nelíbí se mi :-)

to iguana007:
Tvoje řešení se mi líbí podstatně víc, tohle použiju. Nevěděl jsem o ifCurrent, takže si budu muset ještě doplnit vzdělání. Každopádně díky za pomoc – všem.

Editoval iarro (8. 9. 2010 15:16)

xr
Člen | 94
+
0
-

skus miesto {include #XY} pouzit {block #XY}{/block} (priamo v @layout.phtml)

ked ho v potomkoch nedefinujes, nic sa nestane. ked ho definujes, doplni sa tam.

edit: vidim, ze sa opakujem, cuga uz ti to pisal. sry :)

Editoval xr (8. 9. 2010 16:27)

cuga
Člen | 210
+
0
-

presne jak pise xr, nemusis nikde nic definovat… to je na tom prave ta vyhoda… include musis definovat, {block #xx}{/block} ne a definujes ho akorat tam kde potrebujes a naplnis ho daty ktere potrebujes… howg :)

ten ifCurrent se mi nelibi v tom, ze musis zasirat @layout.phtml nekolika bloky na zaklade poctu presenteru, tech muzes mit klidne pidilion a to pak potes koste ;)

iarro
Člen | 4
+
0
-

no způsob od xr je hezký, nicméně mě nefunguje. Pokud jsem to pochopil správně, tak si to představujete nějak takhle:

@layout.phtml

//tady si nadefinuju prazdny block
{block #nekdy}{/block}

<html>
  <head></head>
  </body>
    <div id="jedna">
      {include #obsahPodlePresenteru}
    </div>
    <div id="dve">
      {include #nekdy}
    </div>
  </body>
</html>

template pro presenterA

//kdyz se vykresluje tenhle prezenter, vykresli se i block "nekdy"
{block #nekdy}<div>cokoli</div>{/block}
{block #obsahPodlePresenteru}<div>bla bla bla</div>{/block}

template pro presenterB

//kdyz se vykresluje tenhle prezenter, block "nekdy" se nevykresli
{block #obsahPodlePresenteru}<div>kvak kvak kvak</div>{/block}

Jenže tohle řešení nefunguje tak jak by mělo. Když se mi zobrazí stránka B (tam kde se block #nekdy vykreslovat nemá), vše je ok, ale když si zobrazím stránku A, tak se HTML kod, nadefinovaný v blocku #nekdy, vykreslí i do místa, kde ho mám v @layoutu deklarovaný.
Prostě výsledný HTML kod mám takový:

<div>cokoli</div>
<html>
  <head></head>
  </body>
    <div id="jedna">
      <div>bla bla bla</div>
    </div>
    <div id="dve">
      <div>cokoli</div>
    </div>
  </body>
</html>

co s tím?

bazo
Člen | 620
+
0
-

nepochopil si to spravne. include sa vzdy vlozit ten blok do stranky, ak nie je definovany v ziadnej sablone, tak sa vyhodi vynimka.
zato ak mas definovany prazdny blok v layoute, tak sa prepise tym, ktory je definovany v sablonach view. a ak nahodou neexistuje nic sa nedeje. cize zrus ten include a mas to tak ako si chcel.

cuga
Člen | 210
+
0
-

tak znova :)

spravne reseni je tohle

<html>
  <head></head>
  </body>
    <div id="jedna">
      {block #obsahPodlePresenteru}{/block}
    </div>
    <div id="dve">
      {block #nekdy}{/block}
    </div>
  </body>
</html>

vidis, ale hlavne chapes rozdil mezi tvojim a nasim resenim?

Editoval cuga (9. 9. 2010 22:53)

iarro
Člen | 4
+
0
-

Jo, teď už tomu rozumím. A funguje to. Díky za pomoc.