php - registros - Validación con edición en línea en tablas de datos jQuery después de recortar espacios
tabla dinamica php mysql jquery (1)
Con el complemento de editor de tablas de datos jQuery, el siguiente código funciona según lo previsto. Realiza validaciones especificadas (algunos de los campos se han omitido por brevedad).
Editor::inst( $db, ''file_upload'' )
->fields(
Field::inst( ''id'' )->validator( ''Validate::notEmpty'' ),
Field::inst( ''name'' )->validator( ''Validate::notEmpty'' )
->validator( function ($val, $data, $opts) {
$length = strlen(trim(preg_replace(''//s+/'', '' '', $val)));
return $length > 30 ? ''Length must be 30 characters or less'' : true;
})->getFormatter( function ( $val, $data, $opts ) {
return htmlspecialchars($val, ENT_QUOTES, "UTF-8");
})->setFormatter( function ( $val, $data, $opts ) {
return trim(preg_replace(''//s+/'', '' '', $val));
}),
Field::inst( ''document_title'' )->validator( ''Validate::notEmpty'' )
->validator( function ($val, $data, $opts) {
$length = strlen(trim(preg_replace(''//s+/'', '' '', $val)));
return $length > 50 ? ''Length must be 50 characters or less'' : true;
})->getFormatter( function ( $val, $data, $opts ) {
return htmlspecialchars($val, ENT_QUOTES, "UTF-8");
})->setFormatter( function ( $val, $data, $opts ) {
return trim(preg_replace(''//s+/'', '' '', $val));
}),
Field::inst( ''email_address'' )->validator( ''Validate::notEmpty'' )
->validator( function ($val, $data, $opts) {
$length = strlen(trim(preg_replace(''//s+/'', '' '', $val)));
return $length > 60 ? ''Length must be 60 characters or less'' : true;
})->getFormatter( function ( $val, $data, $opts ) {
return htmlspecialchars($val, ENT_QUOTES, "UTF-8");
})->setFormatter( function ( $val, $data, $opts ) {
return trim(preg_replace(''//s+/'', '' '', $val));
})
)->where( function ( $q ) {
$q->where( ''file_type'', "(''jpg'', ''jpeg'', ''gif'', ''png'')", ''IN'', false );
})->process( $_POST )
->json();
Pero cuando la lógica de validación se modifica ligeramente como la siguiente,
Editor::inst( $db, ''file_upload'' )
->fields(
Field::inst( ''id'' )->validator( ''Validate::notEmpty'' ),
Field::inst( ''name'' )->validator( ''Validate::notEmpty'' )
->validator( function ($val, $data, $opts) {
$length = strlen(trim(preg_replace(''//s+/'', '' '', $val)));
// The following line has been modified
return $length === 0 ? ''This field is required'' : ($length > 30 ? ''Length must be 30 characters or less'' : true);
})->getFormatter( function ( $val, $data, $opts ) {
return htmlspecialchars($val, ENT_QUOTES, "UTF-8");
})->setFormatter( function ( $val, $data, $opts ) {
return trim(preg_replace(''//s+/'', '' '', $val));
}),
Field::inst( ''document_title'' )->validator( ''Validate::notEmpty'' )
->validator( function ($val, $data, $opts) {
$length = strlen(trim(preg_replace(''//s+/'', '' '', $val)));
// The following line has been modified
return $length === 0 ? ''This field is required'' : ($length > 50 ? ''Length must be 50 characters or less'' : true);
})->getFormatter( function ( $val, $data, $opts ) {
return htmlspecialchars($val, ENT_QUOTES, "UTF-8");
})->setFormatter( function ( $val, $data, $opts ) {
return trim(preg_replace(''//s+/'', '' '', $val));
}),
Field::inst( ''email_address'' )->validator( ''Validate::notEmpty'' )
->validator( function ($val, $data, $opts) {
$length = strlen(trim(preg_replace(''//s+/'', '' '', $val)));
// The following line has been modified
return $length === 0 ? ''This field is required'' : ($length > 60 ? ''Length must be 60 characters or less'' : true);
})->getFormatter( function ( $val, $data, $opts ) {
return htmlspecialchars($val, ENT_QUOTES, "UTF-8");
})->setFormatter( function ( $val, $data, $opts ) {
return trim(preg_replace(''//s+/'', '' '', $val));
})
)->where( function ( $q ) {
$q->where( ''file_type'', "(''jpg'', ''jpeg'', ''gif'', ''png'')", ''IN'', false );
})->process( $_POST )
->json();
En este caso, las validaciones se realizan como deberían pero los valores no se envían (y al mismo tiempo la tabla de datos no se actualiza) a la base de datos. El cuadro de texto de edición en línea permanece abierto después de presionar la tecla Intro.
¿Cuál podría ser el motivo y cómo solucionarlo? Posiblemente, me falta algo muy básico sobre PHP.
Voy a publicar el script del cliente correspondiente, si es necesario.
Parece que se activan otros validadores cuando se aplican condiciones adicionales que impiden que los valores de entrada se envíen a la capa de resumen, a la base de datos. Esto no debería suceder en el caso de la edición de celda en línea.
¿Cuál es el remedio?
Si los únicos cambios en su código son esas líneas que destacó con sus comentarios, sospecho que el problema es su uso del operador ternario anidado. Estas dos preguntas separadas en la etiqueta PHP pueden aclarar algunas cosas, pero básicamente la versión rápida es que el operador ternario de PHP tiene un comportamiento extraño, por lo que no se recomienda usarlos anidados. Te recomiendo que intentes cambiar a una declaración estándar if / else para ver si eso resuelve tu problema, por lo que
if($length === 0){
return ''This field is required'';
}
else if($length > 50){
return ''Length must be 50 characters or less'';
}
else{
return true;
}
Si bien esto puede ser más largo, es probable que sea mucho más fácil de depurar y sospecho basado en su pregunta que si esto fue todo lo que se modificó, su problema se reduce al anidamiento del operador ternario asociado de la izquierda ; mientras que en casi todos los demás lenguajes, los operadores ternarios son asociativos de derecha.
Aquí hay un enlace más que recomienda contra operadores ternarios anidados en PHP.
El cuadro de texto restante después de presionar enviar es estándar para un error de formulario de DataTables JavaScript, que es común cuando el servidor CRUD no devuelve el valor esperado al cliente (examine la consola del desarrollador de su navegador para asegurarse de que no recibe un error JS , Recomiendo obtener Firebug para Firefox si quieres uno realmente robusto). Si después de modificar tu código para usar el bloque if / else en lugar de los operadores ternarios todavía tienes el error, entonces buscaría en tu código del lado del cliente para asegurarte de que no haya cambiado nada más (aunque podrías publicarlo en la pregunta si esto no ocurre) resolver su problema).