目标:
当我使用任何网址时,我会使用login
,logout
,post_Comment
等功能。我希望网址保持不变。
示例:
代码的很少部分将用伪代码编写,只是为了给出函数内部的简单示例。对我的问题很重要的一切都是实际的语法。
控制器
public function index() {
$this->load->view('main_v');
}
public function detail($id){
//db select query for car details with given id
//$data = query result
$this->load->view('detail_v', $data);
}
public function login($name, $password){
//find the user in db using the arguments and store his id in $user_id
$data['user_id'] = $user_id;
//PROBLEM: load the page/view/url from which the function was triggered
}
查看 * main_v *
<a href="<?php echo base_url('controller/detail/3') ?>">
<p>Display detail for car #3</p>
</a>
查看 * detail_v *
//car details
<?php echo form_open('core/login'); ?>
//input name
//input password
<p>Click here to log in</p>
</form>
问题
现在您可以看到问题出在login
函数中。我想知道我是如何做到这一点的,这样当调用login
函数时,它会完成它,然后重新加载它被触发的内容。
我尝试了什么
我尝试在会话中存储当前视图的名称。每次更改视图时,我都会在会话中存储视图的名称。然后在login
函数的末尾,我有this->load->view($this->session->userdata('current_view');
。结果只是我需要的一半。虽然它显示了我触发login
功能的页面内容,但它不会更改URL。比如说,如果我是@ index.php/controller/detail/3
,我点击了Click here to log in
我的网址已更改为index.php/controller/login
,但该网页的内容就像之前一样。此解决方案的第二个问题是,当您使用浏览器的导航按钮返回时,它不会触发拉动该页面的功能,因此在我的会话中,我仍然会将当前视图设置为新页面。
我尝试过的第二件事是放$this->detail(3)
而不是在login
函数中加载视图,只是为了看看它是做什么的。结果与之前相同,我只获取内容,但网址仍为index.php/controller/login
。
最后的词
我希望这是有道理的。感谢大家阅读,请分享您的所有建议。我会期待他们的。
答案 0 :(得分:1)
这是一个简单的问题,即重定向回原始页面&#39;。你是在正确思考它,但是由于误解view
vs redirect()
而失败了。
流程:
用户登陆网址/view/article/what-is-the-best
。他们没有登录,所以他们点击登录按钮,显示登录表单。提交表单并在成功登录后发送到/account/login
。
在此过程中需要更改的内容:
当用户登录时,您需要执行以下操作以捕获他们的referrer
,以便加载 user_agent 并将重定向捕获到您的会话中:
$this->load->library('user_agent');
$this->session->set_userdata('redirect_back', $this->agent->referrer());
完成后,您将拥有一个名为redirect_back
的会话变量,其中包含原始页面URL。
登录后,您执行简单的重定向(不加载视图,因为它保持相同的控制器路径):
redirect( $this->session->userdata('redirect_back') );
你可以添加一些东西来检查你是否也得到了推荐(如果你有一些奇怪的地方你没有抓到一个推荐的网址)。
那应该为你做,在登录前让用户回到原来的位置。