Dependent selectbox – Undefined variable: _form
- kejlicz
- Člen | 201
Ahoj všichni.
Zkouším zprovoznit tento závislý selectbox https://blog.nette.org/…-and-pure-js#…
Dělám ten první Single dependent select.
Mám vše jako v příspěvku,ale v šabloně na řádku
{label second /} {input second}
mi to vyhazuje chybu Undefined variable: _form a mě nějak není jasné proč.
Díky za radu, případně za doporučení jiného funkčního řešení.
Editoval kejlicz (24. 11. 2016 0:10)
- Zuben45
- Člen | 268
můžeš ukázat celou šablonu, popřípadě celou část s formulářem a celou chybovou hlášku ?
To by pomohlo v hledání problému.
EDIT: Tak mě napadlo, není u té hlášky napsaný řádek, ale z cache šablony ? Pokud ano, tak se musíš řídit řádek v cache, a né v původní šabloně (latte). Chyba naznačuje, že není definovaná proměná _form, takže bych hledal řádky s začátkem formuláře ;)
Editoval Zuben45 (24. 11. 2016 15:23)
- Jan Mikeš
- Člen | 771
V návodu je velice důležitý tento kus kódu v presenteru, který ti pravděpodobně chybí:
public function renderDefault()
{
$this->template->_form = $this['selectForm'];
}
Kód je nešikovně zařazen až pod Multiple dependent selects je ale nezbytné, aby jsi jej použil i u tohoto single.
Editoval Jan Mikeš (24. 11. 2016 15:42)
- iNyxLadis
- Člen | 48
Jan Mikeš napsal(a):
V návodu je velice důležitý tento kus kódu v presenteru, který ti pravděpodobně chybí:
public function renderDefault() { $this->template->_form = $this['selectForm']; }
Kód je nešikovně zařazen až pod Multiple dependent selects je ale nezbytné, aby jsi jej použil i u tohoto single.
Mohu se optat proč je nutné ho použít?
Viz komentář od D.G. z https://forum.nette.org/…nette-2-4-rc
, Už se nepoužívá interní proměnná $_form, kterou někdy bylo potřeba
ručně předávat do inkludovaných šablon, což už není potřeba, nebo
kvůli snippetům uvnitř formulářů, což nyní povede k chybě (např.
end() expects parameter 1 to be array, null given). Takže pokud si kvůli
snippetům předáváte do šablony $template->_form = $form, můžete to
nahradit za $template->getLatte()->addProvider(‚formsStack‘, [$form]),
nicméně jde stále jen o obezličku, korektní je použít {snippetArea xyz}
a ten invalidovat společně se snippetem. – A pokud se nemýlím, je
v příkladu použit snippetArea správně.
Editoval iNyxLadis (24. 11. 2016 16:01)
- Jan Mikeš
- Člen | 771
Pokud ti to tedy nefunguje, asi nezbyde nic jiného než využít (již tebou zmíněné a citované od DG)
public function renderDefault()
{
$this->template->getLatte()->addProvider('formsStack', [$this["selectForm"]]);
}
Zkus ještě prosím poslat více tvého kódu – šablonu a presenter, třeba najdeme nějaké nesrovnalosti.
- iNyxLadis
- Člen | 48
Jan Mikeš napsal(a):
Pokud ti to tedy nefunguje, asi nezbyde nic jiného než využít (již tebou zmíněné a citované od DG)
public function renderDefault() { $this->template->getLatte()->addProvider('formsStack', [$this["selectForm"]]); }
Zkus ještě prosím poslat více tvého kódu – šablonu a presenter, třeba najdeme nějaké nesrovnalosti.
Díky za reakci, pouze upozorním, že jsem jiná osoba, než původní dotazující. Mě pouze zaujalo, jelikož momentálně také tento ajaxový způsob selectboxů řeším, že uvádíš variantu, která je vlastně už „deprecated“. A jelikož jsem noob, tak mě zajímalo, zda to má nějaké opodstatnění :-).
- Jan Mikeš
- Člen | 771
@iNyxLadis omlouvám se, nevšiml jsem si :-).
Opodstatnění to má takové, že $_form
stejně jako
$_control
a mnoho dalších jsou interní proměnné a neměly by
se uživatelem využívat a šahat na ně, jedná se tedy o „hack“ –
formuláře totiž interně tuto proměnnou používají a při překreslení
snippetu nemají tuto proměnnou k dispozici, proto tato chyba vzniká. Je
potřeba ji tedy inicializovat a naplnit, ať už
$this->template->_form
nebo řešením uvedeným výše.
Tento způsob dependent selectboxů také používám a přiznám se že
invalidováním snippetarey společně se snippetem se mi to nepodařilo rozjet,
tak jsem zůstal u staré ověřené interní proměnné
$_form
.
Pevně věřím že v budoucnu se podaří situaci se snippety ve formulářích vyřešit a tyto hacky nebudou potřebné.
Editoval Jan Mikeš (24. 11. 2016 17:18)
- iNyxLadis
- Člen | 48
Jan Mikeš napsal(a):
@iNyxLadis omlouvám se, nevšiml jsem si :-).
Opodstatnění to má takové, že
$_form
stejně jako$_control
a mnoho dalších jsou interní proměnné a neměly by se uživatelem využívat a šahat na ně, jedná se tedy o „hack“ – formuláře totiž interně tuto proměnnou používají a při překreslení snippetu nemají tuto proměnnou k dispozici, proto tato chyba vzniká. Je potřeba ji tedy inicializovat a naplnit, ať už$this->template->_form
nebo řešením uvedeným výše.Tento způsob dependent selectboxů také používám a přiznám se že invalidováním snippetarey společně se snippetem se mi to nepodařilo rozjet, tak jsem zůstal u staré ověřené interní proměnné
$_form
.Pevně věřím že v budoucnu se podaří situaci se snippety ve formulářích vyřešit a tyto hacky nebudou potřebné.
OK ok :-) super, tak už chápu. Já se přiznám, že mám taky trochu problém to dát do provozuschopného stavu, každopádně jsem na tom opačně. Při pokusu řešit to skrze interní proměnné dostávám chybu, kterou G.D. popsal v již zmíněném odkazu, tedy end() expects parameter 1 to be array, null give. Pomocí snippetů se mi to zdá se rozjet povedlo, alespoň tedy co se týče samotné Ajaxové stránky věci. Nyní se potýkám s problémem zápisu do databáze, ale to bude asi už zase jiný problém.
Jinak pro autora tohoto dotazu – mě osobně velice pomohl toto vlákno, https://forum.nette.org/…ct-with-ajax