NetteForms a Naja mi nevaliduje formulář po odeslání
- chemikus
- Člen | 54
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
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>
- chemikus
- Člen | 54
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>
- chemikus
- Člen | 54
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
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
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
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="[{"op":":filled","msg":"Zadejte prosím vaše celé jméno."}]">
</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
- m.brecher
- Generous Backer | 905
@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)