Problém s předáním proměnné z formuláře

grovik
Člen | 53
+
0
-

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.

David Grudl
Nette Core | 8139
+
0
-

Co je $request a co má být $request->post?

MajklNajt
Člen | 471
+
0
-

Takto sa k dátam z formulárov nepriatupuje, čítal si dokumentáciu? https://doc.nette.org/…in-presenter

grovik
Člen | 53
+
0
-

David Grudl napsal(a):

Co je $request a co má být $request->post?

To byl pokus dostat se k té proměnné (proto je tam // protože to je zakomentované).

grovik
Člen | 53
+
0
-

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
+
+2
-

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
+
0
-

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
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()

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
+
0
-

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
+
0
-

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)