wordpress 如何防止表格在Elementor Pro中提交时清除字段?

bq3bfh9z  于 2023-01-29  发布在  WordPress
关注(0)|答案(1)|浏览(209)

我在我的WordPress网站上用Elementor Pro创建了一个表单。点击按钮后,我可以使用WordPress后端以某种方式处理结果,但同时表单被重新加载,所有字段再次使用默认值。在某些情况下,这会带来很大的阻碍-例如,当你试图构建一个简单的Web应用程序时。
具体来说,我们构建一个表单来添加两个数字(this tutorial)。
前端如下所示:
Adder Form
“结果将显示在此处”元素的HTML代码:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
    jQuery( document ).ready(function( $ ){
        jQuery( document ).on('submit_success', function(event, response){
            document.getElementById("result").innerHTML = response.data['1'].result;
        });
    });
</script>
<p id='result'>The result will appear here.</p>

PHP代码(在代码段WordPress插件中):

function add_two_numbers($fields) {
    $a = $fields['a'];
    $b = $fields['b'];
    return $a + $b;
}

// A send custom WebHook
add_action( 'elementor_pro/forms/new_record', function( $record, $handler ) {
    // make sure its our form
    $form_name = $record->get_form_settings( 'form_name' );
    if ( 'AdderForm' !== $form_name ) {
        return;
    }
    
    $raw_fields = $record->get( 'fields' );
    $fields = [];
    foreach ( $raw_fields as $id => $field ) {
        $fields[ $id ] = $field['value'];
    }
    
    $output['result'] = add_two_numbers($fields);
    
    $handler->add_response_data( true, $output );
}, 10, 2 );

我一直在努力钻研Elementor文档,设置动态“默认”值,探索表单设置,在谷歌上搜索诸如“Elementor在提交后不重新加载表单”,“Elementor保存默认值表单”等内容,但我什么也没找到。显然,官方的Elementor工具不允许你这样做,在我看来,这很奇怪。
我找到了一个解决方案,希望与其他人分享,但我觉得它并不直观。如果您知道更好的解决方案,或者Elementor的新版本允许您这样做,请随时发表评论。

tsm1rwdh

tsm1rwdh1#

我找到的答案是显式返回表单字段的当前值,并使用jQuery显示它们。
为此,请按如下方式更改PHP代码(CHANGE行):

function add_two_numbers($fields) {
    $a = $fields['a'];
    $b = $fields['b'];
    return $a + $b;
}

// A send custom WebHook
add_action( 'elementor_pro/forms/new_record', function( $record, $handler ) {
    // make sure its our form
    $form_name = $record->get_form_settings( 'form_name' );
    if ( 'AdderForm' !== $form_name ) {
        return;
    }
    
    $raw_fields = $record->get( 'fields' );
    $fields = [];
    foreach ( $raw_fields as $id => $field ) {
        $fields[ $id ] = $field['value'];
    }
    
    $output = $fields; // send input data back to the form to display <- CHANGE
    $output['result'] = add_two_numbers($fields);
    
    $handler->add_response_data( true, $output );
}, 10, 2 );

HTML元素的jQuery脚本:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
    jQuery( document ).ready(function( $ ){
        jQuery( document ).on('submit_success', function(event, response){
            document.getElementById("result").innerHTML = response.data['1'].result;
            
            // display the data of the previous request on the form
            $("#form-field-a").value(response.data['1'].a);
            $("#form-field-b").value(response.data['1'].b);
        });
    });
</script>
<p id='result'>The result will appear here.</p>

相关问题