Problém s předáním proměnné z formuláře
- grovik
- Člen | 53
Po odeslání formuláře dostanu chybu:
Attempt to read property „locale_id“ on null
Kód kde se to sekne:
251: public function actionSelectLocal($id, $values)
252: {
253: //dump($values);
254: //$localeId = $request->post[‚locale_id‘];
255:
$this->database->table(‚contacts‘)->get($id)->update([‚locale_id‘=>$values->locale_id]);
256: $this->flashMessage(‚Kontakt přesunut‘);
257: $this->redirect(‚this‘);
258: }
Když se ale kouknu tak ta položka tam je v $_POST tam kde bych jí čekal:
$_POST
locale_id
‚1‘
Kde může být problém? Už nad tím blbnu třetí den a nemůžu na to přijít.
- MajklNajt
- Člen | 471
Takto sa k dátam z formulárov nepriatupuje, čítal si dokumentáciu? https://doc.nette.org/…in-presenter
- grovik
- Člen | 53
MajklNajt napsal(a):
Takto sa k dátam z formulárov nepriatupuje, čítal si dokumentáciu? https://doc.nette.org/…in-presenter
Díky za nakopnutí.
Přepracoval jsem to:
public function createComponentLocalForm()
{
$form = new Form;
$form->addSelect('locale_id', 'Vyberte oblast:', $this->getLocale())
->setRequired();
$form->addSubmit('send', 'Předat');
$form->onSuccess[] = [$this, 'formLocaleSucceeded'];
return $form;
}
public function formLocaleSucceeded(Form $form, $values)
{
dump($values);
$this->database->table('contacts')->get($form['id'])->update(['locale_id'=>$values->locale_id]);
$this->flashMessage('Kontakt přesunut');
$this->redirect('$this');
}
Chyba je pryč, ale výsledek se mi neuloží (zkoušel jsem tam jak je vidno DUMP a vůbec nenastane. Data se pochopitelně neuloží. Je to otravné, ale prostě se v tom plácám. :-)
- Marek Bartoš
- Nette Blogger | 1173
dump()
dumpuje do stránky. Jestli se ti hned po něm
přesměruje, tak ho nikdy neuvídíš. bdump()
dumpuje do Tracy
baru
Do redirect()
předávej 'this'
, ne
'$this'
. Nejde o proměnnou.
Do get()
předáváš $form['id']
namísto
$values['id']
– to by byla komponenta s názvem id
ve formuláři namísto hodnoty, která byla pro tuhle komponentu zaslána.
Též komponentu id
ve formuláři vůbec nedefinuješ, pouze
locale_id
.
Callback se ti též nemusí vykonávat, jestli nastala při validaci
formuláře chyba a tedy nejspíš chyby nerenderuješ. Ověříš si to
nejjednodušeji tak, že přidáš do formuláře callback na událost
onSubmit
(namísto onSuccess
) a
zavoláš bdump($form->getErrors()
- grovik
- Člen | 53
Marek Bartoš napsal(a):
dump()
dumpuje do stránky. Jestli se ti hned po něm přesměruje, tak ho nikdy neuvídíš.bdump()
dumpuje do Tracy baru
Doredirect()
předávej'this'
, ne'$this'
. Nejde o proměnnou.
Doget()
předáváš$form['id']
namísto$values['id']
– to by byla komponenta s názvemid
ve formuláři namísto hodnoty, která byla pro tuhle komponentu zaslána. Též komponentuid
ve formuláři vůbec nedefinuješ, pouzelocale_id
.
Callback se ti též nemusí vykonávat, jestli nastala při validaci formuláře chyba a tedy nejspíš chyby nerenderuješ. Ověříš si to nejjednodušeji tak, že přidáš do formuláře callback na událostonSubmit
(namístoonSuccess
) a zavolášbdump($form->getErrors()
Díky!
Mám tendence dělat věci podle příkladů… a občas mi to uniká. Super!
Jdu to vyzkoušet (bdump() – jsem zkoušel se stejným výsledkem).
Komponenta s názvem ‚id‘ je předávaná jak parametr v odkazu.
Je to totiž několik formulářů, které mají ID přiřazené podle toho
o jaký se jedná záznam v DB. SELECTEM se vybere nová lokalita (local_id) a
ta se odešle a těch formulářů je tam víc takže ID funguje jako něco co
říká, na kterém řádku se to bude měnit.
Když to tak píšu možná by bylo lepší to udělat jinak. Možná vytvořit
skryté pole s hodnotou ID.
Editoval grovik (13. 2. 2023 18:02)
- grovik
- Člen | 53
Tak jsem se k tomu vrátil.
Udělal jsem změny. To ID jsem předal jako hidden input.
Žádná chyba nepadne, ale stejně to nefunguje.
Latte:
<form action="{link Admin:kontakty}" method="post">
<input style = "font-size:small" type="submit" value="Předat" class="btn btn-primary">
<input type="hidden" value="{$row->contact_id}" id="id" name="id" >
<select style = "font-size:small" class="select" name="locale_id">
{foreach $locales as $locale}
<option style = "font-size:small" value="{$locale->locale_id}" {if $locale->locale_id == $row->cli}selected{/if}>{$locale->locale_name}</option>
{/foreach}
</select>
</form>
PHP:
public function createComponentLocalForm()
{
$form = new Form;
$form->addSelect('locale_id', 'Vyberte oblast:', $this->getLocale())
->setRequired();
$form->addSubmit('send', 'Předat');
$form->onSubmit[];
$form->onSuccess[] = [$this, 'formLocaleSucceeded'];
return $form;
}
public function formLocaleSucceeded(Form $form, $values)
{
$this->database->table('contacts')->get($values['id'])->update(['locale_id'=>$values->locale_id]);
$this->flashMessage('Kontakt přesunut');
$this->redirect('this');
}
Vrtá mi to hlavou, přidal jsem tam bdump($values), ale ten nic neukáže. Z toho jsem dovodil, že někde proběhne nějaký redirect. Je to možné?
Zkoušel jsem i ten bdump($forms).
Koukal jsem co se posílá v tom postu a tam jde krásně ‚id‘ a
‚locale_id‘.
Mají správnou hodnotu.
Editoval grovik (16. 2. 2023 17:10)
- Marek Bartoš
- Nette Blogger | 1173
Nikde nevypisuješ chyby z formuláře.
$form->onSubmit[]; samo o sobě vůbec nic nedělá
V objektu Form nemáš přidané id, v $values se ti nikdy hodnota neukáže
jen proto, že je definovaná v šabloně. Takhle by si mohl uživatel
definovat ve formuláři libovolné fieldy. Chybí ti
$form->addHidden('id')
Nikde není vidět, jak děláš bdump()
Vyházej ze šablony action, id, name, type a value atributy. Od toho má Nette
pro Latte n:name makro. To ti všechno správně doplní. action má odkazovat
na komponentu v presenteru a ne na presenter, id jsou též specifická pro
komponentu v presenteru. Jinak by nešlo odlišit různé formuláře na jedné
stránce.
Viz https://doc.nette.org/…in-presenter
a https://doc.nette.org/…ms/rendering#….
Prostuduj si dokumentaci.
Editoval Marek Bartoš (16. 2. 2023 17:41)