В предыдущей статье я рассказал как интегрировать Jaxer с Denwer, теперь расскажу о преимуществах Jaxer при валидации данных. В связке php+javascript (как в общем то и других) приходится проверять данные дважды — на сервере и на клиенте, причем делать это разными способами, так как языка два. С помощью Jaxer можно написать одну функцию валидации и вызывать ее как с клиентской стороны, так и с серверной. Впрочем ближе к коду:
Форма:
<form id='form1' method='POST' onsubmit='sendToServer(this); return false;'> <span> <label>Имя (русские символы)*:</label> <input type='text' name='name'> </span> <span> <label>Возраст (число):</label> <input type='text' name='age'><br/> </span> <input type='submit' value='OK'/> </form>
Код для выполнения на сервере и на клиенте, о чем говорит аттрибут runat='both':
<script type='text/javascript' runat='both'> function valid(d) { var Validate = { validate:function(v) { if(!this.rules) return true; var res = []; for(var i in this.rules) { var rule = this.rules[i]; switch(true) { case (rule instanceof RegExp)||(rule instanceof /./.constructor): if(this.regexp(rule)) continue; break; case (typeof rule == 'function'): if(rule.call(this, v, i)) continue; break; default: if(this[i]) {if(this[i](rule, v)) continue;} else continue; } res.push(i); } if(res.length>0) this.msg = res; else return true; return false; }, required:function(r, v) { return r && v.length > 0; }, number:function(r, v) { return r && (/^\d*$/).test(v); }, min_length:function(r, v) { return r <= v.length; }, max_length:function(r, v) { return r >= v.length; }, rus:function(r, v) { return r && !(/[a-zA-Z]/).test(v); } }; var rules = { name:{rules:{required:true, rus:true}, msgs:{required:'Поле «Имя» обязательно для заполнения', rus:'Имя не может содержать латинских символов'}}, age:{rules:{number:true}, msgs:{number:'Возраст — это число'}} }; msgs=[]; for(var name in rules) { Validate.rules = rules[name].rules; if(! Validate.validate(d[name])) { for(var i=0, len=Validate.msg.length; i<len; i++) { msgs.push(rules[name].msgs[Validate.msg[i]]); } } } return msgs.length==0?false: msgs; } </script>
Серверный код, этот код будет не виден для браузера, но его можно будет вызвать с клиентской части:
<script type='text/javascript' runat='server'> function save(d) { var msgs = valid(d); return msgs; } save.proxy = true; </script>
И, наконец, клиентская часть:
<script type='text/javascript'> function sendToServer(form) { var d={name: form['name'].value, age: form['age'].value}; var msgs = valid(d); if(msgs) alert(msgs.join(', ')); else { if(msgs = save(d)) alert(msgs.join(', ')); else alert('ok'); } } </script>
Таким образом, проверили данные сначала в браузере, потом отправили данные ajax`ом и проверили на сервере той же функцией.


0 Responses to Валидация данных в Jaxer