predani promenne z basepresenteru do sablony

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

Úplně jednoduchá věc asi…

Mám layout.latte a v něm jen toto:
{include header.latte}
{block content}{/block}
{include footer.latte}

v header.latte chci použít proměnnou např. $logged_in.
Jak tuto proměnnou dostat do toho šablonování aby byla k dicpozici kdykoli kdekoli od header.latte do footer.latte ?

Jo, dokumentace je plná $template->variable = value. Ale odkud se to $template bere?
A do jaké funkce basepresenteru to psát?
Tak, aby tam ta hodnota byla vždy ve všech presenterech i kdyby používaly jiný layout? Prostě Ať jde o jakoukoli akci jakéhokoli presenteru s libovolným layoutem, vždy bude k dispozici proměnná kterou si někde nadefinuju. V basepresenteru postupy uváděné v dokumentaci jaksi neprochází.
$this->template->variable = 1; neudělá nic

Oli
Člen | 1215
+
0
-

BasePresenter

public function berforeRender()
{
	parent::berofreRender();
	$this->template->logged_id = 'ahoj';
}
hzs
Člen | 4
+
0
-

BasePresenter.php:

<?php

namespace App;

use Nette, Model;

abstract class BasePresenter extends Nette\Application\UI\Presenter
{

    public function berforeRender() {
        parent::berofreRender();
        $this->template->logged_in = 'ahoj';
    }

}
?>

V header.latte:
nejake blbiny <b>{$logged_in}</b>

header.latte je includovany do @layout.latte

Vysledek:
Undefined variable: logged_in

Ladenka oznaci radek v cache (../temp/cache/_Nette.FileTemplate/_templates.header.latte.php:18)
A tam je kod:
nejake blbiny <b><?php echo Nette\Templating\Helpers::escapeHtml($logged_in, ENT_NOQUOTES) ?></b>

David Matějka
Moderator | 6445
+
0
-

Oli tam mel hned 2× typo :) oboje ma byt samozrejme beforeRender

public function beforeRender() {
    parent::beforeRender();
    $this->template->logged_in = 'ahoj';
}

Editoval matej21 (18. 2. 2014 15:49)

hzs
Člen | 4
+
0
-

Blbě jsem to tady napsal, mam tam beforeRender se stejnym vysledkem.
Nepřepisuje to třeba beforeRender v dalsim presenteru, nebo to parent::beforeRender zarido vzdy spravne? Podobne reseni me napadlo, ale mel jsem takovy pocit, ze parent:: pusobi opacnym smerem :)

hzs
Člen | 4
+
0
-

a jo, sorry, měl jsem tam taky překlep.
Takhle to tedy funguje…

Ještě bych se teda zeptal, proč není $this->template→ dostupné v __construct, nebo jiných funkcích ?

Oli
Člen | 1215
+
0
-

za typo se omlouvam :-)

minimalne proto, ze to je zbytecny. Nekdy chces neco zpracovat a presmerovat a je zbytecne vytvaret sablonu. Podivej se na zivotní cyklus presenteru. Tolik v __construct. Vjiných funkcích dostupný je. Zkus si to třeba v actionDefault().

David Matějka
Moderator | 6445
+
0
-

a za druhe, v konstruktoru neni jeste presenter pripraven. cokoliv chces v presenteru delat, delej nejdrive ve startup metode.

samozrejme sablona ($this->template) je dostupna od startup, pres action* a handle* metody az po beforeRender, render* a afterRender. ale snaz se s template pracovat az v nektere render metode