Jak modifikovat chování netteForms.js?
- dcepelik
- Člen | 36
Dobré ráno,
ačkoliv je netteForms.js
kus skvělého kódu, nenašel jsem
způsob, jak snadno upravit chování související s validací formulářů.
Výchozí chování (hláška o chybě vyvolaná funkcí alert
) je
ze zřejmých důvodů vhodná jako výchozí, ale nevhodná pro reálnou
aplikaci. Tam je (témeř) vždy lepší umístit chyby přímo na formulář
k jednotlivým polím.
Pokud chci docílit takového chování, buď musím zasáhnout do
stávajícího kódu, nebo jeho části zkopírovat, upravit a přepsat jimi
původní funkční členy objektu Nette
. (Například
client-script Nella Frameworku kopíruje a upravuje celé
netteForms
, pokud tomu dobře rozumím.)
Nebylo by možné netteForms.js
upravit s využitím Template Method
Pattern tak, aby tohle bylo snadné? Tzn. mít předpřipravené funkce,
které překryji vlastními?
Bohužel jsem se k OOP v JavaScriptu dostal příliš pozdě a teď už jen doháním, tak doufám, že dotaz není zcela mimo mísu. Pokud ne, rád s věcí nějak pomohu.
Pěkný večer
Editoval dcepelik (11. 8. 2011 2:18)
- dcepelik
- Člen | 36
joe napsal(a):
Proč vymýšlet „hlouposti“, když si to můžeš jednoduše přepsat?
Já asi ještě používám nějaký starší JavaScript a upravil jsem si podle sebe metodu Nette.updateSnippet a Nette.addError
Není to tak docela hloupost. V okamžiku, kdy budu chtít aktualizovat client-side scripty z nové verze Nette, budu muset upravovat funkční kód. U pár řádků JavaScriptu na tom nesejde, ale když se toho nakupí víc, je z toho zbytečná práce navíc – a tak tomu raději předcházím.
Navíc by to ušetřilo práci ostatním. Nebylo by potřeba laborovat nad
vnitřními mechanismy netteForms.js
, stačilo by překrýt pár
metod s jasně definovaným účelem.
Ale samozřejmě, přepsat to lze. To lze vždycky :).
- Patrik Votoček
- Člen | 2221
Nejak tak jak popisuješ by to mělo fungovat…
načti si netteForms.js a pak si v kodu udělej:
Nette.addError = function(elem, message) {
if (elem.focus) {
elem.focus();
}
if (message) {
alert("Tohle je moje! Message:" + message);
}
};
- joe
- Člen | 313
Tak jak napsal Patrik Votoček, funkce v JS si můžeš takhle jednoduše přepisovat, vlastně tak nějak jsem to myslel v tom, co jsem psal.
Pokud použiješ nové klienstké skripty, kde to bude změněné, změně se také asi nevyhneš. Jenom nevidím důvod přepisovat si to vedle (mimo soubor od Nette), když to co tam je bys stejně pak nevyužíval.
stačilo by překrýt pár metod s jasně definovaným účelem
funkce Nette.addError
, jasně je patrné, že přidává chybu a
to samé s Nette.updateSnippet
, která aktualizuje obsah
elementů :)
Editoval joe (11. 8. 2011 3:26)
- dcepelik
- Člen | 36
Díky za odpovědi.
@Patrik Votoček: Ano, tak jsem to udělal, to samozřejmě není problém – přesto díky, inspiraci jsem hledal právě v Nella Frameworku.
Asi jsem se nevyjádřil jasně, upřesním to: přidat vlastní chybovou
hlášku není problém a účel Nette.addError
je jasný
(@joe). O co mi jde je, že se nepočítá s odebíráním
chyby, když už je opravena – zobrazuje se funkcí alert()
,
tedy není potřeba ji odebírat. (Ten algoritmus validace počítá jen
s tímhle způsobem vizualizace chyb.)
Když jsem překrýval Nette.addError
, automaticky jsem hledal
také Nette.removeError
. Kdyby existovala prázdná výchozí
metoda Nette.removeError
, byl by život jednodušší.
S procesem validace formuláře jsou navíc spojené některé další
užitečné drobnosti – věci, které sice nejsou nezbytné, ale z hlediska
uživatele přívětivé. Pokud např. některé pole má nastavenu určitou
chybovou hlášku a já chci nastavit tutéž, nebudu ji odebírat a zase
přidávat, prostě ji tam nechám. Pokud by se tohle dalo zakomponovat do
příslušných funkcí (tj. Nette.validateControl
a
Nette.validateForm
), také by to nebylo k zahození.
Mám tohle řešení udělané „na míru“ jednomu konkrétnímu projektu a když jsem to dnes v noci řešil, přišlo mi, že by se to dalo udělat snáze.
Nette.addEvent(window, 'load', function() {
errors = [];
});
Nette.addError = function(elem, message) {
errors[elem.id] = message;
// přidání chybové hlášky na formulář
}
Nette.removeError = function(elem) {
delete errors[elem.id];
// odebrání chybové hlášky z formuláře
}
V těle Nette.validateControl
pak lze mj.:
if (!onlyCheck) {
var message = rule.msg.replace('%value', Nette.getValue(el));
var currentError = errors[el.id];
if (currentError) {
if (currentError != message) { // has different error
Nette.removeError(el);
} else {
return false;
}
}
Nette.addError(el, message);
}
return false;
Jen je škoda, že kvůli těm pár kouskům kódu je potřeba duplikovat pětkrát více kódu. Možná to ale opravdu jen přeháním, jsem zkrátka zvyklý za žádnou cenu neměnit kód třetích stran.
Editoval dcepelik (11. 8. 2011 18:08)
- Patrik Votoček
- Člen | 2221
tohle je věc na kterou jsem taky narazil a proto jsem si musel zkopírovat celý netteForms.js a v konečném důsledku jsem se vrátil k původnímu originálnímu netteForms.js s alertem a čekám až bude přepsaný do jQuery :-)
- joe
- Člen | 313
@22 – pleteš dvě odlišné věci. Nevidím důvod, proč by Nette mělo být závislé na nějaké další knihovně/funkci. Pokud vím, tomu se snaží právě vyhnout, to že se to používá v doplňcích, to je věc jiná (tam ať si to každý používá jak chce). Pro tak jednoduchou věc – jako je napsání validace nevidím důvod použití jQuery a zbytečné tahání několika kilobajtového kódu – ty ano?
- 22
- Člen | 1478
@joe: pokud vim, jQuery se cachuje, tedy se natáhne akorát jednou, takže těch pár kilobajtů za to ušetřené psaní (např. getElementBy atd.) stojí. Navíc 75% z nás ovládá jQuery mnohem líp, než surový javascript. To je zpátečnické uvažovaní imho. Kromě prvního natažení už to má jen samé výhody.
Editoval 22 (12. 8. 2011 15:46)
- 22
- Člen | 1478
neřekl jsem, že se necachuje, akorát že argument o natahovaní frameworku má slabý základ a podle tvýho uvažování já tedy nevidím ani důvod, proč by mělo Nette potom mělo být závislé na javascriptu, když ten jako takový vůbec nemusí být u klienta dostupný :-)
Editoval 22 (12. 8. 2011 15:57)