Wordpress插件:在短代码生成后处理基于会话的表单

时间:2014-02-18 12:25:33

标签: forms wordpress-plugin shortcode php

我写了一个Wordpress插件,可以使用短代码在帖子/页面中嵌入表单。

我在这个表单中使用php会话。

其中一个用途是存储在显示表单时生成的标记,然后将其与表单隐藏字段的值进行比较,也在显示表单时进行设置。

这样,如果隐藏字段的提交值与会话中令牌的存储值相同,我知道这是我的插件生成的表单,并进行了进一步的验证。

当我创建表单时,当运行'add_shortcode'调用的函数时,会生成令牌。此时,它的值既存储在会话数组中,也存储为表单隐藏字段的值。

问题在于,在将它与隐藏字段值进行比较之前,看起来存储在会话中的令牌会被覆盖,换句话说,它看起来像表单(和令牌)的生成发生在表单逻辑之前(包含在'init')。

以下是我的代码的相关部分:

主插件-file.php:

// Sessions
function init_sessions() {
    if (!session_id()) {
        session_start();
    }
}
add_action('init', 'init_sessions');

// Formlogic
add_action('init', 'include_formlogic');

function include_formlogic() 
{
    include_once 'formlogic.php'; // comparing $_SESSION['token'] and $_POST['token']
}

// Shortcode
add_shortcode('display_form', 'display_form');

function display_form()
{
    return getForm();
}

formlogic.php:

// generate unique token
function generateToken()
{
    $token = uniqid(rand(), true);
    $_SESSION['token'] = $token;
    return $token;
}

// Generate form
function getForm()
{   
    $token = generateToken();
    // Checking the form
    if (checkForm()) {
        // Get variables to be included in the form
        getVariables();
        // Start with the output buffering
        ob_start();
        include 'form-template.php';
        $output = ob_get_clean();
    } else { 
        // Alternative html in case of error
        $output = 'Error';
    }
    return $output;
}

// Comparing $_SESSION['token'] and $_POST['token'] to see if we go further:
if ($_SESSION['DRAFS_token'] === $_POST['token']) {
    // Validate the form and process it
} else {
    // Display the form along with the errors
}

0 个答案:

没有答案