podmíněný block podle šablony
- iarro
- Člen | 4
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.
- iguana007
- Člen | 970
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
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
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)
- cuga
- Člen | 210
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
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
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
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)