将长表单拆分为多页

时间:2014-09-14 作者:Dima

我有一份很长的表格要提交。我需要将此更改为多页/多步骤表单,覆盖多页。

我将添加一个稍微干净的版本,它是定制的,因此没有源代码。DOWNLOAD 第189行I添加了相关备注

这个插件现在只是1页上的一个长表单。我想把它分成多页。因此,结果是一个人看到第一页,比如说10个问题(广播框),回答完这些问题后,他会进入下一页,再看10个,等等,我总共需要4页。很简单,我只是不知道它是如何在WP做的。

<?php

$wprr_strings = array( \'error\' => \'\', );

function wprr_check_input() {

    if ( ! ( isset( $_POST[\'wpcf_stage\'] ) ) ) {
        return false;
    } // Shortcircuit.

    global $wprr_strings;

    $ok = true;


    if ( empty( $_POST[\'Q1\'] ) or empty( $_POST[\'Q2\'] ) or empty( $_POST[\'Q3\'] )

        or empty( $_POST[\'Q4\'] ) or empty( $_POST[\'Q5\'] ) or empty( $_POST[\'Q6\'] ) or empty( $_POST[\'Q7\'] ) or empty( $_POST[\'Q8\'] )

        or empty( $_POST[\'Q9\'] ) or empty( $_POST[\'Q10\'] ) or empty( $_POST[\'Q11\'] ) or empty( $_POST[\'Q12\'] ) or empty( $_POST[\'Q13\'] )

        or empty( $_POST[\'Q14\'] ) or empty( $_POST[\'Q15\'] ) or empty( $_POST[\'Q16\'] ) or empty( $_POST[\'Q17\'] ) or empty( $_POST[\'Q18\'] )

        or empty( $_POST[\'Q19\'] ) or empty( $_POST[\'Q20\'] ) or empty( $_POST[\'Q21\'] ) or empty( $_POST[\'Q22\'] ) or empty( $_POST[\'Q23\'] )

        or empty( $_POST[\'Q24\'] ) or empty( $_POST[\'Q25\'] ) or empty( $_POST[\'Q26\'] ) or empty( $_POST[\'Q27\'] ) or empty( $_POST[\'Q28\'] )

        or empty( $_POST[\'Q29\'] ) or empty( $_POST[\'Q30\'] ) or empty( $_POST[\'Q31\'] ) or empty( $_POST[\'Q32\'] )
    ) {

        $ok     = false;
        $reason = \'empty\';

    }


    if ( $ok == true ) {

        return true;

    } else {

        if ( $reason == \'empty\' ) {

            $wprr_strings[\'error\'] = \'<span style="color: #ff0000;"><b>Ошибка!</b> Заполнены не все поля формы.</span>\';

        }

        return false;

    }

}


function wprr_callback( $content ) {

    global $wprr_strings;

    global $charset;

    global $wpdb;


    /* Run the input check. */

    if ( wprr_check_input() ) // If the input check returns true (ie. there has been a submission & input is ok)

    {

        $test_result = array( \'safety\' => 0, \'agressiveness\' => 0, \'courtesy\' => 0, \'rage\' => 0, );


        $test_result[\'safety\'] = ( $_POST[\'Q1\'] + $_POST[\'Q4\'] + $_POST[\'Q11\'] + $_POST[\'Q15\'] + $_POST[\'Q17\'] + $_POST[\'Q25\'] +

                $_POST[\'Q26\'] + $_POST[\'Q29\'] ) * 2.5;

        $test_result[\'agressiveness\'] = ( $_POST[\'Q2\'] + $_POST[\'Q6\'] + $_POST[\'Q8\'] + $_POST[\'Q10\'] + $_POST[\'Q14\'] + $_POST[\'Q27\'] +

                $_POST[\'Q28\'] + $_POST[\'Q31\'] ) * 2.5;

        $test_result[\'courtesy\'] = ( $_POST[\'Q3\'] + $_POST[\'Q5\'] + $_POST[\'Q12\'] + $_POST[\'Q13\'] + $_POST[\'Q21\'] + $_POST[\'Q23\'] +

                $_POST[\'Q24\'] + $_POST[\'Q32\'] ) * 2.5;

        $test_result[\'rage\'] = ( $_POST[\'Q7\'] + $_POST[\'Q9\'] + $_POST[\'Q16\'] + $_POST[\'Q18\'] + $_POST[\'Q19\'] + $_POST[\'Q20\'] +

                $_POST[\'Q22\'] + $_POST[\'Q30\'] ) * 2.5;


        // Оценка категорий

        // БЕЗОПАСНОСТЬ

        if ( $test_result[\'safety\'] < 37.5 ) {

            $safe_msg = "С Вами опасно.";

        } elseif ( ( $test_result[\'safety\'] >= 37.5 ) and ( $test_result[\'safety\'] < 62.5 ) ) {

            $safe_msg = "С Вами не очень безопасно.";

        } elseif ( ( $test_result[\'safety\'] >= 62.5 ) and ( $test_result[\'safety\'] < 82.5 ) ) {

            $safe_msg = "Вы безопасный водитель.";

        } else {

            $safe_msg = "С Вами безопасно.";

        }

// More results (does not matter)


        // Добавляем данные в таблицу test_rr

        $sql_ins = \'INSERT INTO test_rr (sex, age, brand, color safe, agres, court, rage) VALUES (\' . $_POST[\'sex\'] . \',\' . $_POST[\'age\'] .

            \',\' . $_POST[\'brand\'] . \',\' . $_POST[\'color\'] . \',\' . $test_result[\'safety\'] . \',\' . $test_result[\'agressiveness\'] . \',\' . $test_result[\'courtesy\'] . \',\' . $test_result[\'rage\'] . \')\';


        //echo $sql_ins;

        $wpdb->query( $sql_ins );


        // Подсчет средних значений

        $avgs = array();


        $avgs = $wpdb->get_row( "SELECT AVG(safe), AVG(agres), AVG(court), AVG(rage) FROM test_rr;", ARRAY_N );


        $success_msg = "BLA BLA"


        $results = \'<p class="successmsg">\' . $success_msg . \'</p>\';

        return $results;



    } else // This is the FORM that needs to be split into a few pages

    {


        $form = \'<p>bla bla.</p>

<form id="contactform" action="\' . get_permalink() . \'" method="post">

\' . $wprr_strings[\'error\'] . \'

    <fieldset>

    <h3>bla bla</h3>

    <br/>

===>>> FORM INPUTS, SELECTS, RADIOS ETC... (few dozen of those) Split the like 10 per page <<<======



    </fieldset>

</form>



\';

        return $form;


    }

}

add_shortcode( \'test_rr_form\', \'wprr_callback\' );

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

您的问题可以使用标准PHP来完成,WordPress没有什么特殊的功能(假设这是一个前端表单)。

假设您有一个包含6个输入的表单。您希望它们显示在3页上。允许使用此伪代码:

if form submitted
    do checks and handle form
else
    display input 1
    display input 2
    display input 3
    display input 4
    display input 5
    display input 6
这就是你现在拥有的。

您需要做的是:

将当前页面上不存在的输入输出为“隐藏”类型,以便在页面之间记住这些输入。每次用户提交表单时,使用页面计数器维护隐藏输入,增加计数器并显示下一页。当计数器高于上一页时,请完整处理表单,以便:

if form not submitted
    this is the first page
    display input 1
    display input 2
    display hidden input 3
    display hidden input 4
    display hidden input 5
    display hidden input 6
    display hidden count with value 0
else
    if counter == 1
        display hidden input 1
        display hiddeninput 2
        display input 3
        display input 4
        display hidden input 5
        display hidden input 6
        display hidden input counter+1
    else if counter == 2
        display hidden input 1
        display hidden input 2
        display hidden input 3
        display hidden input 4
        display input 5
        display input 6
        display hidden input counter+1
    else
        check and process form
当然,如果您有很多字段,并且有一个提交按钮可以转到下一页,则需要进行一些重构以删除重复项

结束

相关推荐

Pagination and Related Posts

是否可以对嵌入在single中的以下相关POST代码使用分页。我的主题的php。 <?php // for use in the loop, list 5 post titles related to first tag on current post $tags = wp_get_post_tags($post->ID); if ($tags) { $first_tag = $