CodeIgniter - 使用重定向重新填充无效表单
Posted
技术标签:
【中文标题】CodeIgniter - 使用重定向重新填充无效表单【英文标题】:CodeIgniter - Repopulating an invalid form w/ redirect 【发布时间】:2011-12-27 21:41:58 【问题描述】:我使用Post-Redirect-Get 模式来避免在 POST 提交后刷新页面时出现问题。重定向会清除所有发送的 POST 数据,这意味着我无法使用 set_value()
和相关函数再次填充这些字段。
为了更清楚,这里是它的工作原理。
-
客户端提交的 POST 包含无效数据。
发回一个 303 重定向标头。
客户端在标头位置执行 GET,但 POST 数据已消失,这意味着无法重新填充表单。
请帮忙? :)
【问题讨论】:
【参考方案1】:将post数据设置为flashdata(会话类的一部分):
$this->session->set_flashdata('post', $this->input->post());
然后得到它:
$this->session->flashdata('post');
您也可以使数据保持更长时间:
$this->session->keep_flashdata('post');
更多:http://codeigniter.com/user_guide/libraries/sessions.html
【讨论】:
【参考方案2】:一种方法是在重定向之前将 POST 数据存储在会话中,例如如果您的表格是“注册”,那么您可以这样做:
session_start();
$_SESSION['register_form_data'] = array();
foreach($_POST as $key=>$value)
$_SESSION['register_form_data'][$key] = $value;
现在表单数据将在表单页面上可用。您还可以创建一个 set_value_from_session()
辅助函数来重新填充字段。
【讨论】:
这不是 CodeIgniter 的标准用法。 好的。我不知道闪存数据。我说的更笼统。 不用担心 - 只是让你知道 = )【参考方案3】:您可以扩展 CI_Form_validation 并添加(或将其添加到 CI_Form_validation 构造)
$CI =& get_instance();
$CI->load->library('session');
if (count($_POST) > 0 OR count($_FILES) > 0)
$CI->session->set_flashdata('prg', array(
'date' => time()+ini_get('max_execution_time'),
'post' => $_POST,
'files' => $_FILES
));
redirect(current_url(), 'location', 302);
else
$prg = $CI->session->flashdata('prg');
if($prg==TRUE)
if($prg['date']>time())
$_POST = $prg['post'];
$_FILES = $prg['files'];
到构造。 这将解决您的问题 但是,如果您在系统中提交表单后有任何 redirect() 函数,这些重定向将被上述重定向覆盖。所以请注意这一点。 (解决方法 - 您可以在没有 redirect() 的每个函数中调用它)
【讨论】:
以上是关于CodeIgniter - 使用重定向重新填充无效表单的主要内容,如果未能解决你的问题,请参考以下文章
使用 Codeigniter 重定向 SEO 友好的 url?