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

В предыдущей статье я рассказал как интегрировать Jaxer с Denwer, теперь расскажу о преимуществах Jaxer при валидации данных. В связке php+javascript (как в общем то и других) приходится проверять данные дважды — на сервере и на клиенте, причем делать это разными способами, так как языка два. С помощью Jaxer можно написать одну функцию валидации и вызывать ее как с клиентской стороны, так и с серверной. Впрочем ближе к коду:

Форма:

  1. <form id='form1' method='POST' onsubmit='sendToServer(this); return false;'>
  2. <span>
  3. <label>Имя (русские символы)*:</label>
  4. <input type='text' name='name'>
  5. </span>
  6. <span>
  7. <label>Возраст (число):</label>
  8. <input type='text' name='age'><br/>
  9. </span>
  10. <input type='submit' value='OK'/>
  11. </form>

Код для выполнения на сервере и на клиенте, о чем говорит аттрибут runat='both':

  1. <script type='text/javascript' runat='both'>
  2. function valid(d)
  3. {
  4. var Validate = {
  5. validate:function(v)
  6. {
  7. if(!this.rules) return true;
  8. var res = [];
  9. for(var i in this.rules)
  10. {
  11. var rule = this.rules[i];
  12. switch(true)
  13. {
  14. case (rule instanceof RegExp)||(rule instanceof /./.constructor):
  15. if(this.regexp(rule)) continue;
  16. break;
  17. case (typeof rule == 'function'):
  18. if(rule.call(this, v, i)) continue;
  19. break;
  20. default:
  21. if(this[i])
  22. {if(this[i](rule, v)) continue;}
  23. else
  24. continue;
  25. }
  26. res.push(i);
  27. }
  28. if(res.length>0)
  29. this.msg = res;
  30. else
  31. return true;
  32. return false;
  33. },
  34. required:function(r, v)
  35. {
  36. return r && v.length > 0;
  37. },
  38. number:function(r, v)
  39. {
  40. return r && (/^\d*$/).test(v);
  41. },
  42. min_length:function(r, v)
  43. {
  44. return r <= v.length;
  45. },
  46. max_length:function(r, v)
  47. {
  48. return r >= v.length;
  49. },
  50. rus:function(r, v)
  51. {
  52. return r && !(/[a-zA-Z]/).test(v);
  53. }
  54. };
  55. var rules = {
  56. name:{rules:{required:true, rus:true}, msgs:{required:'Поле «Имя» обязательно для заполнения', rus:'Имя не может содержать латинских символов'}},
  57. age:{rules:{number:true}, msgs:{number:'Возраст — это число'}}
  58. };
  59. msgs=[];
  60. for(var name in rules)
  61. {
  62. Validate.rules = rules[name].rules;
  63. if(! Validate.validate(d[name]))
  64. {
  65. for(var i=0, len=Validate.msg.length; i<len; i++)
  66. {
  67. msgs.push(rules[name].msgs[Validate.msg[i]]);
  68. }
  69. }
  70. }
  71. return msgs.length==0?false: msgs;
  72. }
  73. </script>

Серверный код, этот код будет не виден для браузера, но его можно будет вызвать с клиентской части:

  1. <script type='text/javascript' runat='server'>
  2. function save(d)
  3. {
  4. var msgs = valid(d);
  5. return msgs;
  6. }
  7. save.proxy = true;
  8. </script>

И, наконец, клиентская часть:

  1. <script type='text/javascript'>
  2. function sendToServer(form)
  3. {
  4. var d={name: form['name'].value, age: form['age'].value};
  5. var msgs = valid(d);
  6. if(msgs)
  7. alert(msgs.join(', '));
  8. else
  9. {
  10. if(msgs = save(d))
  11. alert(msgs.join(', '));
  12. else
  13. alert('ok');
  14. }
  15. }
  16. </script>

Таким образом, проверили данные сначала в браузере, потом отправили данные ajax`ом и проверили на сервере той же функцией.

Rate It! (Average 5.00, 1 votes)

Related Posts

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

Leave a Reply

Mail will not be published