Как лучше сохранять оригинальный 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') );

Вы можете добавить что-то, чтобы проверить, что вы тоже получили ссылку (в случае некоторой странности, когда вы не ловите ссылающуюся ссылку).

Это должно сделать это для вас, но вернуть пользователя к исходному месту до входа в систему.

Другие вопросы по тегам