PHP和CodeIgniter中的多步骤/页面表单

PHP和CodeIgniter中的多步骤/页面表单,php,forms,codeigniter,multipage,Php,Forms,Codeigniter,Multipage,我正在尝试用PHP和CodeIgniter构建一个多步骤/页面表单,我想知道你们是否可以帮助我 当您使用“后退”按钮返回到上一步时,如何在CI中创建更新而不是再次插入的多步骤表单?我怎样才能拥有一个没有“后退”按钮的表单,并在表单中重新发送消息 编辑:如果可能,不使用JS 谢谢 创建一个在向导的所有步骤中使用的唯一ID。初次保存表单时,将该ID保存到数据库中。 使用输入类型=hidden将此ID转发到下一步。 保存步骤时,首先尝试匹配ID,如果在数据库中找到ID,则执行更新而不是插入 要避免“是

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

当您使用“后退”按钮返回到上一步时,如何在CI中创建更新而不是再次插入的多步骤表单?我怎样才能拥有一个没有“后退”按钮的表单,并在表单中重新发送消息

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


谢谢

创建一个在向导的所有步骤中使用的唯一ID。初次保存表单时,将该ID保存到数据库中。 使用输入类型=hidden将此ID转发到下一步。 保存步骤时,首先尝试匹配ID,如果在数据库中找到ID,则执行更新而不是插入

要避免“是否要重新发送post数据”,请在两个CodeIgniter控制器操作中执行每个向导步骤:

SaveStep5POST:表单实例ID+其他向导步骤5输入: 在数据库中查找表单实例ID并执行insert/update命令; 重定向到LoadStep6并在GET参数中传递表单实例ID; LoadStep6GET:表单实例ID; 在数据库中查找表单实例, 如果未找到实例:错误处理 如果找到实例,则呈现步骤6的输入表单
创建在向导的所有步骤中使用的唯一ID。初次保存表单时,将该ID保存到数据库中。 使用输入类型=hidden将此ID转发到下一步。 保存步骤时,首先尝试匹配ID,如果在数据库中找到ID,则执行更新而不是插入

要避免“是否要重新发送post数据”,请在两个CodeIgniter控制器操作中执行每个向导步骤:

SaveStep5POST:表单实例ID+其他向导步骤5输入: 在数据库中查找表单实例ID并执行insert/update命令; 重定向到LoadStep6并在GET参数中传递表单实例ID; LoadStep6GET:表单实例ID; 在数据库中查找表单实例, 如果未找到实例:错误处理 如果找到实例,则呈现步骤6的输入表单
如果您希望避免那些警告用户重新发送帖子的消息,并且您还希望有多个适当的页面,而不是javascript中的不同步骤,那么您可以将答案作为GET参数放在URL中。。 那么在第一次提交表单之后,您将得到form2.php?在URL中。。您可以将这些答案作为隐藏变量添加到表单2中,以此类推。 不过,这不是一个非常优雅的解决方案。我建议您使用javascript:为表单提交添加一个自定义处理程序,并通过ajax提交表单内容,然后在ajax上加载下一个表单。
此外,与另一位回答的人一样,在服务器端,您需要一个唯一的ID来获取/更新数据库中的提交数据

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

我喜欢等待数据库更新直到所有步骤都完成的方法。您可以在会话的中间步骤中存储所有数据。如果您在会话中使用模型对象,并且在所有步骤完成后,您可以执行数据库插入操作,我想您甚至可以保存正在使用的模型对象。

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

以下是我对另一个问题的回答。它为您提供了向前/向后的能力,不会丢失数据,可在页面之间立即跳转,易于编码,无需会话,并且与框架无关,可在任何情况下使用:

我为心理学市场开发了一款产品,可以进行250个问题的心理学测试。为了做一个不是完全压倒性的测试,我将表单分成25个问题段,然后通过附加顺序ID的div标记以循环方式输出,即div1、div2、div3。每个div都设置为显示:除第一个之外没有

然后,我为用户提供了一个切换当前div+1的按钮,即如果在div 1上,它将执行$div2.show等操作。返回按钮则执行相反的操作

进口 ant的一部分是表单涵盖了所有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>

这是我对另一个问题的回答。它为您提供了向前/向后的能力,不会丢失数据,可在页面之间立即跳转,易于编码,无需会话,并且与框架无关,可在任何情况下使用:

我为心理学市场开发了一款产品,可以进行250个问题的心理学测试。为了做一个不是完全压倒性的测试,我将表单分成25个问题段,然后通过附加顺序ID的div标记以循环方式输出,即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>

我有一个模型来存储我的向导数据,该模型中的每个字段都有一个变量:

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
。。。

我有一个控制器来处理整个流程,其中包含会话id的参数和我们所处的流程阶段:

    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');
...
...
在这个控制器中,我有一个我们所处阶段的开关-它首先查找“Prev”按钮:

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");
稍后在切换中,我使用CI的验证来显示一个表单并处理“下一步”,如果它被单击或只是被/signup/in_progress/session/2调用:

    $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");
};
在每个视图的底部,例如“signupStage2.php”,我有上一个和下一个按钮:

    <span class="align-left"><p><input type="submit" name="prev" class="big-button"
value="<- Prev" /><input type="submit" name="next" class="big-button"
value="Next ->" /></p></span>

我有一个模型来存储我的向导数据,该模型中的每个字段都有一个变量:

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
。。。

我有一个控制器来处理整个流程,其中包含会话id的参数和我们所处的流程阶段:

    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');
...
...
在这个控制器中,我有一个我们所处阶段的开关-它首先查找“Prev”按钮:

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");
稍后在切换中,我使用CI的验证来显示一个表单并处理“下一步”,如果它被单击或只是被/signup/in_progress/session/2调用:

    $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");
};
在每个视图的底部,例如“signupStage2.php”,我有上一个和下一个按钮:

    <span class="align-left"><p><input type="submit" name="prev" class="big-button"
value="<- Prev" /><input type="submit" name="next" class="big-button"
value="Next ->" /></p></span>

我会使用JS完成所有步骤,然后立即提交所有内容…@prodigitalson抱歉,我忘了在我的问题中提到这一点,但我希望JS免费是可能的。ThanksI将使用JS完成所有步骤,然后立即提交所有内容…@prodigitalson抱歉,我忘了在我的问题中提到这一点,但我希望JS免费是可能的。感谢您,我们没有提供类似的东西,但是使用了uri段。Thanks无需将ID添加到数据库中。只需根据您的配置将其添加到会话中,它可能会自动将其添加到数据库中。例如,$this->session->set_userdata'wizard_id',rand;继续进行类似的操作,但使用uri段。Thanks无需将ID添加到数据库中。只需根据您的配置将其添加到会话中,它可能会自动将其添加到数据库中。例如,$this->session->set_userdata'wizard_id',rand;我喜欢这种逻辑。你能给我一些演示它是如何工作的吗?我喜欢这个逻辑。你能给我一些演示它是如何工作的吗??