0

尝试对非常有用的“handsontable”jscript 库中的输入进行一些服务器端错误检查。

以下调用效果很好:

jQuery.ajax({
    url: "index.php?option=com_catalogscontroller=batchsave",
    data: {"formData": querydata.getData().splice( 0, 1 ) },
    dataType: 'JSON',
type: 'POST',
    success: function ( response ) {
    if( response.success ) {
    } else {
    querydata.loadData( response.data );
    }
}
});

我认为进行错误检查的最有效方法是在服务器(PHP)端,创建一个多维数组来跟踪服务器发现的任何错误,然后在同一个 ajax 调用中返回该数组和表单数据。所以我修改了服务器代码,将表单数据和错误数组都返回给 javascript ajax 调用。IE:

if( !empty( $errors ) ) // $errors is an multi dimensional array same size as the form data
    $result['success'] = false;
    $result['msg'] = 'There were errors detected';
    $result['data']['form'] = $formData;
    $result['data']['errors'] = $errors;
}
echo json_encode( $result );

然后在客户端,上面的 javascript 例程已修改为:

jQuery.ajax({
    url: "index.php?option=com_catalogscontroller=batchsave",
    data: {"formData": querydata.getData().splice( 0, 1 ) },
    dataType: 'JSON',
    type: 'POST',
    success: function ( response ) {
    if( response.success ) {
    } else {
            formErrors = response.data.errors; // formErrors is a global
    querydata.loadData( response.data.form );
    }
}
});

表单的原始功能被保留(表单数据被检索并正确插入到 html 中),但 formErrors 返回的结果让我感到莫名其妙。赋值 'alert( formErrors )' 后立即出现的警报显示类似于列表的内容:

true,true,false,true,true

而且我还可以毫无问题地提醒特定索引,例如 alert( formErrors[0][2] ); 将显示“假”。但在 ajax 调用之外,该数组似乎无法访问,出现“未定义”错误。在 ajax 调用和 ajax 调用之外的例程中,警报(typeof formErrors)显示“对象”,警报(formErrors)给出与上面相同的逗号列表,但我不想要一个对象,我期待一个数组或者我会对一个对象感到满意,只要我可以通过索引访问它。我在这里想念什么?

4

1 回答 1

1

我遇到的问题似乎集中在 JSONing 上。

大多数文档在支持 Javascript AJAX 调用的 php 例程中确定对 JSON 变量的要求。jQuery.ajax 调用的使用减轻了一些要求,但如果你不知道自己在做什么(像我一样),很容易陷入困境。

我的 php 例程 JSON 使用以下语句对完整的响应记录进行编码:

return json_encode( $result );

因为我的:

dataType: JSON

jQuery.ajax() 调用中的参数,这会导致 PHP 例程返回给 jQuery javascript 函数的结果的自动 json.parse()。然而,这并不成功,因为服务器代码中的 php json_encode 调用不是递归的,所以当结果数组被解码时,该结果中的任何数组都没有。

然后解决方案是对多维数组的组件进行 json 编码,然后在客户端对其进行解码。例如

if( !empty( $errors ) ) 
    $result['success'] = false;
    $result['msg'] = 'There were errors detected';
    $result['data']['form'] = json_encode( $formData );
    $result['data']['errors'] = json_encode( $errors );
}
echo json_encode( $result );

然后在客户端,专门解析(解码)这些数组:

jQuery.ajax({
    url: "index.php?option=com_catalogscontroller=batchsave",
    data: {"formData": querydata.getData().splice( 0, 1 ) },
    dataType: 'JSON',
    type: 'POST',
    success: function ( response ) {
        if( response.success ) {
        } else {
            formErrors = JSON.parse( response.data.errors ); // formErrors is a global
            querydata.loadData( JSON.parse( response.data.form ) );
        }
    }
});

我坦率地承认,我真的不知道自己在做什么,但是上面结构的代码似乎对我为解释它而开发的逻辑很有意义,并且它对我有用。无论如何,再次感谢 Nathan 和 pdoherty926。

于 2013-09-12T04:09:08.837 回答