contributte / live-form-validation

:no_entry: Nice client-side live form validation for Nette Forms.
https://contributte.org/packages/contributte/live-form-validation.html
BSD 3-Clause "New" or "Revised" License
59 stars 24 forks source link

Server side error message neni osetren #1

Closed zakrava closed 9 years ago

zakrava commented 9 years ago

Kdyz mam server side validaci, zobrazi se error, tak live-form-validation s tim neumi pracovat a kdyz zmenim input, aby to vyvolalo jeste live validaci, tak tam mam dva error message a ten server side to nechce smazat.

Nejdriv jsem to chtel cele prepsat z id na class, ale nakonec jsem skoncil u jednoduche podminky pridane do getMessageElement pred if (!error) nasledujici: if(!error) { error = el.parentNode.getElementsByClassName(this.options.errorMessageClass)[0]; }

Forkovat kvuli pull requestu mi prijde divne.

Robyer commented 9 years ago

Myslím, že by ta podmínka měla brát v úvahu i to nastavení showErrorApartClass.

Zkusil bys, jestli tohle funguje správně? Celá změněná metoda getMessageElement:

LiveForm.getMessageElement = function(el) {
    var id = el.id + this.options.messageIdPostfix;
    var error = document.getElementById(id);

    var errorParent = (!this.hasClass(el, this.options.showErrorApartClass))
            ? el.parentNode
            : document.getElementById(this.options.showErrorApartElementPrefix+el.id);

    if (!error) {
        // Try to find existing error message if it has no id (e.g. from server-validation)
        error = errorParent.getElementsByClassName(this.options.errorMessageClass)[0];
    }

    if (!error) {
        // Error element doesn't exists, lets create a new one
        error = document.createElement(this.options.messageTag);
        error.id = id;
        errorParent.appendChild(error);
    }

    if (el.style.display == 'none') {
        error.style.display = 'none';
    }

    error.className = this.options.errorMessageClass;
    error.innerHTML = '';

    return error;
};
Robyer commented 9 years ago

Tak ještě to chtělo upravit metodu removeError. Pushnul jsem změny, mělo by to teď fungovat. Díky.

zakrava commented 9 years ago

Jo funguje to paradne. Btw. element s id nebo byClass [0] ma jednu takovou malou nevyhodu, ze to vic erroru nesezere, vzdycky to bude brat jen ten prvni, jestli to dobre chapu. Chtel jsem to zkusit upravit, ale zamotal jsem se do toho.

Mozna by si to zaslouzilo dalsi issue, ale kdyz jsem chtel zvalidovat form v tu chvili co jsem ho zobrazil, tak mi to porad hazelo chybu na tom LiveForm.forms[form.id].hasError = false; ve validateForm, mozna bych nemel prachsproste volat Nette.validateForm(...), ale rikal jsem si jestli by to vyresilo pridani jako zavislosti/modulu jako ma netteForms tu zbesilost na zacatku (function(global, factory) { Sla by udelat nejaka inicializace zavislosti?

Robyer commented 9 years ago

Ono to nepodporuje zobrazování více errorů už od začátku, takže by se toho muselo přepsat asi dost. A to podle mě nemá cenu. Ale asi by bylo fajn aspoň vyřešit když serverová validace vyhodí více errorů, tak aby je to umělo všechny zrušit.

Tomu druhému požadavku úplně nerozumím. Jakou věc tím voláním Nette.validateForm(...) přesně řešíš? Každopádně zkus nejdřív zavolat Nette.initForm(...) a až pak to validate.

zakrava commented 9 years ago

To jsem chtel udelat puvodne, nacpal jsem do removeError nakonec var errors = groupEl.getElementsByClassName(this.options.errorMessageClass); for(i = errors.length - 1; i >= 0; --i) { errors[i].parentNode.removeChild(errors[i]); } samostatne to funguje, ale v te funkci LiveForm.removeError mi to nejak nechtelo chodit.

Chci prave uz pri zobrazeni formulare spustit tuhle live validaci, i kdyz to (Nette.validateForm) spustim az po $.nette.init(); tak mi to hlasi error protoze LiveForm.forms v sobe jeste nema idcka formularu, ale kdyz to pak spustim dodatecne z firebugu tak to jede. Prave jsem nechtel volat Nette.initForm, abych ho nezinicializoval dvakrat...jednou rucne a jednou pak v tom Nette.initOnLoad

Robyer commented 9 years ago

Co se týká inicializace formulářů, tak by se hodila přidat proměnná a podmínka, že daný formulář už byl inicializován, a v tom případě to již nevolat znovu. Přijde mi to jako nejčistější řešení (pokud mi něco neuniká).