"Processing" 冻结 Ninja Forms 服务器端验证
NinjaForms Server Side Validation Frozen on "Processing"
我正在使用 Wordpress 5.1.1 上的 Ninja Forms 提交一个简单的表单。但是,我需要进行简单的服务器端验证。几天来,我一直在通过文档和网络进行筛选,但找不到解决此问题的方法。
到目前为止,我已经能够将我的函数附加到 Ninja Form 的 ninja_forms_submit_data
webhook。我已经确认 PHP 确实被执行了。但是,当我提交表单时,当我尝试 return 自定义错误时它卡在 "Processing" 上。我相信这与 AJAX 响应格式有关,但我不能确定。甚至可能是网站安全阻止了请求,但我对此表示怀疑。在我看来,更有可能的是我对 NinjaForms 如何在后端运行没有根本性的误解。
在这一点上,我什至愿意进行客户端验证(上下文中的安全性并不重要)。但我什至不确定如何实现。
我的背景主要是 C/C++、Java、Python 和 Ruby。 PHP 让我有点反感。感谢您提供的任何帮助。
这是在我的过滤器中调用的验证检查。无论我是否将 $errors
设置为 []
,提交都会在处理过程中冻结。只有在执行 if( !validateSite( $form_data, $field_id ) )
块时才会发生这种情况。否则,表单提交得很好。仅当没有要报告的错误时,处理才会冻结。
function validateSite($form_data, $field_id){
// $site_code = $form_data['fields'][$field_id]['value'];
$form_fields = $form_data[ 'fields' ];
foreach( $form_fields as $field )
{
$field_id = $field[ 'id' ];
$field_key = $field[ 'key' ];
$field_value = $field[ 'value' ];
// Example Field Key comparison
if( "site_code_1552245398425" == $field_key )
//I Strongly Suspect that this site code is never found,
//as I can never get this method to return false without
//hard-setting the default return. (Regardless whether or
//not the input is even or odd.)
{
if(intval($field_value) % 2 != 0) //EXAMPLE TEST
{
return true;
}
else
{
return false;
}
}
}
return false; //hard set to false
}
这是执行的过滤器:
add_filter( 'ninja_forms_submit_data', function( $form_data ){
$field_id = 'nf-field-21';
if( !validateSite( $form_data, $field_id ) )
{
$errors = [];
$form_fields = $form_data[ 'fields' ];
foreach( $form_fields as $field ) //iterate through the fields
{
$field_id = $field[ 'id' ];
$field_key = $field[ 'key' ];
$field_value = $field[ 'value' ];
if($field_key == "site_code_1552245398425")
{
//$errors = ['fields'][$field_id] = "INVALID SITE CODE";
$errors = ['fields' => [$field_id => "INVALID SITE CODE"]];
}
}
/*
$errors = [ 'fields' => [ 'nf-field-21' => __( 'Invalid Site Code.', 'my-plugin' ) ],];
*/
$response = [
'errors' => $errors,
];
echo wp_json_encode( $response );
wp_die(); // this is required to terminate immediately and return a proper response
}
// If no errors, be sure to return the $form_data.
return $form_data;
});
经过一段时间的搜索,我终于找到了自己的答案。考虑到缺少有关此主题的详细文档,我相信有人会觉得这很有帮助。下面的代码有效。 THIS link 帮助很大。
function validateSite($form_data, $fieldID)
{
if(intval($form_data['fields'][$fieldID]['value']) % 31 == 0)
{
return true; //No errors
}
else
{
return false; //ERROR!
}
}
add_filter( 'ninja_forms_submit_data', function( $form_data ){
$field_id = 21; //Field ID is NUMERICAL and not a string like 'nf-field-21', despite what you see in the front-end html.
if( !validateSite( $form_data, $field_id ) )
{
//This is the EASY way to set an error on a field.
$form_data['errors']['fields'][21] = "INVALID SITE CODE";
}
// If no errors, be sure to return the $form_data.
return $form_data;
});
我正在使用 Wordpress 5.1.1 上的 Ninja Forms 提交一个简单的表单。但是,我需要进行简单的服务器端验证。几天来,我一直在通过文档和网络进行筛选,但找不到解决此问题的方法。
到目前为止,我已经能够将我的函数附加到 Ninja Form 的 ninja_forms_submit_data
webhook。我已经确认 PHP 确实被执行了。但是,当我提交表单时,当我尝试 return 自定义错误时它卡在 "Processing" 上。我相信这与 AJAX 响应格式有关,但我不能确定。甚至可能是网站安全阻止了请求,但我对此表示怀疑。在我看来,更有可能的是我对 NinjaForms 如何在后端运行没有根本性的误解。
在这一点上,我什至愿意进行客户端验证(上下文中的安全性并不重要)。但我什至不确定如何实现。
我的背景主要是 C/C++、Java、Python 和 Ruby。 PHP 让我有点反感。感谢您提供的任何帮助。
这是在我的过滤器中调用的验证检查。无论我是否将 $errors
设置为 []
,提交都会在处理过程中冻结。只有在执行 if( !validateSite( $form_data, $field_id ) )
块时才会发生这种情况。否则,表单提交得很好。仅当没有要报告的错误时,处理才会冻结。
function validateSite($form_data, $field_id){
// $site_code = $form_data['fields'][$field_id]['value'];
$form_fields = $form_data[ 'fields' ];
foreach( $form_fields as $field )
{
$field_id = $field[ 'id' ];
$field_key = $field[ 'key' ];
$field_value = $field[ 'value' ];
// Example Field Key comparison
if( "site_code_1552245398425" == $field_key )
//I Strongly Suspect that this site code is never found,
//as I can never get this method to return false without
//hard-setting the default return. (Regardless whether or
//not the input is even or odd.)
{
if(intval($field_value) % 2 != 0) //EXAMPLE TEST
{
return true;
}
else
{
return false;
}
}
}
return false; //hard set to false
}
这是执行的过滤器:
add_filter( 'ninja_forms_submit_data', function( $form_data ){
$field_id = 'nf-field-21';
if( !validateSite( $form_data, $field_id ) )
{
$errors = [];
$form_fields = $form_data[ 'fields' ];
foreach( $form_fields as $field ) //iterate through the fields
{
$field_id = $field[ 'id' ];
$field_key = $field[ 'key' ];
$field_value = $field[ 'value' ];
if($field_key == "site_code_1552245398425")
{
//$errors = ['fields'][$field_id] = "INVALID SITE CODE";
$errors = ['fields' => [$field_id => "INVALID SITE CODE"]];
}
}
/*
$errors = [ 'fields' => [ 'nf-field-21' => __( 'Invalid Site Code.', 'my-plugin' ) ],];
*/
$response = [
'errors' => $errors,
];
echo wp_json_encode( $response );
wp_die(); // this is required to terminate immediately and return a proper response
}
// If no errors, be sure to return the $form_data.
return $form_data;
});
经过一段时间的搜索,我终于找到了自己的答案。考虑到缺少有关此主题的详细文档,我相信有人会觉得这很有帮助。下面的代码有效。 THIS link 帮助很大。
function validateSite($form_data, $fieldID)
{
if(intval($form_data['fields'][$fieldID]['value']) % 31 == 0)
{
return true; //No errors
}
else
{
return false; //ERROR!
}
}
add_filter( 'ninja_forms_submit_data', function( $form_data ){
$field_id = 21; //Field ID is NUMERICAL and not a string like 'nf-field-21', despite what you see in the front-end html.
if( !validateSite( $form_data, $field_id ) )
{
//This is the EASY way to set an error on a field.
$form_data['errors']['fields'][21] = "INVALID SITE CODE";
}
// If no errors, be sure to return the $form_data.
return $form_data;
});