CurlyBrackets + Foreach → WARNING

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

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.

Ola
Člen | 385
+
0
-

Na obsahu pole $galeries to právě záleží. Třebas pokud to pole není vyplněno, nebo to neni pole (či iterovatelnej objekt).

Editoval Ola (20. 2. 2009 18:04)

Jod
Člen | 701
+
0
-

Pokiaľ je galéria prázdna nastav si galleries na prázne pole pomocou $this->template->galleries = array(); , alebo si tam pridaj nejakú podmienku ako {if isset($galleries)}

tark
Člen | 22
+
0
-

$galleries není prázdné. Dělá mi to i pokud $this->template->galleries = array('a','b','c');

Ola
Člen | 385
+
0
-

A nepřepisuješ to potom (v další fázi živ. cyklu presenteru)?

tark
Člen | 22
+
0
-

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)

Ola
Člen | 385
+
0
-

Mohla by Ti pomoci funkce createTemplate presenteru, viz. example akrabat.

Jod
Člen | 701
+
0
-

Ja si radšej v renderGallery zadám $this->template->title = ‚Galerie‘ a nemusím nič renderovať dva krát. Toto čo skúšaš je v nette ešte asi nedoriešené.

kravčo
Člen | 721
+
0
-

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

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

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…

tark
Člen | 22
+
0
-

No, vzhled… napsal jsem to blbě, je to i třeba o pojmenování určitých částí a tak. Ale jinak to, co jsi napsal vypadá celkem dobře, budu to muset časem víc prozkoumat, dík za nakopnutí.

PetrP
Člen | 587
+
0
-

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
tark
Člen | 22
+
0
-

Dneska jsem to otestoval, řešení mnohem lepší, díky!