修剪空间后,在jQuery数据标记中使用内联编辑进行验证



使用jQuery DataTable编辑器插件,以下代码按预期工作。它执行指定的验证(一些字段已于简洁而省略)。

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

在这种情况下,按照应有的方式执行验证,但未提交值(并同时更新数据库)到数据库中。按下Enter键后,直列编辑的文本框保持打开。

是什么原因是什么?可能,我缺少有关PHP的基本内容。

我将在需要时发布相应的客户脚本。


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

什么是补救措施?

如果您的代码唯一更改是您注释中突出显示的那些行,我会怀疑问题是您使用嵌套的三元运算符。PHP标签中的这两个单独的问题可能会清除一些问题,但基本上,快速版本是PHP三元运营商具有一些奇怪的行为,因此不建议将其嵌套。我建议您尝试切换到标准/else语句以查看是否解决您的问题,所以

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

虽然这可能更长,但调试可能会容易得多,我怀疑您的问题是,如果这就是所改变的所有问题,那么您的问题归功于左侧缔合的三元操作员的嵌套;而在几乎所有其他语言中,三元运营商都是正确的。

这是另一个链接,建议针对php中的嵌套三元运算符。

击打提交后,文本框保持打开状态是DataTableS JavaScript表单错误的标准,当Crud操作Serveride不会将期望值返回到客户端时,这很常见(检查您的浏览器开发人员控制台,以确保您没有得到JS错误,如果您想要一个非常健壮的firefox,我建议您获得firebug。如果修改代码使用if/else块而不是三元运算符后,您仍然有错误,那么我会查看您的客户端代码以确保没有其他更改(Mabye您可以在问题中将其发布'解决您的问题)。

最新更新