php怎么写笑脸跳转界面,ThinkPHP中U()和redirect()还有success()三个跳转方法有什么区别??...

在此之前我要纠正一下你的描述,U这个不叫方法,叫函数。

关于这三者的区别,我们可以看下thinkphp的源代码。

U函数

/**

* URL组装 支持不同URL模式

* @param string $url URL表达式,格式:'[模块/控制器/操作#锚点@域名]?参数1=值1&参数2=值2...'

* @param string|array $vars 传入的参数,支持数组和字符串

* @param string|boolean $suffix 伪静态后缀,默认为true表示获取配置值

* @param boolean $domain 是否显示域名

* @return string

*/

function U($url = '', $vars = '', $suffix = true, $domain = false)

{

//省略

}

其实他的注释已经说的很清楚了,返回值是一个string类型,其实返回的是生成的网址。

他不是一个动作,只是一个辅助函数而已。

success方法

/**

* 操作错误跳转的快捷方法

* @access protected

* @param string $message 错误信息

* @param string $jumpUrl 页面跳转地址

* @param mixed $ajax 是否为Ajax方式 当数字时指定跳转时间

* @return void

*/

protected function error($message = '', $jumpUrl = '', $ajax = false)

{

$this->dispatchJump($message, 0, $jumpUrl, $ajax);

}

/**

* 操作成功跳转的快捷方法

* @access protected

* @param string $message 提示信息

* @param string $jumpUrl 页面跳转地址

* @param mixed $ajax 是否为Ajax方式 当数字时指定跳转时间

* @return void

*/

protected function success($message = '', $jumpUrl = '', $ajax = false)

{

$this->dispatchJump($message, 1, $jumpUrl, $ajax);

}

这里可以很明显的看到,success和error都是封装的dispatchJump方法,区别是第二个参数。

我们再去dispatchJump看看。

/**

* 默认跳转操作 支持错误导向和正确跳转

* 调用模板显示 默认为public目录下面的success页面

* 提示页面为可配置 支持模板标签

* @param string $message 提示信息

* @param Boolean $status 状态

* @param string $jumpUrl 页面跳转地址

* @param mixed $ajax 是否为Ajax方式 当数字时指定跳转时间

* @access private

* @return void

*/

private function dispatchJump($message, $status = 1, $jumpUrl = '', $ajax = false)

{

if (true === $ajax || IS_AJAX) {

// AJAX提交

$data = is_array($ajax) ? $ajax : array();

$data['info'] = $message;

$data['status'] = $status;

$data['url'] = $jumpUrl;

$this->ajaxReturn($data);

}

if (is_int($ajax)) {

$this->assign('waitSecond', $ajax);

}

if (!empty($jumpUrl)) {

$this->assign('jumpUrl', $jumpUrl);

}

// 提示标题

$this->assign('msgTitle', $status ? L('_OPERATION_SUCCESS_') : L('_OPERATION_FAIL_'));

//如果设置了关闭窗口,则提示完毕后自动关闭窗口

if ($this->get('closeWin')) {

$this->assign('jumpUrl', 'javascript:window.close();');

}

$this->assign('status', $status); // 状态

//保证输出不受静态缓存影响

C('HTML_CACHE_ON', false);

if ($status) {

//发送成功信息

$this->assign('message', $message); // 提示信息

// 成功操作后默认停留1秒

if (!isset($this->waitSecond)) {

$this->assign('waitSecond', '1');

}

// 默认操作成功自动返回操作前页面

if (!isset($this->jumpUrl)) {

$this->assign("jumpUrl", $_SERVER["HTTP_REFERER"]);

}

$this->display(C('TMPL_ACTION_SUCCESS'));

} else {

$this->assign('error', $message); // 提示信息

//发生错误时候默认停留3秒

if (!isset($this->waitSecond)) {

$this->assign('waitSecond', '3');

}

// 默认发生错误的话自动返回上页

if (!isset($this->jumpUrl)) {

$this->assign('jumpUrl', "javascript:history.back(-1);");

}

$this->display(C('TMPL_ACTION_ERROR'));

// 中止执行 避免出错后继续执行

exit;

}

}

我们看到了,这里面没有任何关于跳转的代码,只是装载了模板,注册了几个模板变量并显示而已。

那么它是在哪里跳转的呢?显而易见地,是在模板上。我们去默认模板看看:

(function(){

var wait = document.getElementById('wait'),href = document.getElementById('href').href;

var interval = setInterval(function(){

var time = --wait.innerHTML;

if(time <= 0) {

location.href = href;

clearInterval(interval);

};

}, 1000);

})();

可以看到,是通过javascript的location.href进行的跳转。即他是客户端实现的跳转。

redirect 方法

/**

* Action跳转(URL重定向) 支持指定模块和延时跳转

* @access protected

* @param string $url 跳转的URL表达式

* @param array $params 其它URL参数

* @param integer $delay 延时跳转的时间 单位为秒

* @param string $msg 跳转提示信息

* @return void

*/

protected function redirect($url, $params = array(), $delay = 0, $msg = '')

{

$url = U($url, $params);

redirect($url, $delay, $msg);

}

我们可以看到,redirect方法先是用U函数获取了地址做参数,传给了redirect函数。是对这个函数的封装。

我们再去redirect函数看看。

/**

* URL重定向

* @param string $url 重定向的URL地址

* @param integer $time 重定向的等待时间(秒)

* @param string $msg 重定向前的提示信息

* @return void

*/

function redirect($url, $time = 0, $msg = '')

{

//多行URL地址支持

$url = str_replace(array("\n", "\r"), '', $url);

if (empty($msg)) {

$msg = "系统将在{$time}秒之后自动跳转到{$url}!";

}

if (!headers_sent()) {

// redirect

if (0 === $time) {

header('Location: ' . $url);

} else {

header("refresh:{$time};url={$url}");

echo ($msg);

}

exit();

} else {

$str = "";

if (0 != $time) {

$str .= $msg;

}

exit($str);

}

}

可以看到一个很短的函数,有两种服务端跳转方式,分别用于是否已输出了http头部的情况。是服务端的跳转。

总结

U函数只会用来生成一个url,不会执行跳转。

success方法本身不会跳转,而是因为默认的模板上有跳转的javascript代码。

redirect方法是调用的服务端函数进行的跳转。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值