1

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

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

编辑:如果可能的话没有JS

谢谢!

4

5 回答 5

5

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

我为心理学市场开发了一款产品,可以进行 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>
于 2011-02-22T20:38:08.877 回答
3

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

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

  • SaveStep5(POST: form instance ID + other "wizard step 5" inputs):在数据库中查找form instance ID并执行插入/更新命令;重定向到 LoadStep6 并在 GET 参数中传递表单实例 ID;
  • LoadStep6(GET: 表单实例 ID); 在数据库中查找表单实例,如果未找到该实例:如果找到该实例,则进行错误处理,呈现“步骤 6”的输入表单
于 2011-02-22T19:45:10.900 回答
0

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

于 2011-02-22T19:49:15.903 回答
0

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

于 2011-02-22T19:52:17.833 回答
0

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

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>
于 2015-05-06T23:53:13.050 回答