Как лучше сохранять оригинальный URI после вызова функции?
Цель:
Когда я нахожусь на любой URL, и я использую функции, такие как login
, logout
, post_Comment
и т. д. Я хочу, чтобы URL оставался нетронутым.
Пример:
Немного частей кода будет написано в псевдокоде, просто чтобы дать простой пример того, что делается внутри функции. Все, что важно для моего вопроса, будет в актуальном синтаксисе.
контроллер
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
мой URL изменился на index.php/controller/login
, но содержимое страницы было так же, как и раньше. Вторая проблема, связанная с этим решением, заключается в том, что когда вы возвращаетесь назад, используя кнопку навигации браузера, это не вызовет функцию, которая перетаскивает эту страницу, и поэтому в моем сеансе у меня все еще будет текущее представление, настроенное на новую страницу.
Второе, что я попробовал, это положить $this->detail(3)
вместо загрузки вида внутри login
функция, просто чтобы увидеть, что это делает. Результат такой же, как и раньше, я только получаю содержимое, но URL все еще index.php/controller/login
,
Последнее слово
Я надеюсь, что это имело смысл. Спасибо всем за прочтение и, пожалуйста, поделитесь всеми своими предложениями. Я буду с нетерпением ждать их.
1 ответ
Ну, это простая проблема "перенаправления обратно на исходную страницу". Вы продумываете это правильно, но не понимаете view
против redirect()
,
Процесс:
Пользователь попадает на URL /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') );
Вы можете добавить что-то, чтобы проверить, что вы тоже получили ссылку (в случае некоторой странности, когда вы не ловите ссылающуюся ссылку).
Это должно сделать это для вас, но вернуть пользователя к исходному месту до входа в систему.