2012-04-16 11 views
13

Estamos en el proceso de escribir un formulario nuevo en el que nuestro programador front-end ha incluido una gran cantidad de validación de JavaScript (técnicamente, validación de jQuery Tools).¿Recomendaciones para compartir reglas de validación entre Javascript y PHP?

Estoy escribiendo la parte del proceso del lado del servidor PHP, y por supuesto, mi propio código hará su propia validación de los datos recibidos.

En lugar de tener que mantener dos conjuntos de reglas de validación, jQuery y PHP, ¿tiene alguna recomendación sobre cómo crear una lista central de reglas de validación? El campo X debe ser size> 1 y < 10 , etc., para poder cambiar una regla de validación en un único archivo o tabla de base de datos que luego se pasaría a PHP y a jQuery?

Por ejemplo, cambie la misma regla que mencioné anteriormente "campo X debe ser tamaño> 1 y < 10" a "campo X debe ser tamaño> 3 y < 5" y todo lo que tendría que hacer es editar un archivo o la tabla de base de datos y tanto PHP como jQuery recuperarían y analizarían esos datos en consecuencia?

Gracias de antemano por su ayuda,

Phil

+0

¿Qué tipo de sitio creaste? ¿Por qué crees que necesitarías una validación tan avanzada? No puedes compartir las reglas usando un archivo o base de datos ya que el jquery no puede leer datos de la base de datos. Puedes usar ajax pero realmente lo hago no veo el punto de por qué querrías hacerlo Otra cosa que puedo recomendar es usar xml para almacenar las reglas de validación –

+0

Esta es otra área donde realmente brilla NodeJS. – AlienWebguy

+0

Resumir reglas de validación simples (correos electrónicos, longitud máxima, requeridas etc.) con una base de datos que contiene las reglas es bastante sencillo, pero validación avanzada, como cambiar la lógica de validación basada en el contenido de otro campo, el usuario actual o basado en otros objetos en el sistema, es bastante complicado. A menos que tenga una gran cantidad de lógica de validación, simplemente codificaría manualmente la lógica tanto en PHP como en jQuery. –

Respuesta

4

Algo a lo largo de estas líneas probablemente sería bueno:

<?php 
$validation = Array(
    "field1" => Array(// "field1" is the name of the input field 
     "required" => true, // or false 
     "minlength" => 5, // use 0 for no minimum 
     "maxlength" => 10, // use 9999 (or other high number) for no maximum 
     "regex" => "^[a-zA-Z0-9]+$" // use empty string for no regex 
    ), 
    "field2" => ....... 
    .... 
); 
if($_POST) { 
    foreach($validation as $k=>$v) { 
     if(!isset($_POST[$k])) { 
      if($v['required']) die("Field ".$k." is required"); 
     } 
     else { 
      $l = strlen($_POST[$k]); 
      if($l < $v['minlength']) die("Field ".$k." too short"); 
      if($l > $v['maxlength']) die("Field ".$k." too long"); 
      if(!preg_match("(".$v['regex'].")",$_POST[$k])) die("Field ".$k." incorrect format"); 
     } 
    } 
    // all ok! 
} 
?> 
<script type="text/javascript"> 
    (function(rules) { 
     var die = function(str) {alert(str); return false;}; 
     document.getElementById('myForm').onsubmit = function() { 
      var elms = this.elements, i, it, r, s; 
      for(i in rules) { 
       r = rules[i]; 
       it = elms.namedItem(i); 
       if(typeof it == "undefined") { 
        if(r.required) return die("Field "+i+" is required"); 
       } 
       else { 
        s = it.length; 
        if(s < r.minlength) return die("Field "+i+" too short"); 
        if(s > r.maxlength) return die("Field "+i+" too short"); 
        if(!s.match(new RegExp(r.regex))) return die("Field "+i+" incorrect format"); 
       } 
      } 
      return true; 
     }; 
    })(<?=json_encode($validation)?>); 
</script> 

Como se puede ver, la idea general es definir un conjunto de reglas, entonces la magia ocurre en el json_encode($validation) - esto pasa las reglas al entorno de JavaScript. Todavía tiene que duplicar el código de validación para que se ejecute en PHP y en JS, pero al menos ahora puede agregar más reglas sin tener que cambiar el código en dos lugares. ¡Espero que esto ayude!

+0

Gracias, me gusta esto, voy a probar esto :) – PhilGA

3

El Nette framework hace esto: http://doc.nette.org/en/forms

Toda la forma y las reglas de validación se definen en un archivo PHP. El marco genera código HTML con validación de JavaScript y luego de enviarlo realiza la validación del lado del servidor.

Incluso puede usar la parte Formas del marco por separado.

+0

Hola @ondrata, Nette es similar a Zend, que es lo que estamos usando en el back-end. Pero estamos evitando usar un formulario Zend porque es un problema para el diseño, y tenemos un diseño muy complicado. – PhilGA

+0

@PhilAG: Nette es un poco más liviano que Zend, por lo que probablemente sea una herramienta de ajuste (lo escribo probablemente, revise con prudencia, enrollar el suyo podría ser una opción, pero una herramienta de ajuste es mejor que andar la suya). – hakre

+1

@PhilAG Esto podría ayudarlo con el diseño: http://doc.nette.org/en/forms#toc-manual-rendering Básicamente, escribe el código HTML alrededor de los controles y Nette genera solo el 's (y

) . –

Cuestiones relacionadas