Undefined variable – sablona nedostava promennou z presenteru

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

Ahoj,
snazim se vypsat select z tabulky cyklem foreach v late, ale ladenka mi hlasi nedefinovanou promennou.
Tu pritom do sablony posilam z presenteru. Nevidite nekde chybu?
Diky.

model (cast s funkci):

public function findAll()
	{
		return $this->database->table('users');
	}

Presenter:

class UsersPresenter extends SecuredPresenter
{
	public $users;
	public function renderDefault()
	{
		$this->template->users = $this->users->findAll()->order('id');
	}
}

sablona:

 {foreach $users as $user}
 	<tr>
    	<td class="strong">{$user->id}</td>
     <td class="small">{$user->login}</td>
	</tr>
{/foreach}
japlavaren
Člen | 404
+
0
-

podla toho co pises by to malo byt ok. posli presnu hlasku co ti robi – premenna $user uz standartne v sablone(nette ju ta dava) cisto teoreticky to moze robit to

David Matějka
Moderator | 6445
+
0
-

jsi v akci „default“? nebo nemenis view (pres $this->setView()) nekde?

err
Člen | 77
+
0
-

Cela hlaska je v nadpise – Undefined variable: users

Ladenka:
<?php echo Nette\Templating\Helpers::escapeHtml($users, ENT_NOQUOTES) ?>

jsem v default, setView() nepouzivam

err
Člen | 77
+
0
-

sleduju, ze i kdyz v presenteru nadefinuji promennou staticky:

...
$this->template->users = 'xxx';
...

Tak ji to v sabolen pres {$users} nezna a nevypise. Pokud zmenim $users na $test je to stejne, takze chybu vyvolanou shodou jmen promennych bych vyloucil.

Editoval err (28. 9. 2013 19:04)

enumag
Člen | 2118
+
0
-

@err: A jsi si jistý že dojde k volání té tvé metody renderDefault? Schválně si do ní přidej vyhození výjimky. Možná jsi na jiném presenteru.

Editoval enumag (28. 9. 2013 19:08)

err
Člen | 77
+
0
-

Zkusil jsem tedy presunout do BasePresenteru, ktery se vola vzdy.
Ale vysledek je stale stejny.

public $users;
public function renderDefault()
{
    $this->template->users = 'xxx';
}

Takovouto promennou samozrejme pak vypisuji {$users} , nikoli pres cyklus.

Editoval err (28. 9. 2013 19:15)

enumag
Člen | 2118
+
0
-

Znovu: Jsi si jistý že se ta metoda renderDefault opravdu zavolá?

A druhá věc, nesnažíš se tu proměnnou náhodou použít v šabloně komponenty?

Editoval enumag (28. 9. 2013 19:21)

err
Člen | 77
+
0
-

Nejsem, mel jsem za to, ze je renderDefault() implicitni a vola se defaultne.

enumag
Člen | 2118
+
0
-

Schválně to zkus dát do metody beforeRender v BasePresenteru, to by fungovat mělo. Dále si podrobně nastuduj životní cyklus presenteru a případně si projdi zdrojový kód metody Presenter::run().

err
Člen | 77
+
0
-

Moc dekuji za rychle reakce.

Ano, to je funkcni. Tedy pouze staticke prirazeni. funkci z modelu findAll() uz to nechce.
V zasade jsem vychazel z example prikladu, konkretne z CD-collection (Akrabat). Ucim se to, tak jsem chtel pro zacatek jednoduse vypsat tabulku. A tohle je vysledek za pul dne. :-) Asi rychle skocim zpet k smarty …

Myslim, ze v demu chybi zakladni jednoducha aplikace o trech souborech na vypis dat z DB. Nevim, proc ma zacatecnik resit jmenne prostory, injektaz a pod.

Napr. jQuery jsem bez cehokoli pochopil a pouzival behem tydne. A to jsem nemusel studovat vsechny jeho zdrojaky. Nette zkousim podruhe a nejak se mi nedari se do nej stale dostat.

Editoval err (28. 9. 2013 20:03)