Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Klasa JS] Walidator
ShaXbee
post 22.01.2007, 15:09:48
Post #1





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 19.10.2004
Skąd: Opole

Ostrzeżenie: (0%)
-----


Klasa wymaga frameworku Prototype.

Na potrzeby projektu próbuję stworzyć tandem walidatorów - jeden po stronie serwera w php, drugi po stronie klienta w JS 'podpinany' o ile to tylko możliwe.

Deklaracja pól do walidacji i sposobu ich sprawdzania ma się znajdować jedynie po stronie serwera, do klienta wysyłana jako doklejony kod JSON.

Klasa będzie oczywiście rozwijana, to co w tej chwili prezentuję można potraktować jako pre-alpha smile.gif

Sposób użycia w kodzie HTML:
  1. <ul id="MyFormErrors">
  2. </ul>
  3.  
  4. <form id="MyForm">
  5. <input name="field1" />
  6. <input name="field2" />
  7. </form>
  8.  
  9. <script language="javascript">
  10. new Validator('MyForm', 'MyFormErrors', {
  11. field1: {
  12. errorMsg: 'Podaj prawidłową wartość liczbową (10-100)',
  13. validator:
  14. name: 'checkInt',
  15. params: {
  16. min: 10,
  17. max: 60
  18. }
  19. }
  20. },
  21. field2: {
  22. errorMsg: 'Podaj prawidlowy kod pocztowy',
  23. validator: {
  24. name: 'preg',
  25. params: {
  26. regexp: /^[0-9]{2}-[0-9]{3}$/
  27. }
  28. }
  29. }
  30. });


Kod klasy Validator:
Kod
Validator = Class.create();

Validator.prototype = {

    initialize: function(form, errors, fields) {

        this.form = $(form);
        this.errors = $(errors);

        this.fields = fields;

        $H(fields).each(function(field) {

            this.attach(field.key);
            field.value.error = null;

        }.bind(this));

    },

    attach: function(name, event) {

        node = this.form.firstChild;
        while(node) {

            if(node.name == name)
                Event.observe(node, 'change', this.validate.bind(this), true);

            node = node.nextSibling;

        }

    },

    validate: function(e) {

        obj = Event.element(e);
        field = this.fields[obj.name];

        if(!this[field.validator.name](obj.value, field.validator.params)) {

            if(field.error == null) {

                obj.addClassName('error');

                li = document.createElement('li');
                li.appendChild(document.createTextNode(field.errorMsg));

                this.errors.appendChild(li);

                field.error = li;

            }

        } else if(field.error != null) {

            obj.removeClassName('error');

            field.error.parentNode.removeChild(field.error);
            field.error = null;

        }

        return true;

    },

    preg: function(field, data) {

        return (field.match(data.regexp) != null);

    },

    checkInt: function(field, data) {

        return (!isNaN(parseInt(field)) && (data.min != undefined || field >= data.min) && (data.max != undefined || field <= data.max));

    },

    checkFloat: function(field, data) {

        return (!isNaN(parseInt(field)) && (data.min != undefined || field >= data.min) && (data.max != undefined || field <= data.max));

    }

}
Go to the top of the page
+Quote Post
cadavre
post 22.01.2007, 22:34:07
Post #2





Grupa: Zarejestrowani
Postów: 472
Pomógł: 7
Dołączył: 7.12.2005
Skąd: Gliwice

Ostrzeżenie: (0%)
-----


Hmmmm... w końcu ktoś sporządził validator wprost JSowy. Ciekawe. A'propo frameworku Prototype - mógłbyś wytłumaczyć bo ja nie obeznany w temacie. smile.gif


--------------------
Silesian PHP User Group - www.spug.pl
Symfony2, OAuth2, budowanie API - masz pytania? Pisz!
Go to the top of the page
+Quote Post
ikioloak
post 22.01.2007, 22:59:34
Post #3





Grupa: Zarejestrowani
Postów: 416
Pomógł: 0
Dołączył: 8.01.2004

Ostrzeżenie: (0%)
-----


Koncepcja mi sie bardzo podoba. Robilem cos takiego 2 miesiace temu mniej wiecej, z prawie ze identycznym interfejsem (z tym ze troche bardziej rozbudowanym - ale zapewne tez rozbudujesz), i bez wykorzystania prototype, przez co kod byl ze 3-4x dluzszy :/ Parametry rowniez podawalem zgodnie z JSON jednak nie wpadlem na to zeby byly generowane w php. Zrealizowalem jedynie walidacje po stronie klienta.
Podsumowujac dobra robota! Jesli rozwiniesz, chetnie skorzystam, jesli nie, to sam rozwine smile.gif
Go to the top of the page
+Quote Post
ShaXbee
post 23.01.2007, 11:04:09
Post #4





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 19.10.2004
Skąd: Opole

Ostrzeżenie: (0%)
-----


Obecnie rzeźbię dalej klasę i po drodze trafiłem na zaledwie trzy problemy od strony Prototype i Scriptaculous:
  • Scriptaculous pozwala na uruchamianie więcej niż jednego efektu na elemencie w tym samym czasie - trzeba się przed tym samodzielnie zabezpieczyć w innym wypadku dzieją się cuda w stylu element z efektem w 3/4, źle spozycjonowanym itp.
  • Funkcja bind() za CHRL nie chce działać pod Operą
  • Nie potrafię podpiąć się do eventu afterFinish dla Effect w Scriptacoluosie, obecnie podmieniam metode finish - pomoglo winksmiley.jpg
Rewelacyjnie ułatwia pracę Prototype - chociażby wspomniana funkcja bind() która wyeliminowała problemy z dostępem do obiektu w procedurze obsługi zdarzeń (onclick, onchange etc.)

Event.observe umożliwia eleganckie i przenośne rejestrowanie procedur obsługi zdarzeń. Przy okazji 'wymusza' rejestrowanie obslugi zdarzen poza tagami html co dodatkowo oczyszcza kod.

Event.stop, Event.element - kolejne dwie bardzo ułatwiające życie funkcje - pierwsza zatrzymuje event, uniemożliwiając np. wysłanie formularza i działa pod każdą przeglądarką; Event.element zwraca element dla którego został wywołany element, już nie ma potrzeby robienia różnych wersji procedury obsługi zdarzeń zależnie od przeglądarki smile.gif

Malutkie demo online: http://shaxbee.superhost.pl/demo/admin.html. Nie przestraszcie się wyglądem smile.gif

PS. Znacie może jakiś sensowny debugger JS do IE5.5 i wyższych?
PS2. Skrypt przestał działać IE ale to tylko sprawa czasu smile.gif

Ten post edytował ShaXbee 23.01.2007, 11:13:18
Go to the top of the page
+Quote Post
nospor
post 23.01.2007, 12:11:00
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
PS2. Skrypt przestał działać IE ale to tylko sprawa czasu
a pod operą testowales?
Cytat
JavaScript - http://shaxbee.superhost.pl/demo/admin.htm...&field2=asd
Inline script thread
Error:
name: TypeError
message: Statement on line 13: Type mismatch (usually a non-object value used where an object is required)
Backtrace:
Line 13 of linked script http://shaxbee.superhost.pl/demo/Common/JS...idator.class.js
this.attach(field);
Line 71 of linked script http://shaxbee.superhost.pl/demo/Common/JS/prototype.js
return __method.apply(object, args.concat($A(arguments)));
Line 299 of linked script http://shaxbee.superhost.pl/demo/Common/JS/prototype.js
iterator(value, index++);
Line 584 of linked script http://shaxbee.superhost.pl/demo/Common/JS/prototype.js
iterator(pair);
Line 303 of linked script http://shaxbee.superhost.pl/demo/Common/JS/prototype.js
this._each((function (value)
{
try
{
iterator(value, index++);
}
catch (e)
{
if (e != $continue)
throw e;
}
}
));
Line 16 of linked script http://shaxbee.superhost.pl/demo/Common/JS...idator.class.js
this.fields.each((function (field)
{
this.attach(field);
field.value.error = null;
}
).bind(this));
Line 23 of linked script http://shaxbee.superhost.pl/demo/Common/JS/prototype.js
this.initialize.apply(this, arguments);
Line 11 of inline#1 script in http://shaxbee.superhost.pl/demo/admin.htm...&field2=asd
validator = new Validator("testForm", {field1 : {errorMsg : "Nieprawidlowy kod pocztowy", validator : {name : "preg", params : {regexp : /^[0-9]{2}-[0-9]{3}$/}}}, field2 : {errorMsg : "Trinity said: You are NOT handy", validator : {name : "preg", params : {regexp : /^keymaker$/}}}});

i klops. Opera 9.02


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
ShaXbee
post 23.01.2007, 12:21:39
Post #6





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 19.10.2004
Skąd: Opole

Ostrzeżenie: (0%)
-----


Tak jak pisałem, bind() zniesmacza Operę (post wyżej)...

Edit1: Po aktualizacji Prototype 1.5.0rc1 na 1.5.0 pod Operą działa, są problemy z animacją menu rozwijanego (eksplorator).
Edit2: Pod IE formularz już działa, są nadal problemy z menu ;]
Edit3: Działa już pod FF, Operą, IE6+, problemy z menu rozwijalnym (eksplorator) pod Operą.

Ten post edytował ShaXbee 23.01.2007, 12:50:49
Go to the top of the page
+Quote Post
nospor
post 23.01.2007, 12:23:08
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




a to przepraszam najmocniej, umknelo mi to w natloku informacji.

To co mi po klasie co pod opera nie dziala? winksmiley.jpg
Poczekam na wersje dzialajace to wowczas poteszcze.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
ShaXbee
post 24.01.2007, 09:48:08
Post #8





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 19.10.2004
Skąd: Opole

Ostrzeżenie: (0%)
-----


Walidator już działa pod Operą 9 / IE6+ / FF1.5+.

Pokazane na stronie pokazywanie błędów odrazu po załadowaniu formularza jest opcjonalne, domyślnie błędy pojawiają się dopiero w momencie uzupełnienia pola smile.gif

Proszę o przetestowanie w przeglądarkach mniej spotykanych np. Opera 8 / Safari etc smile.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 8.07.2025 - 01:31