控制器 概述

1.ThinkCMF目前分为两种控制器,前台和后台控制器;
2.无论是前台,还是后台控制器都位于应用的Controller目录下.
3.前台控制器一般继承 Common\Controller\HomebaseController,如果你需要用户登录才访问或操作此控制器,就要继承 Common\Controller\MemberbaseController;

我们来创建一个前台控制器

在Blog应用Controller目录下创建一个IndexController.class.php文件
<?php
namespace Blog\Controller;
use Common\Controller\HomebaseController;class IndexController extends HomebaseController{public function index(){echo "this is blog index !";}
}
访问地址:http://你的域名/?g=blog&m=index&a=index;

只让用户在登录时才能访问此控制器

只需把HomebaseController换成MemberbaseController
<?php
namespace Blog\Controller;
use Common\Controller\MemberbaseController;class IndexController extends MemberbaseController{public function index(){echo "this is blog index !";}
}
这里 IndexController 下的所有方法,用户只能在登录后才能访问,否则会报错,让用户登录;

创建后台控制器

在Blog应用Controller目录下创建一IndexadminController.class.php文件(注意:这里有文件命名规则,以****adminController.class.php或 Admin****Controller.class.php命名的是后台Controller, 在后台菜单导入时会自动识别;)
<?php
namespace Blog\Controller;
use Common\Controller\AdminbaseController;class IndexadminController extends AdminbaseController{public function index(){echo "this is admin controller!";}
}
访问地址:http://你的域名/?g=blog&m=indexadmin&a=index,这里你一定要先登录后台,才能访问;

控制器不用管理员登录也能被访问到

只需给IndexadminController加个空的_initialize()方法
<?php
namespace Blog\Controller;
use Common\Controller\AdminbaseController;class IndexadminController extends AdminbaseController{//初始化,这里不执行父类的初始化方法public function _initialize(){}public function index(){echo "this is admin controller!";}
}

URL生成

URL生成 概述及其演示

1.ThinkCMF遵循ThinkPHP的url生成方法:
2.U方法的定义规则如下(方括号内参数根据实际应用决定):
3.U('地址表达式',['参数'],['伪静态后缀'],['是否显示域名'])
U('Blog/Index/index') // 生成Blog应用Index控制器的index操作的URL地址
U('Portal/Article/index?id=1') // 生成Portal应用Article控制器的index操作 并且参数id为1的URL地址
U('Portal/Article/index',array('id'=>1) // 生成Portal应用Article控制器的index操作 并且参数id为1的URL地址
U('User/index') // 生成当前应用的User控制器的index操作的URL地址

参数

U方法的第二个参数支持数组和字符串两种定义方式,如果只是字符串方式的参数可以在第一个参数中定义,例如:
U('Blog/Index/index',array('cat'=>1,'status'=>1))
U('Blog/Index/index','cat=1&status=1')
U('Blog/Index/index?cat=1&status=1')
添加生成带域名的 url,只要把第四个参数设置为 true
U('Blog/Index/index','cat=1&status=1',true,true)

leuu/UU方法:

为了配合后台设置的 url 美化规则,cmf 增加了 leuu/UU两个方法,UU方法只是 leuu 的别名用法一样;
leuu 的参数列表和 U 方法一样,只是要配合后台设置的 url美化规则才能生效,如没有规则,leuu 其实就是 U 方法;

url的美化规则设置:

进入ThinkCMF后台,设置->网站信息->URL美化
原始网址规则:应用名(小写)/控制器名/操作名?参数 如:portal/list/index?id=1 显示网址:英文字母加数字,不带后缀;

如:

原始网址规则:portal/list/index?id=1
显示网址:casesleuu("portal/list/index",array('id'=>1)) //生成的 url为/cases.html

列出常用的优化方案:

portal/list/index?id=1 news   http://demo.thinkcmf.com/news.html
portal/list/index?id=2 discovery http://demo.thinkcmf.com/discovery.html
portal/page/index?id=2 contacts http://demo.thinkcmf.com/contacts.html
portal/page/index?id=14 about http://demo.thinkcmf.com/about.html
portal/article/index article/:id\d http://demo.thinkcmf.com/article/1.html
portal/list/index list/:id\d http://demo.thinkcmf.com/list/1.html

注意:

进行URL美化之后,要进入ThinkCMF后台,进行清除缓存操作后,刷新前台,才能看到美化效果。

AJAX返回

提供了ajaxReturn方法用于AJAX调用后返回数据给客户端。并且支持JSON、JSONP、XML和EVAL四种方式给客户端接受数据,并且支持配置其他方式的数据格式返回。

ajaxReturn方法调用示例:

$data = 'ok';
$this->ajaxReturn($data);

支持返回数组数据:

$data['status']  = 1;
$data['content'] = 'content';
$this->ajaxReturn($data);

默认配置采用JSON格式返回数据

通过配置DEFAULT_AJAX_RETURN进行设置,我们可以指定格式返回,例如:
// 指定XML格式返回数据
$data['status']  = 1;
$data['content'] = 'content';
$this->ajaxReturn($data,'xml');

返回数据data可以支持字符串、数字和数组、对象,返回客户端的时候根据不同的返回格式进行编码后传输。如果是JSON/JSONP格式,会自动编码成JSON字符串,如果是XML方式,会自动编码成XML字符串,如果是EVAL方式的话,只会输出字符串data数据。

JSON和JSONP的区别

JSON和JSONP虽然只有一个字母的差别,但其实他们根本不是一回事儿:JSON是一种数据交换格式,而JSONP是一种非官方跨域数据交互协议。一个是描述信息的格式,一个是信息传递的约定方法。

默认的JSONP格式返回的处理方法

默认的JSONP格式返回的处理方法是jsonpReturn,如果你采用不同的方法,可以设置:

'DEFAULT_JSONP_HANDLER' =>  'myJsonpReturn', // 默认JSONP格式返回的处理方法

直接在页面中用callback参数来指定。

除了上面四种返回类型外,我们还可以通过行为扩展来增加其他类型的支持,只需要对ajax_return标签位进行行为绑定即可。

跳转和重定向

页面跳转

框架内置了两个跳转方法success和error,用于页面跳转提示,而且可以支持ajax提交
$User = M('User'); //实例化User对象
$result = $User->add($data);
if($result){//设置成功后跳转页面的地址,默认的返回页面是$_SERVER['HTTP_REFERER']$this->success('新增成功', '/User/index');
} else {//错误页面的默认跳转页面是返回前一页,通常不需要设置$this->error('新增失败');
}

success和error方法的第一个参数表示提示信息,第二个参数表示跳转地址,第三个参数是跳转时间(单位为秒),例如:

// 操作完成3秒后跳转到 /Article/index
$this->success('操作完成','/Article/index',3);
// 操作失败5秒后跳转到 /Article/error
$this->error('操作失败','/Article/error',5);

跳转地址是可选的,success方法的默认跳转地址是$_SERVER[“HTTP_REFERER”],error方法的默认跳转地址是javascript:history.back(-1);。

默认的等待时间success方法是1秒,error方法是3秒

success和error方法都可以对应的模板,默认的设置是两个方法对应的模板都是:

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

也可以使用项目内部的模板文件

//默认错误跳转对应的模板文件
'TMPL_ACTION_ERROR' => 'Public:error',
//默认成功跳转对应的模板文件
'TMPL_ACTION_SUCCESS' => 'Public:success',

模板文件可以使用模板标签,并且可以使用下面的模板变量:

success和error方法会自动判断当前请求是否属于Ajax请求,如果属于Ajax请求则会调用ajaxReturn方法返回信息。 ajax方式下面,success和error方法会封装下面的数据返回:

$data['info']   =   $message; // 提示信息内容
$data['status'] =   $status;  // 状态 如果是success是1 error 是0
$data['url']    =   $jumpUrl; // 成功或者错误的跳转地址

重定向

Controller类的redirect方法可以实现页面的重定向功能。
redirect方法的参数用法和U函数的用法一致(参考URL生成部分),例如:

//重定向到New模块的Category操作
$this->redirect('New/category', array('cate_id' => 2), 5, '页面跳转中...');

上面的用法是停留5秒后跳转到New模块的category操作,并且显示页面跳转中字样,重定向后会改变当前的URL地址。

如果你仅仅是想重定向要一个指定的URL地址,而不是到某个模块的操作方法,可以直接使用redirect函数重定向,例如:

//重定向到指定的URL地址
redirect('/New/category/cate_id/2', 5, '页面跳转中...')

Redirect函数的第一个参数是一个URL地址。

控制器的redirect方法和redirect函数的区别在于前者是用URL规则定义跳转地址,后者是一个纯粹的URL地址。

输入变量

在Web开发过程中,我们经常需要获取系统变量或者用户提交的数据,这些变量数据错综复杂,而且一不小心就容易引起安全隐患,但是如果利用好ThinkPHP提供的变量获取功能,就可以轻松的获取和驾驭变量了。

获取变量

虽然你仍然可以在开发过程中使用传统方式获取各种系统变量,例如:

$id    =  $_GET['id']; // 获取get变量
$name  =  $_POST['name'];  // 获取post变量
$value =  $_SESSION['var']; // 获取session变量
$name  =  $_COOKIE['name']; // 获取cookie变量
$file  =  $_SERVER['PHP_SELF']; // 获取server变量

但是我们不建议直接使用传统方式获取,因为没有统一的安全处理机制,后期如果调整的话,改起来会比较麻烦。所以,更好的方式是在框架中统一使用I函数进行变量获取和过滤。
I方法是ThinkPHP用于更加方便和安全的获取系统输入变量,可以用于任何地方,用法格式如下:

I('变量类型.变量名/修饰符',['默认值'],['过滤方法或正则'],['额外数据源'])

变量类型是指请求方式或者输入类型,包括:

注意:变量类型不区分大小写,变量名则严格区分大小写。
默认值和过滤方法均属于可选参数。

我们以GET变量类型为例,说明下I方法的使用:

echo I('get.id'); // 相当于 $_GET['id']
echo I('get.name'); // 相当于 $_GET['name']

支持默认值:

echo I('get.id',0); // 如果不存在$_GET['id'] 则返回0
echo I('get.name',''); // 如果不存在$_GET['name'] 则返回空字符串

采用方法过滤:

// 采用htmlspecialchars方法对$_GET['name'] 进行过滤,如果不存在则返回空字符串
echo I('get.name','','htmlspecialchars'); 

支持直接获取整个变量类型,例如:

// 获取整个$_GET 数组
I('get.'); 

用同样的方式,我们可以获取post或者其他输入类型的变量,例如:

I('post.name','','htmlspecialchars'); // 采用htmlspecialchars方法对$_POST['name'] 进行过滤,如果不存在则返回空字符串
I('session.user_id',0); // 获取$_SESSION['user_id'] 如果不存在则默认为0
I('cookie.'); // 获取整个 $_COOKIE 数组
I('server.REQUEST_METHOD'); // 获取 $_SERVER['REQUEST_METHOD'] 

param变量类型是框架特有的支持自动判断当前请求类型的变量获取方式,例如:

echo I('param.id');

如果当前请求类型是GET,那么等效于 GET[′id′],如果当前请求类型是POST或者PUT,那么相当于获取_GET['id'],如果当前请求类型是POST或者PUT,那么相当于获取 _POST[‘id’] 或者 PUT参数id。

由于param类型是I函数默认获取的变量类型,因此事实上param变量类型的写法可以简化为:

I('id'); // 等同于 I('param.id')
I('name'); // 等同于 I('param.name')

path类型变量可以用于获取URL参数(必须是PATHINFO模式参数有效,无论是GET还是POST方式都有效),例如: 当前访问URL地址是 http://serverName/index.php/New/2013/06/01
那么我们可以通过

echo I('path.1'); // 输出2013
echo I('path.2'); // 输出06
echo I('path.3'); // 输出01

data类型变量可以用于获取不支持的变量类型的读取,例如:

I('data.file1','','',$_FILES);

变量过滤

如果你没有在调用I函数的时候指定过滤方法的话,系统会采用默认的过滤机制(由DEFAULT_FILTER配置),事实上,该参数的默认设置是:

// 系统默认的变量过滤机制
'DEFAULT_FILTER'        => 'htmlspecialchars'

也就说,I方法的所有获取变量如果没有设置过滤方法的话都会进行htmlspecialchars过滤,那么:

// 等同于 htmlspecialchars($_GET['name'])
I('get.name'); 

同样,该参数也可以设置支持多个过滤,例如:

'DEFAULT_FILTER'        => 'strip_tags,htmlspecialchars'

设置后,我们在使用:

// 等同于 htmlspecialchars(strip_tags($_GET['name']))
I('get.name'); 

如果我们在使用I方法的时候 指定了过滤方法,那么就会忽略DEFAULT_FILTER的设置,例如:

// 等同于 strip_tags($_GET['name'])
echo I('get.name','','strip_tags'); 

I方法的第三个参数如果传入函数名,则表示调用该函数对变量进行过滤并返回(在变量是数组的情况下自动使用array_map进行过滤处理),否则会调用PHP内置的filter_var方法进行过滤处理,例如:

I('post.email','',FILTER_VALIDATE_EMAIL);

表示 会对$_POST[‘email’] 进行 格式验证,如果不符合要求的话,返回空字符串。 (关于更多的验证格式,可以参考 官方手册的filter_var用法。) 或者可以用下面的字符标识方式:

I('post.email','','email');

可以支持的过滤名称必须是filter_list方法中的有效值(不同的服务器环境可能有所不同),可能支持的包括:

int
boolean
float
validate_regexp
validate_url
validate_email
validate_ip
string
stripped
encoded
special_chars
unsafe_raw
email
url
number_int
number_float
magic_quotes
callback

还可以支持进行正则匹配过滤,例如:

// 采用正则表达式进行变量过滤
I('get.name','','/^[A-Za-z]+$/');
I('get.id',0,'/^\d+$/');

如果正则匹配不通过的话,则返回默认值。
在有些特殊的情况下,我们不希望进行任何过滤,即使DEFAULT_FILTER已经有所设置,可以使用:

// 下面两种方式都不采用任何过滤方法
I('get.name','','');
I('get.id','',false);

一旦过滤参数设置为空字符串或者false,即表示不再进行任何的过滤。

变量修饰符

最新版本的I函数支持对变量使用修饰符功能,可以更方便的通过类型过滤变量。

用法如下:

I('变量类型.变量名/修饰符')

例如:

I('get.id/d'); // 强制变量转换为整型
I('post.name/s'); // 强制转换变量为字符串类型
I('post.ids/a'); // 强制变量转换为数组类型

可以使用的修饰符包括:

Thinkcmf框架 -控制器 -3相关推荐

  1. laravel mysql 视图_Laravel框架控制器,视图及模型操作图文详解

    本文实例讲述了Laravel框架控制器,视图及模型操作.分享给大家供大家参考,具体如下: 鉴于上一篇Laravel框架下载,安装及路由操作我们讲到了路由,可能大家会觉得路由这个东西无所不,可路由这个东 ...

  2. ThinkCMF框架审核详细更新列表操作

    在ThinkCMF框架中,我们在点击一个列表中的一条进入详细,做了[审核][驳回]类似的状态更新,然后列表没有变化. ThinkCMF的后台页面构造是一个父层页面,生成多个动态iframe.其实每个i ...

  3. PHP中间件 middleware,Laravel框架控制器的middleware中间件用法分析

    本文实例讲述了Laravel框架控制器的middleware中间件用法.分享给大家供大家参考,具体如下: 场景:活动开始前只能访问宣传页面,开始后才可以访问其他页面: 步骤: 新建中间件, 注册中间件 ...

  4. ThinkCMF框架任意内容包含漏洞

    ThinkCMF简介 ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建.ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发 ...

  5. php调用其它控制器,TP框架控制器里面怎么调用另一个控制器的代码

    我网站TP框架,一个前台D:\WWW\User\Home\Controller\CommonController.class文件,一个后台D:\WWW\snadmin\Home\ControllerC ...

  6. php框架控制器是什么意思,控制器定义

    # 控制器的定义 HYPHP控制器采用了OOP方式进行访问调用. 控制器就是一个类, 而操作方法则是一个类成员函数 下面是一个默认的 **/Action/Index.php** 内容 ~~~ name ...

  7. 3、Eternal框架-控制器

    2019独角兽企业重金招聘Python工程师标准>>> 介绍 MVC:Model-View-Controller,包括三类对象,Model模型对象.View视图表示.Controll ...

  8. thinkphp漏洞_【组件攻击链】ThinkCMF 高危漏洞分析与利用

    一.组件介绍 1.1 基本信息 ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架.ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发者可以根据自身的需求以应用的形 ...

  9. Thinkcmf - 微信公众号开发 -1

    .css.js 等样式的引入路径是: ThinkCMF\themes\simplebootx\Blog\Index\ PS:路径从ThinkCMF框架的根目录开始,一直到应用结束.如下图: 框架内ht ...

最新文章

  1. java中一些对象(po,vo,dao,pojo)等的解释
  2. python 怎么在一行获取多个数字
  3. 2017 9月java答案_2017年9月计算机二级JAVA试题及答案
  4. ABAP help click F1
  5. platform(win32) 错误
  6. 指针c语言求电阻的并联值,计算电阻使之符合要求值,,“简单”的难题!!!...
  7. 【VMCloud云平台】SCDPM(四)如何保护数据库(一)
  8. 基于Word2vec文本聚类
  9. 应变计测轴扭矩 计算
  10. 练习1000 scanf 用法
  11. Efficient polynomial commitment schemes for multiple points and polynomials学习笔记
  12. 苹果手机几月份最便宜_苹果手机越来越便宜,安卓手机越来越贵,果真是这样吗?...
  13. 中文拼写纠错_一种中文拼写检查方法与流程
  14. 数据分析您需要一个现代化的数据仓库
  15. contentprovider踩坑之路之Failed to find provider info for com.example.app.provider和cursor=null空指针问题
  16. 基于单片机的超市储物柜设计_一种基于at89c51单片机的超市寄存装置的制造方法...
  17. Hadoop实战 一 WordCount
  18. android 设备驱动 位置,android中各个部件驱动在源码中的位置
  19. Lit vs React
  20. 连接器模具复杂吗?连接器模具要注意什么?

热门文章

  1. DDR工作原理-DQ和DQS信号的处理
  2. 【清风数学建模笔记】第七讲 多元回归分析
  3. WorldWind学习系列十五:如何切割影像和DEM数据及其在WW中的应用配置
  4. 如何使用c语言获取麦克风信息,[C#] 如何获取麦克风采集的音频信息 和 如何根据波形播放声音。...
  5. swift3新路程(11)错误处理(Error Handling)
  6. 盘点最高调薪行业 年薪过万要几年
  7. 单一样本T检验实例(用统计软件SPSS16.0实现)
  8. 简单的水稻叶龄识别!
  9. 国家高新技术资格考试osta证书是什么样的?
  10. 【原创】vegas8.0光效插件