Z jakého důvodu vyhazuje latte uvnitř snippetů warning na nedefinovanou proměnnou?

Polki
Člen | 553
+
0
-

Ahoj,
mám tento kód:

{snippetArea area}
    {var $aaa = 'aaa'}
    {snippet ahoj}
        {$aaa}
    {/snippet}
{/snippetArea}

a tracy zahlásí:
Warning

Undefined variable $aaa

Opravdu jde jen o tento kousek kódu v čistém Nette nainstalovaném pomocí composer create-project nette/web-project nette-blog. Nikde jinde nic jiného, co by mohlo na tento warning mít vliv nemám.

Tento warning vyskakuje při PRVNÍM načtením stránky tedy před tím, než se vůbec pokusím provést nějaký AJAX.
Je to chyba, nebo feature a musím tedy napsat to co potřebuji jinak?

Latte 2.10.7

Editoval Polki (26. 12. 2021 14:51)

David Grudl
Nette Core | 8218
+
0
-

Sniper je doslova výstřižek, nevidí nic kolem sebe.

Polki
Člen | 553
+
0
-

No tomu rozumím, ale co si pamatuju, tak v minulých verzích to bylo tak, že daný kontext dovnitř snippetu předával proměnné. Tedy pokud jsem vykreslil tuto stránku poprvé (bez ajaxu) tak se přirozeně proměnná $aaa nadefinovala a potom se předala do definice snippetu ahoj

No a v případě ajaxového požadavku, kdy se překreslil jen snippet ahoj už to tento warning vyhodilo, jelikož se vykrelil jen tento výstřižek, který o okolí nic nevěděl a tedy nebyla proměnná $aaa nadefinovaná, což je v pořádku.
Proto se vymyslela ta snippetArea, kterou já jsem si nazval area a která vykreslila ten kontext okolo snippetu ahoj, vytvořila tu proměnnou $aaa a předala ji do snippetu ahoj a na klienta se poslal jen obsah snippetu ahoj, takže při překreslení jak area tak ahoj se klientovi poslal jen obsah snippetu ahoj, ale na straně serveru byl vykonán všechen kód uvnitř snippetArey area a tedy už to žádný warning neházelo.

Co se změnilo?

Případně jak mám tu proměnnou do toho snippetu dostat?

EDIT 1:
Zkoušel jsem to na 2.4 a tam to nefunguje. Asi jsem si to s něčím popletl tedy, jelikož jsem to reálně nikdy nepotřeboval. Nicméně otázka zůstává. Jak dostat hodnotu dovnitř snippetu?

Editoval Polki (26. 12. 2021 17:46)

Polki
Člen | 553
+
0
-

O co jde přesně je to, že mám formulář, ve kterém můžu dynamicky přidávat hodnoty do selectu.

a potřebuju teda po přidání hodnoty do databáze aktualizovat ten select, ale aby se nevymazaly ostatní pole formuláře. Takže jsem měl něco takového:

{snippetArea formSnippetArea}
	{snippet form}
		{form form, class => 'ajax'}
			<div>
				{label name}
				{input name}
				<div class="invalid-feedback" n:foreach="$form->getComponent('name')->errors as $error">{$error}</div>
			</div>
			<div n:snippet="snippetSelect">
				{label select}
				{input select}
				<div class="invalid-feedback" n:foreach="$form->getComponent('select')->errors as $error">{$error}</div>
			</div>
		{/form}
	{/snippet}
{/snippetArea}

No a počítal jsem s tím, že když se aktualizuje obsah selectu, tak zavolám:

$this->redrawControl('formSnippetArea');
$this->redrawControl('snippetSelect');

a na klienta se pošle jen ten select.
Problém je to, že mě to ani nenechá poprvé vykreslit, jelikož mi tracy zahlísí warning, že neexistuje proměnná $form na řádku

<div class="invalid-feedback" n:foreach="$form->getComponent('select')->errors as $error">{$error}</div>

Používat dynamické snippety a vykreslovat jednotlivé option toho selectu je taky cesta, ale tohle mě docela zarazilo, tak bych rád věděl, jestli to tak prostě je a já si to musím nějak hacknout opět.

David Grudl
Nette Core | 8218
+
0
-

Takhle to funguje od počátku věků. Nejjednodušší řešení je si ten $form předat do šablony.

Polki
Člen | 553
+
0
-

Dobře dekuji