在调用函数后保留原始URI的最佳做法是什么?

时间:2013-12-30 00:25:27

标签: php codeigniter codeigniter-url codeigniter-routing

目标

当我使用任何网址时,我会使用loginlogoutpost_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

最后的词

我希望这是有道理的。感谢大家阅读,请分享您的所有建议。我会期待他们的。

1 个答案:

答案 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') );

你可以添加一些东西来检查你是否也得到了推荐(如果你有一些奇怪的地方你没有抓到一个推荐的网址)。

那应该为你做,在登录前让用户回到原来的位置。