codeigniter:如何在登录到当前控制器后重定向(常规php中的php_self)

Chr*_*phe 9 redirect login codeigniter

好吧,这不是一个真正的问题,但我检查用户是否存在并将其登录并重定向到site/members_area,但我不想将用户发送到特定页面,但我想重新加载当前控制器.所以如果我登录index/home我想重定向到index/home,我该怎么办?

在常规的PHP我会把动作重定向到当前页面

<?php echo $_SERVER['PHP_SELF']; ?>
Run Code Online (Sandbox Code Playgroud)

这是框架中的代码

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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

bsc*_*fer 15

我通过在标题中总是提交一个登录控制器的登录表单来解决这个问题,但问题是标题登录表单(出现在每个页面上)总是有一个名为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>
Run Code Online (Sandbox Code Playgroud)

登录控制器表格

<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>
Run Code Online (Sandbox Code Playgroud)

最好的部分是您继续将重定向设置为失败,并且只有在您从其他位置登录时才会设置重定向输入.

控制器

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");
}
Run Code Online (Sandbox Code Playgroud)

这里发生的是这样的:

  1. 用户登录其他页面.
  2. 登录表单提交给单个登录控制器,其中包含一个隐藏的输入元素,表明他们从哪里登录.
  3. 登录控制器处理登录,然后根据输入重定向.
  4. 登录失败后,重定向将再次设置,因此无论如何,用户都将返回原始页面.

这只是一个基本的例子.您可以根据需要调整它.


rkj*_*rkj 10

你可以这样做.记得加载会话库和url帮助器.

$this->session->set_flashdata('redirectToCurrent', current_url());
Run Code Online (Sandbox Code Playgroud)

使用以下命令传递上述flashdata以及登录和重定向:

redirect($this->session->flashdata('redirectToCurrent'));
Run Code Online (Sandbox Code Playgroud)