Thinkcmf框架 -控制器 -3
控制器 概述
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相关推荐
- laravel mysql 视图_Laravel框架控制器,视图及模型操作图文详解
本文实例讲述了Laravel框架控制器,视图及模型操作.分享给大家供大家参考,具体如下: 鉴于上一篇Laravel框架下载,安装及路由操作我们讲到了路由,可能大家会觉得路由这个东西无所不,可路由这个东 ...
- ThinkCMF框架审核详细更新列表操作
在ThinkCMF框架中,我们在点击一个列表中的一条进入详细,做了[审核][驳回]类似的状态更新,然后列表没有变化. ThinkCMF的后台页面构造是一个父层页面,生成多个动态iframe.其实每个i ...
- PHP中间件 middleware,Laravel框架控制器的middleware中间件用法分析
本文实例讲述了Laravel框架控制器的middleware中间件用法.分享给大家供大家参考,具体如下: 场景:活动开始前只能访问宣传页面,开始后才可以访问其他页面: 步骤: 新建中间件, 注册中间件 ...
- ThinkCMF框架任意内容包含漏洞
ThinkCMF简介 ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建.ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发 ...
- php调用其它控制器,TP框架控制器里面怎么调用另一个控制器的代码
我网站TP框架,一个前台D:\WWW\User\Home\Controller\CommonController.class文件,一个后台D:\WWW\snadmin\Home\ControllerC ...
- php框架控制器是什么意思,控制器定义
# 控制器的定义 HYPHP控制器采用了OOP方式进行访问调用. 控制器就是一个类, 而操作方法则是一个类成员函数 下面是一个默认的 **/Action/Index.php** 内容 ~~~ name ...
- 3、Eternal框架-控制器
2019独角兽企业重金招聘Python工程师标准>>> 介绍 MVC:Model-View-Controller,包括三类对象,Model模型对象.View视图表示.Controll ...
- thinkphp漏洞_【组件攻击链】ThinkCMF 高危漏洞分析与利用
一.组件介绍 1.1 基本信息 ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架.ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发者可以根据自身的需求以应用的形 ...
- Thinkcmf - 微信公众号开发 -1
.css.js 等样式的引入路径是: ThinkCMF\themes\simplebootx\Blog\Index\ PS:路径从ThinkCMF框架的根目录开始,一直到应用结束.如下图: 框架内ht ...
最新文章
- java中一些对象(po,vo,dao,pojo)等的解释
- python 怎么在一行获取多个数字
- 2017 9月java答案_2017年9月计算机二级JAVA试题及答案
- ABAP help click F1
- platform(win32) 错误
- 指针c语言求电阻的并联值,计算电阻使之符合要求值,,“简单”的难题!!!...
- 【VMCloud云平台】SCDPM(四)如何保护数据库(一)
- 基于Word2vec文本聚类
- 应变计测轴扭矩 计算
- 练习1000 scanf 用法
- Efficient polynomial commitment schemes for multiple points and polynomials学习笔记
- 苹果手机几月份最便宜_苹果手机越来越便宜,安卓手机越来越贵,果真是这样吗?...
- 中文拼写纠错_一种中文拼写检查方法与流程
- 数据分析您需要一个现代化的数据仓库
- contentprovider踩坑之路之Failed to find provider info for com.example.app.provider和cursor=null空指针问题
- 基于单片机的超市储物柜设计_一种基于at89c51单片机的超市寄存装置的制造方法...
- Hadoop实战 一 WordCount
- android 设备驱动 位置,android中各个部件驱动在源码中的位置
- Lit vs React
- 连接器模具复杂吗?连接器模具要注意什么?
热门文章
- DDR工作原理-DQ和DQS信号的处理
- 【清风数学建模笔记】第七讲 多元回归分析
- WorldWind学习系列十五:如何切割影像和DEM数据及其在WW中的应用配置
- 如何使用c语言获取麦克风信息,[C#] 如何获取麦克风采集的音频信息 和 如何根据波形播放声音。...
- swift3新路程(11)错误处理(Error Handling)
- 盘点最高调薪行业 年薪过万要几年
- 单一样本T检验实例(用统计软件SPSS16.0实现)
- 简单的水稻叶龄识别!
- 国家高新技术资格考试osta证书是什么样的?
- 【原创】vegas8.0光效插件