Společná šablona pro všechny view presenteru

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

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

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

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

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ě:

  1. Vytvoř si @layout.latte pro ten jeden presenter a umísti ho k ostatním šablonám presenteru.
  2. Zajisti, aby rozšiřoval globální @layout.latte (pomocí makra layout).
  3. 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
+
0
-

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)