Nittro – přidání erroru asynchroně

2bad2furious
Člen | 26
+
0
-

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
+
0
-

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
+
0
-

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šší