CurlyBrackets + Foreach → WARNING
- tark
- Člen | 22
Pokud použiju v šabloně…
{foreach $galleries as $gallery}
...
{/foreach}
…tak mi vyskočí chyba Warning: Argument passed to SmartCachingIterator::__construct must be an array or interface Iterator provider, NULL given. in S:\Web\dev\galerie\libs\Nette\Templates\Template.php on line 246 – nějak nedokážu zjistit, čím je to způsobeno. Na obsahu pole $galleries to nezáleží a při použití <?php foreach(…) ?> toto nenastává (jelikož se nepoužije iterator, který se zavádí automaticky při použití této závorkové syntaxe…).
Netuším, jestli je toto chyba, nebo jestli je to úmysl, tak to radši vkládám do této sekce. Díky za odpověď. Má revize Nette je 216 z 18/2/09.
- tark
- Člen | 22
Na bug jsem nakonec přišel. Já totiž tu šablonu generuju dvakrát, v tom byl ten zádrhel, zapomněl jsem na první generování. Používám kód podobný tomuto. Zajišťuju jím přenos jedné proměnné z šablony do @layout.phtml…
BasePresenter.php
class BasePresenter
{
protected $vars;
public function beforeRender()
{
// získat soubor s šablonou
$templateFile = Environment::expand('%templatesDir%/' . str_replace('Presenter','',$this->getPresenter()->getClass()) . '/' . $this->getView() . '.phtml');
// uměle vyrenderovat šablonu poprvé, protože potřebujeme získat obsah proměnné z šablony
$template = $this->createTemplate();
$template->setFile($templateFile);
$template->vars = (object) NULL;
$content = (string) $template; // vyrenderujeme šablonu už nyní
// dosadit do šablony
$this->template->vars = $template->vars;
// dosadit do proměnné
$this->vars = $template->vars;
}
... blablabla ...
}
GalleryPresenter.php
public function renderGallery($path)
{
... blablabla ...
$data = Photos::getData($path);
$this->template->galleries = $data['dirs'];
}
gallery.phtml
{? $vars->title = 'Galerie'}
<h2>{$vars->title}</h2>
{foreach $galleries as $gallery}
... blablabla ...
{/foreach}
V tomto byl problém. Chyba byla totiž vyhazována v prvním generování, a ne v tom druhém, jak jsem myslel. Ovšem pokud by měl někdo lepší způsob přenášení proměnných mezi @layout.phtml, presenterem a šablonou, dejte vědět. Díky! :)
Editoval tark (20. 2. 2009 21:53)
- kravčo
- Člen | 721
Nie je mi celkom jasné, kvôli čomu to renderovanie dvakrát… Keď zadávam do šablóny „dáta“ (do premenných), ktoré potom potrebujem v prezenteri, tak ich radšej zadám v prezetneri a ten ich úplne transparentne posunie šablóne (keďže naopak sa mi to transparentné nezdá). Mám pocit, že sa snažíš riešiť vec zbytočne komplikovane. Aké presne premenné máš v tej šablóne, ktoré potrebuješ potom v prezenteri?
- tark
- Člen | 22
No, v určitých případech je nutné ho použít, krásným příkladem je jednoduchý „Texy!“ layer pro generování stránek… Vzhledem k tomu, že určitě nechceme psát ke každé stránce renderXXX funkci a v ní definovat titulek, tak ho musíme nějak dostat ze šablony, abychom ho mohli vypsat v <title> v @layout.phtml – já třeba nevím o jiné možnosti, jak jej tam dostat ;) Ale uznávám, toto není tento případ, zde by to možná šlo trochu překopat… Třeba titulek nastavovat v konfiguraci nebo někde… Uvidíme, ještě popřemýšlím nad návrhem aplikace a popřemýšlím, jak z toho ven. Každopádně pořád si myslím, že na nastavování detailů vzhledu je šablona nejlepší, i když je to často komplikované.
Editoval tark (21. 2. 2009 23:04)
- kravčo
- Člen | 721
tark napsal(a):
No, v určitých případech je nutné ho použít, krásným příkladem je jednoduchý „Texy!“ layer pro generování stránek… Vzhledem k tomu, že určitě nechceme psát ke každé stránce renderXXX funkci a v ní definovat titulek, tak ho musíme nějak dostat ze šablony, abychom ho mohli vypsat v <title> v @layout.phtml – já třeba nevím o jiné možnosti, jak jej tam dostat ;) Ale uznávám, toto není tento případ, zde by to možná šlo trochu překopat… Třeba titulek nastavovat v konfiguraci nebo někde… Uvidíme, ještě popřemýšlím nad návrhem aplikace a popřemýšlím, jak z toho ven. Každopádně pořád si myslím, že na nastavování detailů vzhledu je šablona nejlepší, i když je to často komplikované.
IMHO obsah titulku sa vzhľadu veľmi netýka :)
Pomôcť by ti mohla nová (a stále experimentálna) možnosť dedenia šablón. Tá nahrádza ono – krátku dobu v Nette prítomné – renderovanie šablón v opačnom poradí. Jednoduchý príklad:
{**
* News template
*}
{extends '@layout.phtml'}
{assign $title 'Novinky z domova i zo sveta'}
{block #content}
<h2>Nový obsah stránky</h2>
<ul>
<li>Lorem ipsum ...</li>
</ul>
{/block}
pričom layout vyzerá takto:
{**
* Layout template
*}
...
<head>
<title>{$title}</title>
</head>
<body>
<header />
<content>
{block #content}
štandardný obsah stránky...
{/block}
</content>
<footer />
</body>
...
Viac informácií nájdeš vo vlákne, ktoré sa tomu venuje, prípadne v iných…
- PetrP
- Člen | 587
kravco napsal(a):
Pomôcť by ti mohla nová (a stále experimentálna) možnosť dedenia šablón. Tá nahrádza ono – krátku dobu v Nette prítomné – renderovanie šablón v opačnom poradí. Jednoduchý príklad:
Já jen doplním že tento experiment je defaultně vypnut, takže je potřeba zapnout:
$this->oldLayoutMode = false; // $this je Presenter