【问题标题】:Multi step/page form in PHP & CodeIgniterPHP 和 CodeIgniter 中的多步骤/页面表单
【发布时间】:2011-07-02 06:22:59
【问题描述】:

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

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

编辑:尽可能不使用 JS

谢谢!

【问题讨论】:

  • 我会使用 JS 完成这些步骤,然后一次提交所有内容...
  • @prodigitalson 对不起,我忘了在我的问题中提到这一点,但我希望它是免费的 JS 是可能的。谢谢

标签: php forms codeigniter multipage


【解决方案1】:

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

为了避免“你想重新发送帖子数据”,请在两个 CodeIgniter 控制器操作中执行每个向导步骤:

  • SaveStep5(POST:表单实例 ID + 其他“向导步骤 5”输入): 在数据库中查找表单实例 ID 并执行插入/更新命令; 重定向到 LoadStep6 并在 GET 参数中传递表单实例 ID;
  • Lo​​adStep6(GET: 表单实例 ID); 在数据库中查找表单实例, 如果没有找到实例:错误处理 如果找到实例,则呈现“步骤 6”的输入表单

【讨论】:

  • 继续使用与此类似的东西,但使用 uri 段。谢谢
  • 不需要将ID添加到数据库中。只需将其添加到会话中(根据您的配置,它可能会自动将其添加到数据库中)。例如。 $this->session->set_userdata('wizard_id', rand());
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

      重要的部分是表单涵盖了所有 div。然后只需在最后用提交按钮替换前进/后退按钮即可。

      瞧!是的,技术含量低。但是 FAST ......而且没有机会在前进或后退时失去价值。

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

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

      【讨论】:

      • 我喜欢这个逻辑。你能给我一些演示它是如何工作的吗??
      【解决方案5】:

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

      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
      

      ... ...

      我有一个控制器来处理整个过程,带有 session_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');
      ...
      ...
      

      在这个控制器中,我有一个开关,用于显示我们所处的阶段——它首先寻找一个“上一个”按钮:

      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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多