表单处理:如何在输出前处理表单并从快捷码访问数据

时间:2014-08-15 作者:jjeaton

我有一个表单,它的输出带有一个短代码。我需要能够有条件地处理表单提交上的重定向,因此表单处理需要在发送任何输出之前进行(我将其放在init 挂钩)。

访问表单验证状态的最佳方式是什么($validate) 所以我可以输出表单中发现的任何错误(在短代码中)?使用全局变量是唯一的方法吗?如果可能的话,我会尽量避免。我将有多个表单也需要使用相同的流程。

add_action( \'init\', \'wpse_process_my_form\' );
function wpse_process_my_form() {
    if ( ! empty( $_POST[\'submit\'] ) && \'myform\' == $_POST[\'submit\'] ) {
        if ( $validate = wpse_validate_my_form( $_POST[\'form_data\'] ) ) {
            $success = wpse_save_my_form( $_POST[\'form_data\'] );
            if ( $success ) {
                wp_redirect( \'/success\', 302 );
                exit();
            }
        }

    }
}

add_shortcode( \'myform\', \'wpse_my_form_shortcode\' );

function wpse_my_form_shortcode( $atts ) {
    // Somehow get the errors ($validate) generated in the function attached to init

    // output form (with errors if found)

    return $form;
}

function wpse_save_my_form( $form_data ) {
    // Run save process here, return true if successful 
}

1 个回复
SO网友:cybmeta

一个可能的解决方案,我认为是一个很好的解决方案,就是使用一个具有属性的对象来存储验证状态,这样就可以在init操作挂钩中设置该属性的值,在那里处理表单并在短代码中访问它。例如:

class MyForm {

    private $validate;

    function __construct() {
         add_shortcode( \'myform\', array($this, \'wpse_my_form_shortcode\') );
         add_action( \'init\', array($this, \'wpse_process_my_form\') );
    }

    function wpse_my_form_shortcode( $atts ) {
        // Somehow get the errors ($validate) generated in the function attached to init

        $output = \'\';

        // output form (with errors if found)
        if( $this->validate[\'success\'] == \'error\' ){
             $output .= \'<div class="error">\'.$this->validate[\'message\'].\'</div>\';
        }
        $output .= \'<form name="my_form" method="post">\';
        $output .= \'<input type="text" name="form_data">\';
        $output .= \'<button type="submit">\'.__(\'Submit\').\'</button>\';
        $output .= \'</form>\';

        return $output;

    }

    function wpse_process_my_form() {
        if( isset($_POST[\'form_data\']) ) {
            $this->wpse_validate_my_form( $_POST[\'form_data\'] );
            if ( $this->validate[\'success\'] == \'success\' ) {
                $success = $this->wpse_save_my_form( $_POST[\'form_data\'] );
                if ( $success ) {
                    wp_redirect( \'/success\', 302 );
                    exit();
                }
            }
        }
    }

    function wpse_save_my_form( $form_data ) {
        // Run save process here, return true if successful
        return true;
    }

    function wpse_validate_my_form( $data ) {

        $validation = array();

        if( $data == \'validate_me\' ) {
            $validation[\'success\'] = "success";
            $validation[\'message\'] = "the success message";
        } else {
            $validation[\'success\'] = "error";
            $validation[\'message\'] = "the error message";
        }

        $this->validate = $validation;

    }

}
new MyForm();
注意:这是一个简单的例子来向您展示这一点。

结束

相关推荐

Basic do shortcodes question

我使用WordPress codex页面进行编码。正如您所看到的,我有两个PHP代码。页面能够获得代码的值,但它不遵守CSS规则,我相信这是因为我以错误的方式插入了PHP代码。您能看一下下面的代码并提出问题所在吗?<?php echo do_shortcode(\'[groups_non_member group=\"VPS\"]\' .\"<p class=\'vod-time-price\'>\" . the_field(\'run_t\') . \"MIN | $\". the