Odeslání formuláře přes AJAX – JSON odpověď není aktuální

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

Ahoj,

mám problém s překreslováním snippetů a nevidím nic, co bych měl špatně. Díval jsem se na fórum i na tutoriály a měl bych mít doufám všechno tak, jak by mělo být (?)

TestPresenter.php

<?php
	public function actionDefault($id) {
		$this->template->items = dibi::query('select * from [test]')->fetchAll();
	}

	public function createComponentFormAdd() {
		$form = new AppForm;
		$form->getElementPrototype()->class('ajax');
		$form->addText('text', 'Text:');
		$form->addSubmit('send', 'Odeslat');
		$form->onSubmit[] = callback($this, 'formAddSubmitted');
		return $form;
	}

	public function formAddSubmitted(AppForm $form) {

		dibi::query('insert into [test]', $form->getValues());

		$this->flashMessage('Ulozeno');
		if($this->isAjax()) {
			$this->invalidateControl('items');
			$this->invalidateControl('form');
			$form->setDefaults(array(), TRUE);
		} else {
			$this->redirect('this');
		}
	}
?>

default.latte

@{block content}

{snippet items}
{foreach $items as $item}
{$item->text}<br>
{/foreach}
{/snippet items}

{snippet form}
{control formAdd}
{/snippet form}

V hlavním layoutu vkládám obsah šablon @{include #content}

Zavináče asi už nějsou potřeba (?) – zkoušel jsem to i bez nich, stejný výsledek.

Mám Nette 2.0-alpha2 pro PHP 5.2

Formulář se odešle pomocí AJAXu, do DB se uloží nový záznam, ale ve vrácených datech (json) mám data bez právě vloženého záznamu. Ve formuláři zůstává vyplněné políčko. Po znovuodeslání formuláře dojde k přesměrování a ve výpisu se objeví dva nové záznamy.

Nevíte kde by mohl být problém nebo co mám špatně?

Díky moc

Editoval joe (6. 1. 2011 18:00)

marau
Člen | 50
+
0
-

Kde přesné načítáš ta data? Před zpracováním formuláře nebo až po?

joe
Člen | 313
+
0
-

Jaká data myslíš? Zjednodušil jsem to až na ten kód, co jsem poslal, nic víc není.

Část problému jsem odhalil, místo actionDefault() má být renderDefault(), ale formulář po odeslání zůstává pořád stejný a po druhém odeslání už nedojde k AJAXu.

bojovyletoun
Člen | 667
+
0
-
  • ano, data máš načítat v render, protože signál(vložení dat) následuje po akci a před renderem. Předtím stránka fungovaloa takto: načetl jsi data z databáze do šablony a pak jsi uložil nový záznam. Více zde:„https://doc.nette.org/cs/application/presenters“
  • form nějak restej, myslím, ž není nutná invalidace, ale po odeslání ajaxsubmi() volat něco jako reset()
  • nejspíš voláš $(form .ajax). live(click, function (){...ajaxsubmit()}); jenže když ten form refreshuješ pomocí snippetu, tak se vazba live přeruší… Hledej na foru, použij plugin livequery
joe
Člen | 313
+
+1
-

bojovyletoun: Vím, nějak jsem to přehlídnul a nedošlo mi to s tím životním cyklem presenteru. Formulář už jsem objevil, stačí se k tomu vrátit po chvíli a pak to člověk vidí…

$form->setValues(array(), TRUE);

Díky za pomoc.