Problém s AJAXovým načtením formuláře

theo
Člen | 57
+
0
-

Mám problém s nepřekreslujícím se formulářem skrze AJAX. Zamýšlená funkcionalita je taková, že vyplním hodnotu formuláře, kliknu na tlačítko Load, což provede AJAXový požadavek, ve kterém se podle zadané hodnoty načte a vyplní jiná položka formuláře (pro test nahrazeno statickým textem Nejaka hodnota). Nicméně po kliknutí na toto tlačítko se načte formulář vyplněný 1. hodnotou, nikoliv však druhou.

Původně je formulář pochopitelně mnohem složitější (a ručně vykreslovaný), nicméně to nefunguje ani v takto primitivním příkladu. Můžete mi někdo poradit co s tím? Možná že je to nějaká trivialita, ale já na to nemůžu už týden přijít…

Projekt stavím na Nette 2.4 a aktuálních verzích knihoven (instalovaných spolu s touto verzí Nette).

Presenter:

public function renderAdd()
{
	$form = $this->getComponent('testForm');
	$form->setDefaults($this->formValues);

	$this->template->testForm = $form;
} // renderAdd()

public function handleTest(Controls\SubmitButton $button)
{
	$values = $button->getForm()->getValues();
	$values['test2'] = 'Nejaka hodnota';

	$this->formValues = $values;

	if ($this->isAjax()) {
		$this->redrawControl('test');
	} // if
} // handleTest()

protected function createComponentTestForm()
{
	$form = new UI\Form;
	$form->getElementPrototype()->class('ajax');

	$form->addText('test1', 'Test1');

	$form->addText('test2', 'Test2');

	$form->addSubmit('load', 'Load')
		->onClick[] = [ $this, 'handleTest' ];

	$form->addSubmit('ok', 'OK')
		->onClick[] = [ $this, 'handle Add' ];

	return $form;
} // createComponentTestForm()

Šablona:

<script src="/bower_components/jquery/dist/jquery.js"></script>
<script src="/bower_components/nette-forms/src/assets/netteForms.js"></script>
<script src="/bower_components/nette.ajax.js/nette.ajax.js"></script>
<script>
	$(document).ready(function() {
		$.nette.init();
	});
</script>

...

{snippet test}
	{!$testForm}
{/snippet}
Phalanx
Člen | 310
+
0
-

Nepřepisuješ si náhodou proměnné zpět v metodě renderAdd?

<?php
public function renderAdd()
{
    $form = $this->getComponent('testForm');

	// zkus obalit
	if ( ! $this->isAjax()) {
    	$form->setDefaults($this->formValues);
	}
...
?>

Editoval Phalanx (5. 9. 2018 20:34)

Roman Halaxa
Člen | 60
+
0
-

@theo

Nevím jestli ti to pomůže, ale možná vše co potřebuješ je nastavit atribut ajax i pro submit tlačítka (Aspoň u mě to bez toho nefunguje…) Tím myslím udělat u submit tlačítek setAttribute(‚class‘, ‚ajax‘).

Editoval Roman Halaxa (6. 9. 2018 7:55)

Ondřej Kubíček
Člen | 494
+
+1
-

Roman Halaxa napsal(a):

@theo

Nevím jestli ti to pomůže, ale možná vše co potřebuješ je nastavit atribut ajax i pro submit tlačítka (Aspoň u mě to bez toho nefunguje…) Tím myslím udělat u submit tlačítek setAttribute(‚class‘, ‚ajax‘).

to normálně není potřeba

theo
Člen | 57
+
+1
-

Děkuji všem za nápady, nicméně nakonec je všechno jinak. To co jsem potřeboval vědět je, že od nějaké verze Nette (2.2?)má Nette\Application\UI\Form metodu setValues(), a metoda setDefaults() už tedy nefunguje tak jak dříve fungovala a skutečně nastavuje pouze výchozí hodnoty, zatímco při zpracování formuláře je potřeba nastavovat hodnoty pomocí metody setValues(). Správně to tedy má být takto:

public function renderAdd()
{
    $form = $this->getComponent('testForm');
    $form->setValues($this->formValues);

    $this->template->testForm = $form;
} // renderAdd()

Díky za snahu, doufám, že toto diskuzní vlákno někomu pomůže v řešení podobných záhad na jaké jsem narazil. Vlákno lze označit za vyřešené.