原生php及thinkphp中的页面跳转方法总结

 

 

1,PHP的header()函数,可以实现页面跳转,如

header("Location: " . $url);

但它有个缺点,一旦HTTP报头块已经发送,就不能使用 header() 函数,来发送其它的标头。

这个时候只能利用前端HTML或JS技术来实现页面跳转了!

怎样知道HTTP报头块已经发送了呢?

PHP的 headers_sent() 函数,可以帮忙。

PHP headers_sent() 函数

headers_sent() 函数检查 HTTP 标头是否已被发送以及在哪里被发送。

如果报头已发送,则返回 true,否则返回 false。

语法

headers_sent(file,line)

  1. // 如果报头未发送,则发送一个

  2. if (!headers_sent()) {

  3. header("Location: http://www.w3school.com.cn/");

  4. exit;

  5. }

  6. ?>

function redirect($url, $time = 0, $msg = '') {
    $url = str_replace(array("\n", "\r"), '', $url); // 多行URL地址支持
    if (empty($msg)) {
        $msg = "系统将在 {$time}秒 之后自动跳转到 {$url} !";
    }
    if (headers_sent()) {
        $str = "";
        if ($time != 0) {
            $str .= $msg;
        }
        exit($str);
    } else {
        if (0 === $time) {
            header("Location: " . $url);
        } else {
            header("Content-type: text/html; charset=utf-8");
            header("refresh:{$time};url={$url}");
            echo($msg);
        }
        exit();
    }
}
原文参考:https://blog.csdn.net/qq_16619037/article/details/51094133

 

thinkphp中的页面跳转:

if($user=='admin' && $pwd=='123'){
//            如果成功则跳到index/index页面
            $this->success('登陆成功',url('/index/index'));
        }else{
            $this->error('登陆失败');
        }

系统的success方法说明

 /**
     * 操作成功跳转的快捷方法
     * @access protected
     * @param mixed  $msg    提示信息
     * @param string $url    跳转的 URL 地址
     * @param mixed  $data   返回的数据
     * @param int    $wait   跳转等待时间
     * @param array  $header 发送的 Header 信息
     * @return void
     * @throws HttpResponseException
     */
    protected function success($msg = '', $url = null, $data = '', $wait = 3, array $header = [])
    {}

跳转成功的页面效果:success()方法会有一个等待时间的界面,然后跳到/index/index,同样error()方法同样有个等待界面 

原生php及thinkphp中的页面跳转方法总结_第1张图片

修改跳转界面 上面显示登陆成功的界面可能不符合我们的需求,所以需要修改一下这个模板界面 
1.修改模板界面,首先需要找到这个模板界面,打开config.php我们可以看到有下面两行代码

// 默认跳转页面对应的模板文件
    'dispatch_success_tmpl'  => THINK_PATH . 'tpl' . DS . 'dispatch_jump.tpl',    //成功跳转的界面
    'dispatch_error_tmpl'    => THINK_PATH . 'tpl' . DS . 'dispatch_jump.tpl',    //失败跳转的界面

通过上面的代码我们可以看出,不管是成功跳转还是失败跳转,他都是同一个界面,dispatch_jump.tpl,我们通过目录thinkphp\tpl\dispatch_jump.tpl找到这个文件 
然后修改文件的代码,下面我贴出关键的信息


       
           
           

:)


           
           
           


           
           
           

:(


           
           
           


           
       

2.修改配置文件,修改为自己写的界面,我们在thinkphp\tpl目录下新建两个文件,一个success.tpl和一个error.tpl文件,修改config.php下面的配置代码

//原来指定的路径
// 默认跳转页面对应的模板文件
    'dispatch_success_tmpl'  => THINK_PATH . 'tpl' . DS . 'dispatch_jump.tpl',
    'dispatch_error_tmpl'    => THINK_PATH . 'tpl' . DS . 'dispatch_jump.tpl'

//修改为自定义的文件路径
     'dispatch_success_tmpl'  => THINK_PATH . 'tpl' . DS . 'success.tpl',
     'dispatch_error_tmpl'    => THINK_PATH . 'tpl' . DS . 'error.tpl'

重定向

\think\Controller类的redirect方法可以实现页面的重定向功能。

redirect方法的参数用法和Url::build方法的用法一致(参考URL生成部分),例如:

//重定向到News模块的Category操作
$this->redirect('News/category', ['cate_id' => 2]);

上面的用法是跳转到News模块的category操作,重定向后会改变当前的URL地址。

或者直接重定向到一个指定的外部URL地址,例如:

//重定向到指定的URL地址 并且使用302
$this->redirect('http://thinkphp.cn/blog/2',302);

可以在重定向的时候通过session闪存数据传值,例如

$this->redirect('News/category', ['cate_id' => 2], 302, ['data' => 'hello']);

使用redirect助手函数还可以实现更多的功能,例如可以记住当前的URL后跳转

redirect('News/category')->remember();

需要跳转到上次记住的URL的时候使用:

redirect()->restore();

ThinkPHP redirect 方法:

ThinkPHP redirect 方法可以实现页面的重定向(跳转)功能。redirect 方法语法如下:

$this->redirect(string url, array params, int delay, string msg) 

原生php及thinkphp中的页面跳转方法总结_第2张图片

一些常用的 redirect 重定向例子:

// 不延时,直接重定向
$this->redirect('select', array('status'=>1));
// 延时跳转,但不带参数,输出默认提示
$this->redirect('select', '', 3);
// 重定向到其他模块操作
$this->redirect('Public/login');
// 重定向到其他分组
$this->redirect('Admin-Public/login');
提示:
当延时跳转时,必须输入 params 参数(可以为空),也就是 delay 必须出现在第 3 位上。
如果发现跳转后的 URL 有问题,由于 redirect 方法调用 U 方法来生成跳转后的地址,这时候可以测试一下 U 方法生成的地址是否正确,再检查一下系统配置。
 

你可能感兴趣的:(php开发)