当前位置: 首页 > 知识库问答 >
问题:

Ninja Forms服务器端验证不工作

姬实
2023-03-14

我花了两天时间想弄明白这一点。我有一个wordpress页面与四场忍者形式。其中一个字段是电子邮件。我创建了一个API(在我们的.NET核心项目中),它检查并抛出一个400的错误,如果我们的DB中存在一个已经具有该电子邮件地址的邮件。我正在使用Ninja Forms Webhook特性将表单提交给我的API。我只想向用户显示我的400错误消息。

我正在使用以下来自Ninja Forms的文档,但它不起作用:

https://developer.ninjaforms.com/codex/custom-server-side-validation/

更具体地说,我得到的是一个500与以下错误在控制台:

Uncaught Error: Call to undefined function my_nf_validation() in \/home\/site\/wwwroot\/wp-content\/themes\/hello-elementor\/functions.php:245\nStack trace:\n#0 \/home\/site\/wwwroot\/wp-includes\/class-wp-hook.php(287): {closure}(Array)\n#1 \/home\/site\/wwwroot\/wp-includes\/plugin.php(206): WP_Hook->apply_filters(Array, Array)\n#2 \/home\/site\/wwwroot\/wp-content\/plugins\/ninja-forms\/includes\/AJAX\/Controllers\/Submission.php(132): apply_filters('ninja_forms_sub...', Array)\n#3 \/home\/site\/wwwroot\/wp-includes\/class-wp-hook.php(287): NF_AJAX_Controllers_Submission->submit('')\n#4 \/home\/site\/wwwroot\/wp-includes\/class-wp-hook.php(311): WP_Hook->apply_filters('', Array)\n#5 \/home\/site\/wwwroot\/wp-includes\/plugin.php(478): WP_Hook->do_action(Array)\n#6 \/home\/site\/wwwroot\/wp-admin\/admin-ajax.php(175): do_action('wp_ajax_nf_ajax...')\n#7 {main}\n  thrown<\/pre>"},"last":{"type":1,"message":"Uncaught Error: Call to undefined function my_nf_validation() in \/home\/site\/wwwroot\/wp-content\/themes\/hello-elementor\/functions.php:245\nStack trace:\n#0 \/home\/site\/wwwroot\/wp-includes\/class-wp-hook.php(287): {closure}(Array)\n#1 \/home\/site\/wwwroot\/wp-includes\/plugin.php(206): WP_Hook->apply_filters(Array, Array)\n#2 \/home\/site\/wwwroot\/wp-content\/plugins\/ninja-forms\/includes\/AJAX\/Controllers\/Submission.php(132): apply_filters('ninja_forms_sub...', Array)\n#3 \/home\/site\/wwwroot\/wp-includes\/class-wp-hook.php(287): NF_AJAX_Controllers_Submission->submit('')\n#4 \/home\/site\/wwwroot\/wp-includes\/class-wp-hook.php(311): WP_Hook->apply_filters('', Array)\n#5 \/home\/site\/wwwroot\/wp-includes\/plugin.php(478): WP_Hook->do_action(Array)\n#6 \/home\/site\/wwwroot\/wp-admin\/admin-ajax.php(175): do_action('wp_ajax_nf_ajax...')\n#7 {main}\n  thrown","file":"\/home\/site\/wwwroot\/wp-content\/themes\/hello-elementor\/functions.php","line":245}},"debug":[]}

我将代码放在Themes Editor的function.php文件中。这是我第一次使用wordpress,所以我希望我做得对。这是我的代码,直接取自上面的文档:

add_filter( 'ninja_forms_submit_data', function( $form_data ){

  if( ! my_nf_validation( $form_data ) ) { // Add check here.

    $errors = [
      __( 'An unexpected error occurred.', '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;
});

我真的很感谢任何人的帮助。

共有2个答案

臧翰采
2023-03-14

文档引用了一个自定义的WordPress过滤器,由Ninja Forms插件定义。过滤器是WordPress钩子的一个功能,它允许一个主题或插件修改另一个主题或插件的功能。参见https://developer.wordpress.org/plugins/hooks/filters/

对于您的问题,Webhooks插件插件(Ninja Forms的官方扩展)不需要使用您从文档中引用的过滤器。

相反,您需要用自己定义的函数替换“my_nf_validation()”,如文档中所示。

您的函数需要处理API请求和响应处理。在文档示例中,自定义函数返回一个布尔值。

裴承安
2023-03-14

试试下面的代码,它会起作用的。

function validateCode($field){

if( checkCondition ){
    // let it go
    return true;
}
else{
    return false;
}
}
add_filter( 'ninja_forms_submit_data', 'my_ninja_forms_submit_data' );
function my_ninja_forms_submit_data( $form_data ) {
$form_settings = $form_data[ 'settings' ]; // Form settings.
if($form_data['id'] == '2'){
    foreach( $form_data[ 'fields' ] as $field ) { // Field settigns, including the field key and value.
        if( 'unique_code' == $field[ 'key' ] ){

            if(!validateCode($field)){
                $form_data['errors']['fields'][$field['id']] = "INVALID CODE";
            }
        }
    }
}
return $form_data;
}
 类似资料:
  • 问题内容: 进行客户端或服务器端验证哪个更好? 在我们的情况下,我们正在使用 jQuery和MVC。 在我们的视图和控制器之间传递的JSON数据。 我所做的许多验证工作都是在用户输入数据时对其进行验证。例如,我使用该事件来防止文本框中的字母,设置最大字符数,并且该数字在一定范围内。 我想更好的问题是,与客户端相比,进行服务器端验证是否有任何好处? 真棒的答案大家。我们拥有的网站受到密码保护,并且用

  • 验证 SSH 服务器证书(客户端) 和 SSH 用户证书 类似,使用客户端机构认证来验证主机。需要一个 SSH 服务器数字证书认证机构签发服务器证书,客户端只需要保存 CA 的公钥。 使用一台处于气隙系统下的计算机来生成服务器数字证书认证机构的根证书: ❯ ssh-keygen -C "SSH Server Certificate Authority" -f sshserver.root.ca 使

  • 问题内容: 我有一个角度应用程序,其中包含一个从示例中获取的保存按钮: 这对于客户端验证非常有用,因为当用户解决问题时它会变为false,但是我有一个电子邮件字段,如果另一个用户使用相同的电子邮件注册,则该字段设置为无效。 一旦我将电子邮件字段设置为无效,就无法提交表单,并且用户无法修复该验证错误。所以现在我不能再使用来禁用我的提交按钮。 肯定有更好的办法 问题答案: 我在几个项目中都需要这样做,

  • 问题内容: 我试图了解如何执行以下操作: 声明表单的可接受方式是什么。我的理解是,您只需用HTML声明表单,并添加ng-model指令,如下所示: 要发送到服务器的内容。我可以将item对象作为JSON发送到服务器,然后对其进行解释。然后,我可以对对象执行验证。如果失败,则抛出JSON错误,然后发回确切的信息?有接受的方式吗?如何以一种很好的方式将验证错误从服务器推送到客户端? 我确实需要一个示例

  • 我试图了解如何做以下事情: 声明表单的公认方式是什么。我的理解是您只需用超文本标记语言声明表单,然后添加ng-model指令,如下所示: 发送到服务器的内容。我可以将item对象作为JSON发送到服务器,并对其进行解释。然后我可以对对象执行验证。如果失败,我抛出一个JSON错误,并返回具体内容?有没有公认的方法?如何以一种好的方式将验证错误从服务器推送到客户端? 我真的需要一个例子,但是Angul