codeigniter: как перенаправить после входа в текущий контроллер (php_self в обычном php) - PullRequest
9 голосов
/ 16 апреля 2010

Ну, это на самом деле не проблема, но я проверяю, существует ли пользователь, и регистрирую его и перенаправляю на site / members_area, но я не хочу отправлять пользователя на определенную страницу, но хочу перезагрузить текущий контроллер. Так что, если я войду в index / home, я бы хотел, чтобы меня перенаправили в index / home, как мне поступить?

в обычном php я бы включил в действие перенаправление на текущую страницу

<?php echo $_SERVER['PHP_SELF']; ?>

Это код в рамках

function validate_credentials()
    {       
        $this->load->model('membership_model');
        $query = $this->membership_model->validate();

        if($query) // if the user's credentials validated...
        {
            $data = array(
                'username' => $this->input->post('username'),
                'is_logged_in' => true
            );
            $this->session->set_userdata($data);
            redirect('site/members_area'); //<-- this line here should be dynamic
        }
        else // incorrect username or password
        {
            $this->index();
        }
    }

Ответы [ 3 ]

15 голосов
/ 14 мая 2010

Я решил эту проблему сам, имея форму входа в систему в заголовке, которая всегда отправляется на один контроллер входа, но суть в том, что форма входа в систему в заголовке (которая появляется на каждой странице) всегда имеет скрытый ввод, называемый redirect, который фактически контроллер входа захватывает ...

Вот базовая настройка (убедитесь, что помощник URL загружен):

Форма входа в заголовок

<form action="/login" method="post">
    <input type="hidden" name="redirect" value="<?php echo current_url(); ?>" />
    <input type="text" name="username" value=""  />
    <input type="password" name="password" value=""  />
    <input type="submit" name="login" value="Login" id="submit">
</form>

Форма контроллера входа в систему

<form id="login" action="" method="post">
    <input type="text" name="username" id="username" value="" />
    <input type="password" name="password" id="password" value=""/>

    <?php if(isset($_POST['redirect'])) : ?>
    <input type="hidden" name="redirect" value="<?php echo $_POST['redirect']; ?>" />
    <?php endif; ?>

    <input type="submit" name="login" id="submit" value="Login" />  
</form>

Самое приятное то, что вы продолжаете устанавливать перенаправление при сбое, а вход перенаправления устанавливается только в том случае, если вы входите откуда-то еще.

Контроллер

function index()
{
    if( ! $this->form_validation->run())
    {
        // do your error handling thing
    }
    else
    {
        // log the user in, then redirect accordingly
        $this->_redirect();
    }   
}

function _redirect()
{
    // Is there a redirect to handle?
    if( ! isset($_POST['redirect']))
    {
        redirect("site/members_area", "location");
        return;
    }

    // Basic check to make sure we aren't redirecting to the login page
    // current_url would be your login controller
    if($_POST['redirect'] === current_url())
    {
        redirect("site/members_area", "location");
        return;
    }

    redirect($_POST['redirect'], "location");
}

Что здесь происходит, это:

  1. Вход пользователя на другую страницу.
  2. Форма входа отправляется на один контроллер входа со скрытым элементом ввода, в котором указывается, откуда они входят.
  3. Контроллер входа обрабатывает вход в систему, а затем перенаправляет на основе ввода.
  4. При неудачном входе в систему перенаправление снова устанавливается, поэтому, несмотря ни на что, пользователь вернется на исходную страницу.

Это просто базовый пример. Очевидно, вы можете настроить его по мере необходимости.

10 голосов
/ 16 апреля 2010

Вы можете сделать это так. Не забудьте загрузить библиотеку сеансов и URL-помощник.

$this->session->set_flashdata('redirectToCurrent', current_url());

Передайте вышеуказанные flashdata вместе с логином и перенаправьте, используя:

redirect($this->session->flashdata('redirectToCurrent'));
2 голосов
/ 16 апреля 2010

Я уверен, что может быть лучший способ, но способ, которым я делаю это, когда проверка, вошел ли пользователь в систему, терпит неудачу, я использую $this->session->set_flashdata('redirect_url', current_url());, а затем передаю его вместе с формой входа, чтобы я знал, где перенаправить пользователя обратно на.

Как я уже сказал, я уверен, что есть более чистый способ сделать это, но мне определенно не нравится $_SERVER['HTTP_REFERER'];, поскольку этому нельзя доверять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...