AJAX po přechodu na verzi 2.2

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

Ahoj, už několik dní si s tím lámu hlavu a nemůžu najít, kde je problém.

Přešli jsme z Nette 2.0 na Nette 2.2.7 a všechno funguje v pohodě. Nyní chci některé formuláře převést do AJAXu a ať dělám, co chci, tak nefunguje (resp. při stisku tlačítka se stránka stejně refreshne celá). Zajímavé je, že formuláře, kde už AJAX byl, fungují v pohodě, i když to vlastně dělám podle nich. Možná jsem jenom na něco zapomněl, tak prosím o nakopnutí :)

Jednoduché přidání tlačítka (refreshne celou stránku):

$this->addSubmit("test", "Test")->setAttribute('class', 'ajax')->onClick[] = function($button) { \Tracy\Debugger::log("test"); };

Pokud, ale k tlačítku přidám setValidationScope(FALSE), tak se AJAX provede správně.

A ještě drobnost (možná důležitá) – v kódu postaveném na Nette 2.0 to funguje dobře.

kolsi
Člen | 131
+
0
-

Tak to vypadá, že za to může tento řádek:

$this->addDate('date_start', 'Start date', DateInput::TYPE_DATE)->setRequired('Fill in start date.');

Pokud tam není (resp. tam je, ale bez pravidla setRequired), tak AJAX jede. U jiných polí setRequired funguje v pohodě, takže problém bude s tím datumem. K tomu používám doplněk DateInput.

Když tracuju ve Firebugu, tak se zastaví na chybě:

TypeError: elem.form.elements[elem.name] is undefined
https://***/2.1/js/netteForms.js
Line 47

kde proměnná „elem“ odpovídá právě tomu pickeru:

+ 	elem								input#frm-projectForm-date_start.hasDatepicker property value = "16.1.2015" attribute value = "null"
		jQuery1110035094418018632734	33

Setkal se s tím už někdo?

Editoval kolsi (16. 1. 2015 12:22)

kolsi
Člen | 131
+
0
-

I když asi nikdo nezná odpověď, tak jsem zjistil, že problém je v doplňku DateInput (resp. jQuery DatePicker) a netteForms.js z verze 2.2.

Normální situace bez DatePickeru:

<input id="frm-projectForm-date_start" type="date" value="2015-01-19" data-nette-rules="[{"op":":filled","msg":"Fill in start date."}]" required="" data-dateinput-type="date" name="date_start">

situace z DatePickerem je však následující, protože ten doplněk původní input rozdělí na dva, přičemž u prvního zruší atribut „name“. A to se nelíbí novému netteForms.js, které na tom vyhodí výjimku:

<input id="frm-projectForm-date_start" class="hasDatepicker" type="text" value="2015-01-19" data-nette-rules="[{"op":":filled","msg":"Fill in start date."}]" required="" data-dateinput-type="date">
<img class="ui-datepicker-trigger" src="***/2.1/images/icons/16px/cal.png" alt="..." title="...">
<input type="hidden" value="2015-01-19" required="" name="date_start">

Pokud do verze Nette 2.2 nahraju netteForms.js z verze 2.0, tak všechno funguje jak má.

michal.lohnisky
Člen | 64
+
0
-

Mám stejný problém. Navrhnul jsem pull request: https://github.com/…Input/pull/8
Hotfix, který mi funguje: https://github.com/…fe681b174717

Editoval michal.lohnisky (4. 2. 2015 10:50)

kolsi
Člen | 131
+
0
-

Reaguji trochu se zpožděním, ale zjistil jsem, že tebou navržené řešení způsobí, že datumová hodnota se v postu odešle dvakrát:

date_start	30.6.2013
date_start	2013-06-30
michal.lohnisky
Člen | 64
+
0
-

Ano a vezme se ta druhá hodnota a proto to celé funguje.