Problém s AJAXovým načtením formuláře
- theo
- Člen | 57
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}
- Roman Halaxa
- Člen | 60
@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
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
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é.