Nittro – přidání erroru asynchroně
- 2bad2furious
- Člen | 26
Ahoj, mám docela jednoduchý formulář, ale jeden rule u něj potřebuji kontrolovat asynchronně.
<script>
window.Nette.validators.url_rule1 = function (elem, args, val) {
$("#url-content").html(val);
$.get(
{plink Availability: \adminModule\AvailabilityPresenter::KEY=>\adminModule\AvailabilityPresenter::URL_KEY},
{l}{\adminModule\AvailabilityPresenter::VALUE}:val{r},
function (r) {
//addError if....
}
)
return false;
};
</script>
Neví někdo, jak na to?
Předem děkuji
- jahudka
- Člen | 71
Ahoj, pardon, tady to moc nesleduju..
No jednak – jsi si jistej, že window.Nette
už je v době
spuštění tohohle skriptu dostupný? Je to spíš na okraj, ale pokud Nittro
načítáš asynchronně, tak má tohle velkou šanci se rozbít a záleží to
jen na rychlosti sítě, což není dobrej nápad. Lepší bys měl použít
třeba _stack .
Druhej problém je, že validace zatím neumí bejt asynchronní – to je proto, že se validuje v handleru nativního submit eventu a pokud validace projde, ale někde pozdějc nittro zjistí, že formulář nedokáže odeslat AJAXem (např. protože formulář obsahuje upload a implementace prohlížeče uploady AJAXem neumí), může pořád ještě nechat projít původní submit neAJAXově. Pokud by validace probíhala asynchronně, tak tohle nepůjde. Nicméně asynchronní validace může mít občas smysl i tak – konkrétně jako live validace na nějakým políčku ve formuláři – jen bych si tam nějak ohlídal, že se nebude zbytečně pouštět i při submitu celýho formuláře, protože tam už je pozdě.
No a abych teda konečně odpověděl na tvou otázku: error k formuláři přidáš takhle:
<script>
_context.invoke(function(di) { // případně _stack.push místo _context.invoke, pokud se pro něj rozhodneš
window.Nette.validators.url_rule1 = function(elem, args, val) {
// ...
var frm = di.getService('formLocator').getForm(elem.form);
frm.trigger('error', { element: elem, message: 'chybka!!' });
};
});
</script>
Editoval jahudka (15. 11. 2017 14:01)
- 2bad2furious
- Člen | 26
Děkuji za odpověď. Pro ostatní přidám konkrétní kód i se _stackem:
<script>
_stack.push(function (di) {
jQuery(document).ready(function ($) {
/* */
var frm = di.getService('formLocator').getForm('frm-pageEditForm');
console.info(frm);
window.Nette.validators.url_rule1 = function (elem, args, val) {
/* */
$.ajax({
url: "url",
data: data,
success: function (r) {
if (r === false) {
frm.trigger('error', {
element: elem,
message: args
});
/* */
} else {
/* */
}
}
,
failure:function () {
/* */
}
})
return true; //nechám validaci projít
};
})
})
</script>
- Používám upravený Nette\Form\Helpers pro tenhle validátor, něco jako https://github.com/…s/issues/163
- Posílám error message v Argumentu, protože bych ho jinak musel posílat v tom json response, tohle je jednodušší