试图在非常有用的"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调用。即:
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] ); 将显示"false"。但是在 ajax 调用之外,数组似乎无法访问,从而给出"未定义"的错误。在 ajax 调用和 ajax 调用之外的例程中 alert( typeof formErrors ) 显示"对象",alert( formErrors) 给出与上面相同的逗号列表,但我不想要一个对象,我期待一个数组,或者只要我可以通过索引访问它,我就会对一个对象感到满意。我在这里错过了什么?
我遇到的问题似乎集中在 JSON 上。
大多数文档都确定了在支持 Javascript AJAX 调用的 php 例程中对 JSON 变量的要求。使用jQuery.ajax调用减轻了一些需求,但是如果你不知道自己在做什么(像我一样),很容易遇到麻烦。
我的 php 例程 JSON 使用以下语句对完整的响应记录进行编码:
return json_encode( $result );
因为我:
dataType: JSON
参数,这将导致 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。