我正在尝试在PHP和CodeIgniter中构建一个多步骤/页面表单,我想知道是否有人可以帮助我。
当您使用后退按钮返回上一步时,如何在CI中使用多步骤表单进行更新而不是再次插入?我怎么能有一个表单没有那些后退按钮POST表单重发消息?
编辑:如果可能,不使用JS
谢谢!
答案 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控制器操作中执行每个向导步骤:
答案 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");
};