thinkphp action.class.php 学习
控制器类(Action)
描述 Description
ThinkPHP Action控制器基类 抽象类
位置:ThinkPHP/Lib/Core/Action.class.php
声明:
- abstract class Action {}
常量 Constants
无
属性 Properties
属性名 | 类型 | 访问 | 描述 |
---|---|---|---|
view | View | protected | 视图实例对象 默认为NULL |
name | string | private | 当前Action名称 默认为空字符串 |
方法 Methods
方法名 | 返回值类型 | 描述 |
---|---|---|
__construct() | void | 架构方法 |
getActionName() | string | 获取当前Action名称 |
isAjax() | bool | 是否是ajax方式提交 |
display() | void | 页面输出 |
fetch() | string | 获取页面输出内容 |
buildHtml() | string | 创建静态Html页面 |
assign() | void | 模板变量赋值 |
error() | void | 操作错误跳转 |
success() | void | 操作成功跳转 |
ajaxReturn() | void | ajax返回数据 |
redirect() | void | Action跳转(URL重定向) |
__destruct() | void | 析构方法 |
__construct()
说明:
public void __construct()
架构方法
参数:
无
返回值:
无
源码:
- public function __construct() {
- tag('action_begin');
- //实例化视图类
- $this->view = Think::instance('View');
- //控制器初始化
- if(method_exists($this,'_initialize'))
- $this->_initialize();
- }
getActionName()
说明:
获取当前控制器名称
protected string getActionName()
参数:
无
返回值:
string
源码:
- protected function getActionName() {
- if(empty($this->name)) {
- // 获取Action名称
- $this->name = substr(get_class($this),0,-6);
- }
- return $this->name;
- }
isAjax()
说明:
protected bool isAjax()
判断是否是Ajax提交 首先判断是否存在HTTP_X_REQUESTED_WITH系统变量,如果不存在则判断VAR_AJAX_SUBMIT配置定义的提交变量
参数:
无
返回值:
如果是ajax方式提交返回true,否则返回false。
源码:
- protected function isAjax() {
- if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) ) {
- if('xmlhttprequest' == strtolower($_SERVER['HTTP_X_REQUESTED_WITH']))
- return true;
- }
- if(!empty($_POST[C('VAR_AJAX_SUBMIT')]) || !empty($_GET[C('VAR_AJAX_SUBMIT')]))
- // 判断Ajax方式提交
- return true;
- return false;
- }
示例:
- if($this->isAjax()){
- echo 'ajax方式提交';
- }else{
- echo '不是ajax方式提交';
- }
display()
说明:
protected void display($templateFile='',$charset='',$contentType='')
模板显示 调用视图类的display方法
参数:
参数 | 类型 | 说明 |
---|---|---|
$templateFile | string | 指定要调用的模板文件,默认为空 由系统自动定位模板文件 |
$charset | string | 输出编码 |
$contentType | string | 输出类型 |
返回值:
无
源码:
- protected function display($templateFile='',$charset='',$contentType='') {
- $this->view->display($templateFile,$charset,$contentType);
- }
示例:
- $this->display('edit');
fetch()
说明:
protected string fetch($templateFile='')
获取输出页面内容,调用视图类的fetch方法
参数:
参数 | 类型 | 说明 |
---|---|---|
$templateFile | string | 指定要调用的模板文件 默认为空 由系统自动定位模板文件 |
返回值:
返回获取的内容
源码:
- protected function buildHtml($htmlfile='',$htmlpath='',$templateFile='') {
- $content = $this->fetch($templateFile);
- $htmlpath = !empty($htmlpath)?$htmlpath:HTML_PATH;
- $htmlfile = $htmlpath.$htmlfile.C('HTML_FILE_SUFFIX');
- if(!is_dir(dirname($htmlfile)))
- // 如果静态目录不存在 则创建
- mk_dir(dirname($htmlfile));
- if(false === file_put_contents($htmlfile,$content))
- throw_exception(L('_CACHE_WRITE_ERROR_').':'.$htmlfile);
- return $content;
- }
buildHtml()
说明:
创建静态页面
protected string buildHtml($htmlfile='',$htmlpath='',$templateFile='')
参数:
参数 | 类型 | 说明 |
---|---|---|
$htmlfile | string | 生成的静态文件名称 |
$htmlpath | string | 生成的静态文件路径 |
$templateFile | string | 指定要调用的模板文件 默认为空 由系统自动定位模板文件 |
返回值:
无
源码:
- protected function buildHtml($htmlfile='',$htmlpath='',$templateFile='') {
- $content = $this->fetch($templateFile);
- $htmlpath = !empty($htmlpath)?$htmlpath:HTML_PATH;
- $htmlfile = $htmlpath.$htmlfile.C('HTML_FILE_SUFFIX');
- if(!is_dir(dirname($htmlfile)))
- // 如果静态目录不存在 则创建
- mk_dir(dirname($htmlfile));
- if(false === file_put_contents($htmlfile,$content))
- throw_exception(L('_CACHE_WRITE_ERROR_').':'.$htmlfile);
- return $content;
- }
assign()
说明:
模板变量赋值
protected void assign($name,$value='')
参数:
参数 | 类型 | 说明 |
---|---|---|
$name | mixed | 要显示的模板变量 如果是字符串表示单个变量赋值,如果是数组表示批量赋值 |
$value | mixed | 变量的值 |
返回值:
无
源码:
- protected function assign($name,$value='') {
- $this->view->assign($name,$value);
- }
示例:
action中进行模板变量赋值
- //单个变量赋值
- $this->assign('title','ThinkPHP-PHP最佳实践框架');
- $this->assign('author','liu21st@gmail.com');
- // 可以用下面的方式替代
- $this->title = 'ThinkPHP-PHP最佳实践框架';
- $this->author = 'liu21st@gmail.com';
- //变量批量赋值
- $var['title']='ThinkPHP-PHP最佳实践框架';
- $var['author']='liu21st@gmail.com';
- $this->assign($var);
模板输出
- <HTML>
- <HEAD>
- <TITLE>{$title}</TITLE>
- <META name="Author" content="{$author}">
- </HEAD>
- <BODY>
- </BODY>
- </HTML>
error()
说明:
操作错误跳转的快捷方法
protected void error($message,$jumpUrl='',$ajax=false)
参数:
参数 | 类型 | 说明 |
---|---|---|
$message | string | 错误信息 |
$jumpUrl | string | 是否为Ajax方式 |
$ajax | bool | 页面跳转地址 |
返回值:
void
源码:
- protected function error($message,$jumpUrl='',$ajax=false) {
- $this->dispatchJump($message,0,$jumpUrl,$ajax);
- }
isGet()
说明:
判断是否为get方式提交,魔术方法__call 中定义
protected bool isGet()
参数:
无
返回值:
如果是get方式提交返回true,否则返回false。
isPost()
说明:
判断是否为post方式提交,魔术方法__call中定义
protected bool isPost()
参数:
无
返回值:
如果是post方式提交返回true,否则返回false。
isPut()
说明:
判断是否为Put方式提交,魔术方法__call中定义
protected bool isPut()
参数:
无
返回值:
如果是put方式提交返回true,否则返回false。
isDelete()
说明:
判断是否为delete方式提交,魔术方法__call中定义
protected bool isDelete()
参数:
无
返回值:
如果是delete方式提交返回true,否则返回false。
isHead()
说明:
判断是否为head提交,魔术方法__call中定义
protected bool isHead()
参数:
无
返回值:
如果是head提交返回true,否则返回false。
ajaxReturn()
说明:
Ajax方式返回数据到客户端
protected void ajaxReturn($data,$info='',$status=1,$type='')
参数:
$data | mixed | 要返回的数据 |
$info | string | 提示信息 |
$status | integer | 返回状态 |
$type | string | ajax返回类型 支持JSON XML EVAL |
返回值:
无
源码:
- protected function ajaxReturn($data,$info='',$status=1,$type='') {
- $result = array();
- $result['status'] = $status;
- $result['info'] = $info;
- $result['data'] = $data;
- //扩展ajax返回数据, 在Action中定义function ajaxAssign(&$result){} 方法 扩展ajax返回数据。
- if(method_exists($this,'ajaxAssign'))
- $this->ajaxAssign($result);
- if(empty($type)) $type = C('DEFAULT_AJAX_RETURN');
- if(strtoupper($type)=='JSON') {
- // 返回JSON数据格式到客户端 包含状态信息
- header('Content-Type:text/html; charset=utf-8');
- exit(json_encode($result));
- }elseif(strtoupper($type)=='XML'){
- // 返回xml格式数据
- header('Content-Type:text/xml; charset=utf-8');
- exit(xml_encode($result));
- }elseif(strtoupper($type)=='EVAL'){
- // 返回可执行的js脚本
- header('Content-Type:text/html; charset=utf-8');
- exit($data);
- }else{
- // TODO 增加其它格式
- }
- }
redirect()
说明:
Action跳转(URL重定向) 支持指定模块和延时跳转
protected function redirect($url,$params=array(),$delay=0,$msg='')
源码:
- protected function redirect($url,$params=array(),$delay=0,$msg='') {
- $url = U($url,$params);
- redirect($url,$delay,$msg);
- }
dispatchJump()
说明:
默认跳转操作 支持错误导向和正确跳转
private function dispatchJump($message,$status=1,$jumpUrl='',$ajax=false)
源码:
- private function dispatchJump($message,$status=1,$jumpUrl='',$ajax=false) {
- // 判断是否为AJAX返回
- if($ajax || $this->isAjax()) $this->ajaxReturn($ajax,$message,$status);
- if(!empty($jumpUrl)) $this->assign('jumpUrl',$jumpUrl);
- // 提示标题
- $this->assign('msgTitle',$status? L('_OPERATION_SUCCESS_') : L('_OPERATION_FAIL_'));
- //如果设置了关闭窗口,则提示完毕后自动关闭窗口
- if($this->view->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(!$this->view->get('waitSecond')) $this->assign('waitSecond','1');
- // 默认操作成功自动返回操作前页面
- if(!$this->view->get('jumpUrl')) $this->assign("jumpUrl",$_SERVER["HTTP_REFERER"]);
- $this->display(C('TMPL_ACTION_SUCCESS'));
- }else{
- $this->assign('error',$message);// 提示信息
- //发生错误时候默认停留3秒
- if(!$this->view->get('waitSecond')) $this->assign('waitSecond','3');
- // 默认发生错误的话自动返回上页
- if(!$this->view->get('jumpUrl')) $this->assign('jumpUrl',"javascript:history.back(-1);");
- $this->display(C('TMPL_ACTION_ERROR'));
- // 中止执行 避免出错后继续执行
- exit ;
- }
- }
__destruct()
说明:
析构方法
public function __destruct()
源码:
- public function __destruct() {
- // 保存日志
- if(C('LOG_RECORD')) Log::save();
- // 执行后续操作
- tag('action_end');
- }
- }
thinkphp action.class.php 学习的更多相关文章
- 根据ThinkPHP官方文档学习opensns框架
根据ThinkPHP官方文档学习opensns框架 1.解读Application下各个Controller文件夹下的作用 控制器类的命名方式是:控制器名(驼峰法,首字母大写)+Controller ...
- Redis in Action : Redis 实战学习笔记
1 1 1 Redis in Action : Redis 实战学习笔记 1 http://redis.io/ https://github.com/antirez/redis https://ww ...
- thinkphp快速入门(学习php框架及代码审计)
之前想学习php代码审计,但是没有坚持下去,记得当时看到了很多CMS框架采用MVC架构,就嘎然而止了. 为了深入学习下框架,一边看着thinkphp官方文档,一边写个简单的登陆注册页面以加深理解. 官 ...
- Machine Learning In Action 第二章学习笔记: kNN算法
本文主要记录<Machine Learning In Action>中第二章的内容.书中以两个具体实例来介绍kNN(k nearest neighbors),分别是: 约会对象预测 手写数 ...
- thinkphp action参数绑定
参数绑定是通过直接绑定URL地址中的变量作为操作方法的参数,可以简化方法的定义甚至路由的解析. 参数绑定功能默认是开启的,其原理是把URL中的参数(不包括模块.控制器和操作名)和操作方法中的参数进行绑 ...
- opensns学习
根据ThinkPHP官方文档学习opensns框架 主要看了下opensns所用的单一入口模式的意义. 基础 opensns目录结构 index.php 入口文件 Application 应用目录(含 ...
- Jqgrid学习API
JQGrid是一个在jquery基础上做的一个表格控件,以ajax的方式和服务器端通信. JQGrid Demo 是一个在线的演示项目.在这里,可以知道jqgrid可以做什么事情. 下面是转自其他人b ...
- Action<>和Func<> 委托【代理】
C#中的Action<>和Func<> 其实他们两个都是委托[代理]的简写形式. 一.[action<>]指定那些只有输入参数,没有返回值的委托 Delegate的 ...
- 一步一步学习C++
根据<C++ primer>第五版 总结学习心得. 在实践中,不必全面地使用C++语言的各种特性,而应根据工程的实际情况,适当取舍(譬如动态类型信息,虚拟继承.异常等特性的使用,很值得商榷 ...
随机推荐
- 动态规划——K背包问题
Problem DescriptionNow you are asked to measure a dose of medicine with a balance and a number of we ...
- 《ACM国际大学生程序设计竞赛题解Ⅰ》——基础编程题
这个专栏开始介绍一些<ACM国际大学生程序设计竞赛题解>上的竞赛题目,读者可以配合zju/poj/uva的在线测评系统提交代码(今天zoj貌似崩了). 其实看书名也能看出来这本书的思路,就 ...
- mysql备份数据库
需求: 1,每天4点备份mysql数据: 2,为节省空间,删除超过3个月的所有备份数据: 3,删除超过7天的备份数据,保留3个月里的 10号 20号 30号的备份数据: #创建shell文件 vim ...
- RabbitMQ挂掉问题处理
开发环境中的rabbitmq总是会挂掉,rabbitmq的执行都是ssh远程登录执行命令: rabbitmq-server & 认为加了&,进程会在后台执行不会受到终端的影响.所以不知 ...
- Java线程面试题 Top 50【转载】
不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程 ...
- Info.plist和pch文件的作用,UIApplication,iOS程序的启动过程,AppDelegate 方法解释,UIWindow,生命周期方法
Info.plist常见的设置 建立一个工程后,会在Supporting files文件夹下看到一个“工程名-Info.plist”的文件,该文件对工程做一些运行期的配置,非常重要,不能删除 注:在旧 ...
- 基于MyBatis的数据库切分框架,可实现数据的水平切分和垂直切分。 http://www.makersoft.org
https://github.com/makersoft/mybatis-shards MyBatis-Shards 专业的MyBatis数据库切分框架 MyBatis Shards简介 MyBati ...
- springMVC3学习(二)--ModelAndView对象
当控制器处理完请求时,一般会将包括视图名称或视图对象以及一些模型属性的ModelAndView对象返回到DispatcherServlet. 因此,常常须要在控制器中构造ModelAndView对象. ...
- Enterprise Architect使用教程
一.Enterprise Architect简介 Enterprise Architect是一个对于软件系统开发有着极好支持的CASE软件(Computer Aided Software Engine ...
- android 用代码画虚线边框背景(转)
1.虚线画效果,可以使用Android中的xml来做. 2.直接上代码: <RelativeLayout android:id="@+id/coupon_popup" and ...