Snippet ve formuláři – error 500

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
tomees
Člen | 59
+
0
-

Zdarec, už nějakou dobu se celkem patlám s ajaxovým překreslením jednoho bloku ve formuláři. Jedná se o hodně dlouhý a složitý formulář, proto ho nemohu rozdělit do menších samostatných komponent.

Po pokusu překreslit snippet končím

ErrorException: end() expects parameter 1 to be array, null given in ..

ve vygenerované šabloně konkrétně zde

<td><?php echo end($this->global->formsStack)["attributes-$attr->id"]->getControl() /* line 570 */ ?></td>

toto problém řeší
$this->template->getLatte()->addProvider(‚formsStack‘, [$this[‚productForm‘]]);
narazil jsem na to zde na fóru, ale pravděpodobně to není to pravé

protected function createComponentProductAttributesGroupForm()
	{
		$form = $this->productAttributesGroupFormFactory->create($this->product->id);

		$form->onSuccess[] = function () {
			if($this->isAjax()) {
				$this->template->getLatte()->addProvider('formsStack', [$this['productForm']]);
				$this->redrawControl('contentWrapper');
				$this->redrawControl('attributes');
			} else {
				$this->redirect('this');
			}
		};

		return $form;
	}

zkusil jsem i snippetArea (contentWrapper), ale výsledek je stále stejný.

Nějaký tip jak na to správně a zda je to v současné verzi Nette vůbec funkční?

Editoval tomees (7. 11. 2017 16:50)

Šaman
Člen | 2659
+
0
-

Nemáš tam někde $this->template->_form = $this['form'];? To už myslím v Nette 2.4 nefunguje a není potřeba.
Nedávno jsem si s tím hrál, tak tady sdílím funkční řešení nad sandboxem Nette 2.4 se snippetAreou.


P.S. Ber to jako rychlý test funkčnosti, ne přímo mustr. Tu snippetAreu bych teď asi pojmenoval slovem area, abych pak věděl proč překresluji form i input (teď, po měsíci, jsem nad tím musel chvíli přemýšlet. Kdyby se to jmenovalo testFormArea a inputCity, bylo by to srozumitelnější).

Jo a ten data-link v šabloně tady není nutný, můžeš si ho vložit přímo do scriptu. Tohle používám, když mám script externí a šablonu formuláře taky samostatně (nebo se dá upravit renderer a ruční vypisování šablony pak není ani nutné).

Editoval Šaman (7. 11. 2017 17:26)

tomees
Člen | 59
+
0
-

Šaman napsal(a):

Nemáš tam někde $this->template->_form = $this['form'];? To už myslím v Nette 2.4 nefunguje a není potřeba.
Nedávno jsem si s tím hrál, tak tady sdílím funkční řešení nad sandboxem Nette 2.4 se snippetAreou.

nene nic takového nikde nemám, jen jsem udělal form a v něm klasicky snippet. Bohužel při pokusu o překreslení končím tou chybou. Jdu mrknout na tvé řešení.

tomees
Člen | 59
+
0
-

Tyjo.. až se stydím, ale díky tvému řešení jsem si všiml zapomenuté snippetArea okolo formuláře. To bylo pak obalené ještě jednou snippatAreou a tu jsem invalidoval..

Už to šlape jak má, prošel jsem to milionkrát a byl jsem si jistý že to mám tak jak to být má… no pro příště.

Díky moc za nakopnutí.