NetteForms a Naja mi nevaliduje formulář po odeslání

chemikus
Člen | 54
+
0
-

Ahoj, prosím o pomoc – asi určitě dělám něco zle.
Dříve jsem používal NetteForms k validate formuláře před odesláním v projektu a vše fungovalo. Když bylo něco chybně, vyskočil na mě alert message a formulář se neodeslal.

Nyný je potřeba připojit Naja do projektu – nikdy jsem s Naja nepracoval. Postupoval jsem podle návodu a nyní mám v @layout.latte šabloně toto:

<script src="https://unpkg.com/naja@2/dist/Naja.min.js"></script>
<script src="https://unpkg.com/nette-forms@3"></script>

<script>
	$(function () {
		naja.initialize();
	});
</script>

Bohužel, při odeslání formuláře mi nevyskočí žádný javascript alert…

Můžete mi prosím poradit, co dělám zle?

Editoval chemikus (11. 12. 2024 10:52)

Kalfi
Člen | 16
+
0
-

Píšu z hlavy, ale zkus tohle:

<script src="https://unpkg.com/naja@2/dist/Naja.min.js"></script>
<script src="https://unpkg.com/nette-forms@3"></script>

<script>
    $(function () {
        naja.formsHandler.netteForms = window.Nette;
        naja.initialize();
    });
</script>

https://naja.js.org/#…

chemikus
Člen | 54
+
0
-

Nope, stále žádný alert message. Nepotřebuji něco nastavit i přímo pro ten formulář, abych mu řekl, že tenhle se má validovat přes Nette?

Kalfi
Člen | 16
+
0
-

Ukaž ten form a zkontroluj, zda se Ti naja i nette-form načítají

Editoval Kalfi (11. 12. 2024 13:00)

chemikus
Člen | 54
+
0
-

Kalfi napsal(a):

Ukaž ten form a zkontroluj, zda se Ti naja i nette-form načítají

Ahoj,

podíval jsem se do konzole a mám tam tuhle chybu, když to použiju přes tu Naja…

Uncaught SyntaxError: import declarations may only appear at top level of a module

		<!-- Nette -->
		<script src="https://unpkg.com/naja@2/dist/Naja.min.js"></script>
		<script src="https://unpkg.com/nette-forms@3"></script>

		<script>
			$(document).ready(function () {

				naja.initialize();
				import netteForms from 'nette-forms';
								naja.formsHandler.netteForms = netteForms;

			});
		</script>

Co přesně z toho formuláře chceš ukázat?

<form action="..." method="post" class="needs-validation form-horizontal" id="frm-addReservationForm" novalidate="novalidate">
	<div>
		<div class="form-group my-3 required">
			<label for="frm-addReservationForm-name" class="required">Jméno a Příjmení:</label>
			<input type="text" name="name" class="form-control text" id="frm-addReservationForm-name" required data-nette-rules='[{"op":":filled","msg":"Zadejte prosím vaše celé jméno."}]'>
		</div>

...

		<div class="form-group my-3">
			<input type="submit" name="send" class="w-100 btn btn-primary button" value="Dokončit rezervaci">
		</div>
	</div>
</form>
m.brecher
Generous Backer | 905
+
0
-

@chemikus

Copilot radí upravit script takto:

<script type="module">
  import netteForms from 'nette-forms';

  $(document).ready(function () {
    naja.initialize();
    naja.formsHandler.netteForms = netteForms;
  });
</script>
chemikus
Člen | 54
+
0
-

Tak tím jsme se posunuli akorát jiné chybě :)

Uncaught TypeError: The specifier “nette-forms” was a bare specifier, but was not remapped to anything. Relative module specifiers must start with “./”, “../” or “/”.

Když to upravím, aby za tím ‘from’ byla cesta k souboru co mám uložený na localhostu, tak to zas napíše jinou chybu :)

Uncaught SyntaxError: The requested module 'http://localhost/www.escapekv.cz/www/netteForms.min.js' doesn't provide an export named: 'default'

		<!-- Nette -->
		<script src="https://unpkg.com/naja@2/dist/Naja.min.js"></script>

		<script type="module">
			import netteForms from '/www.escapekv.cz/www/netteForms.min.js';

			$(document).ready(function () {
				netteForms.initOnLoad();
			});
		</script>

PS: A to se jen snažím jít přesně dle dokumentace na webu https://doc.nette.org/…s/validation#…

jeremy
Člen | 58
+
+2
-

Myslim ze se snazis mixovat nacitani tech balicku pres CDN a zaroven jako moduly pres import.
Vyber si jen jedno, pokud chces pouzit import tak asi nejjednodussi bude pouzit npm manager.

Po pravde by tohle melo stacit…

<script src="https://unpkg.com/nette-forms@3"></script>
<script src="https://unpkg.com/naja@3/dist/Naja.min.js"></script>

<script>
    $(document).ready(function () {
        naja.initialize();
    });
</script>

Editoval jeremy (14. 2. 10:32)

mskocik
Člen | 74
+
0
-

chemikus napsal(a):

		<!-- Nette -->
		<script src="https://unpkg.com/naja@2/dist/Naja.min.js"></script>
		<script src="https://unpkg.com/nette-forms@3"></script>

		<script>
			$(document).ready(function () {

				naja.initialize();
				import netteForms from 'nette-forms';
								naja.formsHandler.netteForms = netteForms;

			});
		</script>

Tebe to vyhadzuje chybu, lebo kombinuješ ES modul s normálnym kódom. Kebyže vyhodíš tieto riadky, tak ti to bude fungovať (tak ako píše aj @jeremy).

import netteForms from 'nette-forms';
naja.formsHandler.netteForms = netteForms;

Aj v samotnej naja dokumentácií je uvedené toto:

By default, the nette-forms object is expected to reside in the global namespace: window.Nette. If you use ES modules and import nette-forms into a different variable, you should configure the correct reference manually:

Tým, že odkazuješ priamo na skript <script src="https://unpkg.com/nette-forms@3"></script>, tak máš dostupný globalný objekt Nette, ktorý Naja automaticky použije na validáciu pred submitom. Tá ďalšia veta + kód importu ES modulu nette-forms sa ťa netýka.

Editoval mskocik (14. 2. 10:52)

chemikus
Člen | 54
+
0
-

Kluci, já vám nevím …

		<!-- Nette -->
		<script src="https://unpkg.com/nette-forms@3"></script>
		<script src="https://unpkg.com/naja@2/dist/Naja.min.js"></script>

		<script>
			$(document).ready(function () {
				naja.initialize();
			});
		</script>

Tohle tam mám. Ptal jsem i copilota na nějaké triky, doporučil mi upravit formulář na toto…

<form action="..." method="post" class="needs-validation form-horizontal" data-nette-validation="data-nette-validation" id="frm-addReservationForm" novalidate="novalidate">
	<div>
		<div class="form-group my-3 required has-error">
			<label for="frm-addReservationForm-name" class="required">Jméno a Příjmení:</label>
			<input type="text" name="name" class="form-control text" id="frm-addReservationForm-name" required="" data-nette-rules="[{&quot;op&quot;:&quot;:filled&quot;,&quot;msg&quot;:&quot;Zadejte prosím vaše celé jméno.&quot;}]">
	</div>
...
	<div>
		<div class="form-group my-3">
			<input type="submit" name="send" data-send="" class="w-100 btn btn-primary button" value="Dokončit rezervaci">
		</div>
	</div>
</form>

Pak mi ještě řekl, ať přes konzoli zkontroluji zda mám Nette dobře načtené console.log(typeof Nette); Tam mi to napíše Object. Zkontroloval jsem i přes konzoli, jestli se mi soubor připojil v pořádku a netteForms tam mám načtené…

A přesto, když kliknu na tlačítko „odeslat“, tak se mi odešle formulář aniž by se spustila validace :)

Nechcete si někdo zavolat a opravit mi to napřímo? :-D

jeremy
Člen | 58
+
+1
-
<form ... class="ajax needs-validation form-horizontal" ...>

Zkus pridat tridu ajax tomu formulari.

chemikus
Člen | 54
+
0
-

jeremy napsal(a):

<form ... class="ajax needs-validation form-horizontal" ...>

Zkus pridat tridu ajax tomu formulari.

Haha… good! Když je tam AJAX tak to funguje … ale co když ho nechci posílat přes Ajax?

jeremy
Člen | 58
+
0
-

Naja slouzi pro odesilani dat pres ajax, kdyz to nechces pres ajax tak to nema moc smysl Naja instalovat.

Co se tyce nette forms validace bez ajaxu, nevim presne proc to nefunguje. Zkus dat pryc ten novalidate atribut z toho formulare.

chemikus
Člen | 54
+
0
-

Když dám ten novalidate pryč, tak aktivuji validaci podle prohlížeče a ne ten z Nette. No, jdu si hrát ještě s Copilotem, třeba na to někdy přijdu … zatím mi to kontroluje strana na serveru, takže integrita dat zajištěna :)

m.brecher
Generous Backer | 905
+
0
-

@chemikus

Haha… good! Když je tam AJAX tak to funguje … ale co když ho nechci posílat přes Ajax?

Pokud nechceš formulář posílat přes ajax, nedávej do class formuláře třídu „ajax“

Když dám ten novalidate pryč, tak aktivuji validaci podle prohlížeče a ne ten z Nette.

novalidate nastavovuje NetteForms.js dynamicky javascriptem aby zablokoval html 5 validaci formuláře, do html kódu formuláře by se natvrdo atribut novalidate dávat neměl.

Zkus ten javascript vložit do stránky nějakým normálním způsobem, třeba:

<script src="https://unpkg.com/nette-forms@3"></script>

<script src="https://unpkg.com/naja@2/dist/Naja.min.js"></script>

<script>
    document.addEventListener('DOMContentLoaded', () => naja.initialize())
</script>

knihovna Naja umí spolupracovat s NetteForms.js validací automaticky, myslím, že kvůli tomu není potřeba psát nějaký speciální kód. Knihovnu JQuery vyhoď, je to stará neperspektivní technologie.

Editoval m.brecher (19. 2. 22:21)