我正在尝试在 PHP 和 CodeIgniter 中构建一个多步骤/页面表单,我想知道你们是否可以帮助我。
当您使用后退按钮返回上一步时,如何在 CI 中创建一个更新而不是再次插入的多步骤表单?我怎样才能有一个没有那些后退按钮 POST 表单重新发送消息的表单?
编辑:如果可能的话没有JS
谢谢!
我正在尝试在 PHP 和 CodeIgniter 中构建一个多步骤/页面表单,我想知道你们是否可以帮助我。
当您使用后退按钮返回上一步时,如何在 CI 中创建一个更新而不是再次插入的多步骤表单?我怎样才能有一个没有那些后退按钮 POST 表单重新发送消息的表单?
编辑:如果可能的话没有JS
谢谢!
这是我对另一个问题的回答。它为您提供前进/后退的能力,而不会丢失数据,立即在页面之间跳转,易于编码,不需要会话,并且独立于框架(可在任何情况下使用):
我为心理学市场开发了一款产品,可以进行 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>
创建您在向导的所有步骤中使用的唯一 ID。在最初保存表单时将该 ID 保存到数据库中。使用 . 将此 ID 转发到后续步骤input type="hidden"
。
保存步骤时,首先尝试匹配 ID,如果在数据库中找到它,则执行更新而不是插入。
为了避免“你想重新发送发布数据”,请在两个 CodeIgniter 控制器操作中执行每个向导步骤:
如果您想避免那些警告用户重新发送帖子的消息,并且您还希望拥有多个正确的页面,而不仅仅是 javascript 中的不同步骤,您可以将答案作为 GET 参数放在 URL 中。所以在第一个表单之后提交,你会得到form2.php吗?在 URL 中.. 您可以将这些答案添加为 form2 中的隐藏变量,依此类推。
虽然这不是一个非常优雅的解决方案。我建议您使用 javascript:为表单提交添加自定义处理程序并通过 ajax 提交表单内容,然后在 ajax 完成时加载下一个表单。
此外,就像其他人回答的那样,在服务器端,您将需要一个唯一的 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
……
我有一个控制器来处理整个过程,带有 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>