Z jakého důvodu vyhazuje latte uvnitř snippetů warning na nedefinovanou proměnnou?
- Polki
- Člen | 553
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)
- Polki
- Člen | 553
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
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
Takhle to funguje od počátku věků. Nejjednodušší řešení je si ten $form předat do šablony.