Jak modifikovat chování netteForms.js?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
dcepelik
Člen | 36
+
0
-

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)

joe
Člen | 313
+
0
-

Proč vymýšlet „hlouposti“, když si to můžeš jednoduše přepsat?

Já asi ještě používám nějaký starší kód a upravil jsem si podle sebe metodu Nette.updateSnippet a Nette.addError

Editoval joe (11. 8. 2011 3:21)

dcepelik
Člen | 36
+
0
-

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

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

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

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

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

a čekám až bude přepsaný do jQuery :-)

A proč by něco takového mělo být zbytečně přepisováno do jQuery? Tady (netteForms.js) vidíš, jak to jde udělat bez frameworku, tak proč bys ho do toho zbytečně tahal?

22
Člen | 1478
+
0
-

@joe: a proč je Nette framework, když všechno jde napsat v čistým php, to jsou argumenty…

edit: a proč je vlastně PHP, když tu máme strojový kód? :-)

Editoval 22 (12. 8. 2011 15:28)

joe
Člen | 313
+
0
-

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

@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)

joe
Člen | 313
+
0
-

A pokud si dám čistý JS do souboru, tak se necachuje? :) Nechci tu rozebírat věc mimo téma, kdo chce, ať si jQuery používá, někdo preferuje jiný JS framework, není jen jQuery.

22
Člen | 1478
+
0
-

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)

norbe
Backer | 405
+
0
-

Nejlepší bude asi odkázat na diskuzi o nahrazení NetteQ za jQuery

Patrik Votoček
Člen | 2221
+
0
-

přesně na tohle vlákno jsem narážel… :-)