控制器[2]

三. 跳转和重定向

ThinkPHP 在操作数据库时,需要跳转和重定向页面。ThinkPHP 提供了一组方法来解
决了这个问题。

在 WeiBo/Home/Controller/UserController.class.php 中的代码如下:


 1 <?php
 2 
 3 namespace Home\Controller;
 4 use Think\Controller;
 5 
 6 class UserController extends Controller {
 7         public function index() {
 8             $flag=ture;
 9             if($flag) {
10                 //会跳转到:http://localhost/demo39/User/all
11                  $this->success('跳转成功','./User/all');
12              }else {
13                  //会跳转到本页的上一页
14                  $this->error('跳转失败');
15              }
16         }    
17         public function all() {
18             echo "这里是跳转的页面";
19         }
20 }

在浏览器的地址栏输入: http://localhost/demo39/User/ 后出现如下图:

3秒过后:

注意:在 $this->error('跳转失败'); 中发现跳转失败后,会跳转到前一个页面,此时,如果前一个页面是 www.baidu.com ,

然后在上面的代码中的 $flag=false; 然后在浏览器的地址栏中输入 http://localhost/demo39/User/ ,然后它跳转到的

页面是 www.baidu.com 。

PS:success()方法和 error()方法,第一个参数是提示信息、第二个跳转的地址、
第三个跳转时间。默认情况下 success()方法是 1 秒,error()方法是 3 秒。

1 //设置5秒
2 $this->success('新增成功!', 'list', 5);

 

success()方法和 error()方法,跳转的时候就对应了相应的模版,默认如下:

1 //默认错误跳转对应的模板文件
2 'TMPL_ACTION_ERROR' =>THINK_PATH .'Tpl/dispatch_jump.tpl',
3 //默认成功跳转对应的模板文件
4 'TMPL_ACTION_SUCCESS'=>THINK_PATH.'Tpl/dispatch_jump.tpl',

 Tpl/dispatch_jump.tpl 的路径为: WeiBo/ThinkPHP/Tpl/dispatch_jump.tpl 

自定义成功和错误提示模版页面

在 WeiBo/Common/Conf/config.php 中配置:

1 'TMPL_ACTION_SUCCESS'=>'Public/success',
2 'TMPL_ACTION_ERROR'=>'Public/error',

此时,引用的 Public/success 文件在 WeiBo/Home/View/Public/success.html 下;

这时 success.html 里的跳转函数以及定时函数可参考 dispatch_jump.tpl 中的代码来编写;

 

对于自定义的提示模版,ThinkPHP 提供了一组变量可供使用。

变量 含义
$msgTitle 操作标题
$message 页面提示信息
$status 操作状态 1 表示成功 0 表示失败
$waitSecond  跳转等待时间,单位为秒
$jumpUrl  跳转页面地址

 

 

//模版中使用提示变量
操作标题:{$msgTitle}<br />
页面提示信息:{$message}<br />
操作状态:{$status}<br />
跳转等待时间:{$waitSecond}<br />
页面跳转地址:{$jumpUrl}

 

PS:如果对于数据库操作,采用了 Ajax 方式,那么 success()和 error()会自动
ajaxReturn()方法返回数据提供调用。

ThinkPHP 还单独提供了重定向方法 redirect(),参数和 U()方法一样。这个方法使
用的是 URL 规则。

1 $this->redirect('User/test',  array('id'=>5), 5, '页面跳转中...');

如果只是想纯粹的 URL 跳转,不去使用 URL 规则,那么直接使用 redirect()函数。

1 redirect('http://www.baidu.com', 5, '页面跳转中...');

 

四. 输入变量

 

我们在获取系统变量或者用户提交的数据时,这些变量数据错综复杂,一不小心就容易
引擎安全隐患,所以,ThinkPHP 提供了轻松和安全获取变量的解决方案。

1 //常规获取变量方式
2 $id = $_GET['id']; //获取get变量
3 $name = $_POST['name']; //获取post变量
4 $value = $_SESSION['var']; //获取session变量
5 $name = $_COOKIE['name']; //获取cookie变量
6 $file = $_SERVER['PHP_SELF']; //获取 server 变量

在 WeiBo/Home/Controller/UserController.class.php 中代码如下所示:

 1 <?php
 2 
 3 namespace Home\Controller;
 4 use Think\Controller;
 5 
 6 class UserController extends Controller {
 7         public function index($id,$type) {
 8             echo 'id:'.$id.',type:'.$type;
 9             
10         }
11 }

这时因为在 WeiBo/Common/Conf/config.php 中配置了 'URL_PARAMS_BIND_TYPE'=>1, 所以在浏览器地址中输入: http://localhost/demo39/user/index/2/3 

得到 id:2,type:3 ,如果去掉在 WeiBo/Common/Conf/config.php 中对url中元素顺序的绑定,这时在地址栏中输入 http://localhost/demo39/user/index/2/3  

会出现:

这时在地址栏必须输入: http://localhost/demo39/user/index/id/2/type/3 才能得到 id:2,type:3 

PS:在 ThinkPHP 中,我们不再建议直接使用传统方式获取,因为没有统一的安全处理
机制,后期调整也会比较麻烦。所以,ThinkPHP 提供 I()方法进行变量的获取和过滤。

I()方法的格式:I('变量类型.变量名',['默认值'],['过滤方法'])

 

变量类型 含义
get 获取 GET 参数
post 获取 POST 参数
param  自动判断请求类型获取 GET、POST 或者 PUT 参数
request  获取 REQUEST 参数
put 获取 PUT 参数
session  获取$_SESSION 参数
cookie  获取$_COOKIE 参数
server  获取$_SERVER 参数
globals  获取$GLOBALS 参数

在 WeiBo/Home/Controller/UserController.class.php 中写入如下代码:

 1 <?php
 2 
 3 namespace Home\Controller;
 4 use Think\Controller;
 5 
 6 class UserController extends Controller {
 7         public function index() {
 8             echo I('get.id');            
 9         }
10 }

在浏览器地址栏中输入: http://localhost/demo39/user/index/id/2 ,输出为:2

如果没有在 config.php 中配置 'URL_PARAMS_BIND_TYPE'=>1, 则url中的id不能省去。

1 //$_GET['id']没有值,则默认1
2  echo I('get.id', 1);
1 //过滤$_GET['id']
2  echo I('get.id', '', 'md5');

此时输出用md5加密的 get.id 值。

1 //获取$_GET;
2 print_r(I('get.'));

PS:其他几个系统变量均采用以上方式

 

ThinkPHP 还提供了一个自动识别各种系统变量类型的接受方法:param

1 //param变量自动判断变量类型
2  echo I('param.id');
3 //param可以省略
4  echo I('id');

 

如果是 PATHINFO 模式的 URL,param 也可以接收。

1 //param获取URL所有参数
2 print_r(I('param.0'));

PS:取消和开启 URL 的'URL_PARAMS_BIND_TYPE'=>1 配置定义,在访问这个 URL 的
时候结果有所不同:http://localhost/demo39/User/index/id/5/type/a

1 关闭 URL 传参顺序:Array ( [id] => 5 [type] => a )
2 开启 URL 传参顺序:Array ( [0] => id [1] => 5 [2] => type [3] => a )
1 //param获取指定参数值
2  echo I('param.id');
3  echo I('param.type');

 

默认情况下,I()的默认过滤是: htmlspecialchars ,过滤掉 HTML。

1 //过滤HTML,如果去掉了,则传递包含HTML的字符串,将不过滤
2 'DEFAULT_FILTER'=>'htmlspecialchars',

当然,如果不过滤,也可以在程序中过滤。

1 //设置过滤函数,会忽略配置文件里的设置
2  echo I('get.id', '', 'htmlspecialchars');

如果系统设置了默认的过滤,本身某个函数又不想过滤,那么可以这么处理:

1 //设置屏蔽系统默认过滤
2  echo I('get.id','',  false); //第三参数为空字符串均可

 

什么才是过滤?

如果在 WeiBo/Common/Conf/config.php 中没有配置 'DEFAULT_FILTER'=>'htmlspecialchars', 则,当url为

 http://localhost/demo39/user/index?id=<b style="font-size:200px">5</b> ,则输出为: <b style="font-size:200px">5</b> ,

配置了 'DEFAULT_FILTER'=>'htmlspecialchars', 结果还是 <b style="font-size:200px">5</b>  ,因为I()的默认过滤是: htmlspecialchars ,

这时如果在 WeiBo/Home/Controller/UserController.class.php 中的输出代码为echo I('get.id','', false); ,则输出为字体大小

 

五.请求类型

ThinkPHP 提供了一组常量来判断当前请求是否是 GET、POST 等。通过判断请求处理
不同的业务逻辑。

常量 含义
IS_GET 判断是否 GET 提交请求
IS_POST  判断是否 POST 提交请求
IS_PUT  判断是否 PUT 提交请求
IS_DELTE  判断是否 DELETE 提交请求
IS_AJAX  判断是否 AJAX 提交请求

 

1 //判断是否GET请求
2  if (IS_GET) {
3  echo '是GET请求';
4 } else {
5  echo '不是GET请求';
6 }

 默认的 IS_GET 是1, IS_POST 是空, IS_AJAX  需要加入jquery文件才能判定是否是 IS_AJAX  

posted @ 2015-06-16 23:24  todaytoday  阅读(210)  评论(0编辑  收藏  举报