php - 修剪空格后在 jQuery 数据表中进行内联编辑验证

标签 php validation datatables datatables-1.10 inline-editing

使用 jQuery 数据表编辑器插件,以下代码可以正常工作。它执行指定的验证(为简洁起见,省略了一些字段)。

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();

但是当验证逻辑像下面这样稍微修改时,

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();

在这种情况下,验证会按应有的方式执行,但不会将值提交(并且同时不会更新数据表)到数据库。按下回车键后,内联编辑文本框保持打开状态。

可能是什么原因以及如何解决?可能我遗漏了一些关于 PHP 的非常基础的东西。

如果需要,我会发布相应的客户端脚本。


当强制执行额外条件以防止将输入值提交到抽象层数据库时,似乎会触发其他验证器。在内联单元格编辑的情况下不应发生这种情况。

有什么补救措施?

最佳答案

如果对您的代码所做的唯一更改是您用注释突出显示的那些行,我会怀疑问题出在您使用了嵌套的三元运算符。这些two分开questions在 PHP 标签中可能会清除一些东西,但基本上快速版本是 PHP 三元运算符有一些奇怪的行为,因此不建议嵌套使用它们。我建议您尝试切换到标准的 if/else 语句,看看是否能解决您的问题,所以

if($length === 0){
    return 'This field is required';
}
else if($length > 50){
    return 'Length must be 50 characters or less';
}
else{
    return true;
}

虽然这可能会更长,但调试起来可能会容易得多,我怀疑根据您的问题,如果这就是全部更改,您的问题归结为 left-associative ternary operator nesting ;而在几乎所有其他语言中,三元运算符都是右结合的。

这是 one more link反对 PHP 中的嵌套三元运算符。

点击提交后文本框保持打开状态是 DataTables JavaScript 表单错误的标准,这在 CRUD 操作服务器端未向客户端返回预期值时很常见(检查您的浏览器开发人员控制台以确保您没有得到一个 JS 错误,如果你想要一个非常健壮的,我建议使用 Firebug for Firefox)。如果在修改您的代码以使用 if/else block 而不是三元运算符后您仍然有错误,那么我会查看您的客户端代码以确保没有其他任何变化(如果没有,您可以将其发布在问题中'解决您的问题)。

关于php - 修剪空格后在 jQuery 数据表中进行内联编辑验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38042121/

相关文章:

javascript - 在 javascript 函数内以 Eloquent ORM 传递参数

javascript - PHP 表单验证与 ajax

javascript - jQuery 显示 div 为空输入字段(验证)

javascript - 如何获取小屏幕的响应式 jquery 数据表中的特定列

javascript - Jquery Datatable 将一列从一个表拖放到另一个表

php - 无法在 ZF2 中使用控制台

php - PCRE2 正则表达式错误转义序列在字符类中无效

php - 为空白的 LEFT JOIN 设置 0 结果?

c# - 即使asp中的文本框为空,如何阻止数据添加到数据库中?

javascript - 选中复选框后无法设置行的类