Společná šablona pro všechny view presenteru
- thm
- Člen | 147
Rád bych se zeptal jak se řeší společná šablona pro všechny view presenteru?
Moje nefunkční řešení (není ideální ale mělo by fungovat)
- Mám @layout.latte kde mám v nějakém místě {include #obsah}, také u tittle mám {include #tittle|striptags}
- V každém view pak používám {block obsah} sem píšu obsah a také <h1 n:block=„tittle“>Nadpis</h1>{/block}
Pokud chci ale použít v každém view jednoho presenteru {include ‚AllViewHeader.latte‘} kam chci napsat nějaké společné věci pro všechny view. Viz.:
{block obsah}
{include 'AllViewHeader.latte'}
Text k view
{/block}
Pokud ale použiju v AllViewHeader.latte n:block=„tittle“ tak mi to skončí chybou Cannot include undefined block ‚tittle‘. Prostě se nechce blok označený tittle v AllViewHeader.latte připojit k @layout.latte (je to dvakrát includeované, ale to by snad vadit nemuselo. Nebo ano?)
- Michal Vyšinský
- Člen | 608
kam chci napsat nějaké společné věci pro všechny view
Na to přesně je @layout.latte. Nechápu, kde přesně je problém.
- thunderbuff
- Člen | 164
Nehledáš toho?
<?php
class MujPresenter extends Presenter {
public function renderA() {
$this->setView('mojeView');
}
public function renderB() {
$this->setView('mojeView');
}
}
?>
Editoval thunderbuff (10. 6. 2013 17:26)
- jiri.pudil
- Nette Blogger | 1032
Jestli tě chápu správně, tj. chceš vložit kód specifický pro jeden jediný presenter do všech jeho šablon, postupuj následovně:
- Vytvoř si @layout.latte pro ten jeden presenter a umísti ho k ostatním šablonám presenteru.
- Zajisti, aby rozšiřoval globální @layout.latte (pomocí makra layout).
- Nejspíš bude nutné pojmenovat jinak blok vkládaný z konkrétní šablony presenteru, aby se ti nesmíchal/nepřepsal #content.
Vytvořená šablona bude ve výsledku vypadat nějak takto:
{layout '../@layout.latte'}
{block content}
...společný kód...
{include #viewContent}
{/block}
A v jednotlivých šablonách presenteru změníš název bloku:
{block viewContent}
...obsah...
{/block}
Pokud chceš includovat jen bloky z šablon, můžeš také použít makro includeblock místo include. Mnou nastíněné řešení je ale víc DRY, protože nemusíš uvádět název layoutu ve všech šablonách.
Editoval jiri.pudil (10. 6. 2013 17:59)
- thm
- Člen | 147
Omlouvám se nějak jsem se asi do toho zamotal a nepřesně jsem se
zeptal.
@jiri.pudil: Jojo to je ono díky. Paráda. Takhle podobě to mám resp.
konkrétně:
@layout.latte: (společný pro všechny presentery a všechny view)
<title>{include #title|striptags}</title>
...
{include #content}
default.latte (view default presenteru)
{block content}
<h1>{$contract->subject}</h1>
{include 'ContractDetailHeader.latte'} //Toto píšu do všech view toho jednoho presenteru
... obsah ...
{/block}
ContractDetailHeader.latte (jakási hlavička pro všechny view jednoho presenteru)
<p n:block="title">Nějaký nadpis</p>
... obsah ...
Ale problém je v tom že ten block title se nedostane až do layoutu, skončí to chybou Cannot include undefined block ‚title‘.
EDIT: Tak jsem myslel, že když použiju makro **includeblock **tak to bude fungovat, ale ne. Nakonec to mám udělané tak, že v každém view specifikuju title – stejně je nesmysl mít stejné title pro více view, když je na té stránce aplikace stejně něco jiného. Ale i tak mě to zajímá v čem je problém.
Editoval thm (11. 6. 2013 9:36)