PHP&中的多步/页面表单笨

时间:2011-02-22 19:38:47

标签: php forms codeigniter multipage

我正在尝试在PHP和CodeIgniter中构建一个多步骤/页面表单,我想知道是否有人可以帮助我。

当您使用后退按钮返回上一步时,如何在CI中使用多步骤表单进行更新而不是再次插入?我怎么能有一个表单没有那些后退按钮POST表单重发消息?

编辑:如果可能,不使用JS

谢谢!

5 个答案:

答案 0 :(得分:5)

这是我对另一个问题的回答。它为您提供前进/后退功能,没有丢失数据的机会,在页面之间即时跳转,对代码很容易,不需要会话,并且与框架无关(可以在任何情况下使用):

我为心理学市场开发了一个产品,可以进行250个问题的心理测试。为了进行一个不完全压倒性的测试,我将表格分成25个问题段,同时通过div标签输出它,并附加一个顺序ID(即div1,div2,div3)每个div设置为显示:没有,只有第一个。

然后我为用户提供了一个切换当前div + 1的按钮(即如果在div 1上,它会执行$(#div2).show()等。后退按钮则相反。

重要的是表格涵盖所有div。然后只需用提交按钮交换最后的前进/后退按钮。

瞧!是的,低技术。但是很快......并且没有机会永远失去前进或后退的价值。

所以,一个粗略的截断示例:

<form>
  <div id="div1">
     First 25 Questions
     <input type="button">shows next div</input>
  </div>
  <div id="div2" style="display:none">
    Second 25 Questions
    <input type="submit">Submit Form</input>
  </div>
</form>

答案 1 :(得分:3)

创建一个唯一的ID,您可以在向导的所有步骤中使用该ID。在初始保存表单时将该ID保存到数据库。 使用input type="hidden"将此ID转发给后续步骤 保存步骤时,首先尝试匹配ID,如果在数据库中找到它,则执行更新而不是插入。

要避免&#34;是否要重新发送帖子数据&#34;,请在两个CodeIgniter控制器操作中执行每个向导步骤:

  • SaveStep5(POST:表单实例ID +其他&#34;向导步骤5&#34;输入):  在数据库中查找表单实例ID并执行insert / update命令;  重定向到LoadStep6并在GET参数中传递表单实例ID;
  • LoadStep6(GET:表单实例ID);   在数据库中查找表单实例,   如果找不到实例:错误处理   如果找到实例,则为&#34;步骤6&#34;
  • 呈现输入表单

答案 2 :(得分:0)

如果您想避免那些警告用户重新发帖的消息,并且您还希望拥有多个正确的页面而不仅仅是javascript中的不同步骤,您可以将答案作为GET参数放在URL中。 所以在第一次提交表单后,你会得到form2.php?在URL ..您可以将这些答案添加为form2中的隐藏变量,依此类推 虽然这不是一个非常优雅的解决方案。我建议你使用javascript:为表单提交添加自定义处理程序并通过ajax提交表单内容,然后在ajax complete上加载下一个表单。
此外,与其他人一样,在服务器端,您将需要一个唯一的ID来获取/更新数据库中的提交数据。

答案 3 :(得分:0)

我喜欢在所有步骤完成之前等待数据库更新的方法。您可以将所有数据存储在会话的中间步骤中。我想你甚至可以在会话中保存你正在使用的模型对象(如果你正在使用它),并且在完成所有步骤之后你可以进行数据库插入。

答案 4 :(得分:0)

我有一个模型来存储我的向导数据,并为表单上的每个字段添加一个变量:

255.0 << 24 = -16777216    

... ...

我有一个控制器来处理整个过程,包含session_id的参数和我们所处的过程阶段:

class Class_signup_data extends CI_Model {
const table_name="signups_in_progress";
public $market_segment; // there is a field named 'market_segment' in the wizard view

在这个控制器中,我有一个开关,我们处于哪个阶段 - 它首先寻找'上一个'按钮:

    class Signup extends CI_Controller {
    public function in_progress($session_id=NULL,$stage=1) {
        $this->index($session_id,$stage);
    }
    public function index($session_id=NULL,$stage=1) {
    if ($session_id===NULL) $session_id=$this->session->userdata('session_id');
...
...

稍后在交换机中我使用CI的Validations显示表单并处理'Next'如果它被点击或者只是用/ signup / in_progress / session / 2调用它:

switch ($stage) {
        case 2:
            if ($this->input->post('prev')) { // if they click Previuous, the validations DON'T need to be met:
                $signup_data->save_to_db(array_merge(array('ip'=>$_SERVER['REMOTE_ADDR'],'session_id'=>$session_id,'signup_stage' => '1',
                    'signup_complete' =>'0'),$this->input->post()),$this->db,$session_id);
                $this->load->helper('url');
                redirect("/signup/in_progress/".$session_id."/1");

在每个视图的底部(例如'signupStage2.php')我有prev和next按钮:

    $this->form_validation->set_rules("your rules");
if ($this->form_validation->run() == FALSE) {
    $this->load->view('signupStage2',array('signup_data'=>$signup_data));
} else {
    $signup_data->save(array_merge(array('ip'=>$_SERVER['REMOTE_ADDR'],'session_id'=>$session_id,'signup_stage' => '3',
    'signup_complete' =>'0'),$this->input->post()),$this->db,$session_id);
    $this->load->helper('url');
    redirect("/signup/in_progress/".$session_id."/3");
};