6

在我的控制器中,我输入了这段代码来检查购物车是否为空:

if (!$this->cart->contents()){
    $this->session->set_flashdata('message', 'Your cart is empty!');
}

$this->data['message'] = $this->session->flashdata('message');

$this->load->view('templates/header', $this->data);
$this->load->view('bookings', $this->data);
$this->load->view('templates/footer');

在我的“预订”视图中,我设置了此代码以显示消息:

<div id="infoMessage"><?php echo $message;?></div>

但在第一页加载消息“您的购物车是空的!” 没有显示。但是,当我按 F5 键或刷新浏览器时,它会显示。

我已经阅读了 codeigniter 的手册,上面写着“CodeIgniter 支持“flashdata”,或者只能用于下一个服务器请求的会话数据,然后会自动清除。

但是,我不知道在哪里设置此消息,因此它将在“下一个服务器请求”中可用。

4

1 回答 1

19

无需将数据传递给视图并将其分配为 flashdata。

它第一次不起作用的原因是 flashdata 仅可用于下一个服务器请求。加载视图不是服务器请求。但是,刷新页面是。

有几个解决方案:

  • 直接传递数据并加载视图。(不使用闪存数据。)
  • 使用 flashdata 并重定向到页面。

直接传递数据

你可以直接传递它(我个人会选择这个选项 - 我不确定你为什么要在这种情况下使用 flashdata,我想你总是想通知用户如果他们购物车是空的...):

控制器:

if (!$this->cart->contents())
{
    $this->data['message'] = 'Your cart is empty!';
}

$this->load->view('templates/header', $this->data);
$this->load->view('bookings', $this->data);
$this->load->view('templates/footer');

看法:

<div id="infoMessage"><?php echo $message;?></div>

使用闪存数据

或者,如果你想使用 flashdata,那么:

控制器:

if (!$this->cart->contents())
{
    $this->session->set_flashdata('message', 'Your cart is empty!');
}

redirect('/your_page');

看法:

 <div id="infoMessage"><?php echo $this->session->flashdata('message');?></div>

如果你想使用这个方法,你不能简单地加载视图——由于我上面解释的服务器请求问题——你必须重定向用户,使用redirect('/your_page');,和URL Helper $this->load->helper('url');。您还可以使用本机 PHPheader函数发送适当的 HTTP 标头。第一次加载视图将不起作用。


您可以使用它$this->session->keep_flashdata('message');来为其他请求保留数据。

我还会检查您是否自动加载会话库或将其加载到控制器的构造函数中:($this->load->library('session');我很确定您会这样做,但无论如何都值得检查。)

最后,我知道一些将会话数据存储在数据库中的人可能会遇到 flashdata 问题,因此如果上述方法都没有帮助,这可能值得研究。

附带说明一下,我个人会检查以确保在回显之前设置了变量。

于 2012-08-24T07:39:27.083 回答