nette.ajax.js – předání proměnné do template a následný refresh

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

Zdravím,

odesílám formulář ajaxem. V presenteru, na základě hodnot ve formu, předávám proměnnou do template. Na téhle proměnné záleží, co se na stránce ukáže (mohou to být dva odlišné kusy kódu podle hodnoty proměnné). Nicméně po ajaxu se stránka neobnoví stejně jako po odeslání formuláře bez ajaxu.

Jak tedy docílit toho, aby se stránka obnovila, ale bez ztráty vložené proměnné do template?

Zkoušela jsem různé kombinace redrawControl() (což nikdy nedělalo nic) nebo refresh natvrdo pomocí jquery. Ale nic nepomohlo. Je vůbec možné v rámci ajaxu takto vkládat proměnné do template?

Pro jistotu kousek kódu. Presenter:

protected function createComponentSaleForm()
{
	$form = $this->saleForm->create();

	$form->onSuccess[] = function ($form) {
		$this->template->tickets = $this->eventManager->ticketSummary($form->getValues()->json);
		//metoda ticketSummary proběhne v pořádku (změny se promítnou v db)
	};

	return $form;
}
ParallelUniv3rse
Člen | 13
+
+1
-

kód co chceš znovu překreslit obal do makra {snippet jmenoSnippetu}{/snippet} a v presenteru na onsucces
$this->redrawControl(„jmenoSnippetu“);

Editoval ParallelUniv3rse (12. 6. 2015 7:51)

kikinet
Člen | 35
+
0
-

ParallelUniv3rse napsal(a):

kód co chceš znovu překreslit obal do makra {snippet jmenoSnippetu}{/snippet} a v presenteru na onsucces
$this->redrawControl(„jmenoSnippetu“);

To snad ne! Myslela jsem, že snippet se používá jen pokud chceme překreslit stejný kód (např. fakturu). Příště nebudu myslet a vyzkouším to.

Díky za odpověď :)

kikinet
Člen | 35
+
0
-

Narazila jsem ještě na jednu věc. Krom jiného překresluji i formulář (text submit buttonu a hidden input value), nicméně hodnota hidden inputu se nechce změnit. Dělám to takto:

$form->addHidden('buy');

if(empty($_POST['json']) || $_POST['buy'] == 'true') {
	$form->addSubmit('submit', 'View summary')
		->setAttribute('class', 'ajax');
	$form['buy']->setValue('false');
} else {
	$form->addSubmit('submit', 'Buy ticket(s)')
		->setAttribute('class', 'ajax');
	$form['buy']->setValue('true');
}

v presenteru:

{snippet sale}
  ...
  {control saleForm}
{/snippet}

Po odeslání se změní změní název submit buttonu, ale ne hodnota hidden inputu. Bez ajaxu a snippetu funguje. Přehlížím něco, nebo to touhle cestou nepůjde?
Zkoušela jsem měnit hodnotu inputu pomocí jquery přímo v template, to ale vypadá, jako by byl script úplně ignorován.

EDIT: Vyřešeno
Z nějakého důvodu stačilo do snippetu přidat řádek

<script src="{$basePath}/js/nette.ajax.js"></script>

předtím byl mimo něj.

Editoval kikinet (12. 6. 2015 23:45)