控制器类(Action)

描述 Description

ThinkPHP Action控制器基类 抽象类
位置:ThinkPHP/Lib/Core/Action.class.php

声明:

  1. 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()
架构方法
参数:
无
返回值:
无

源码:

  1. public function __construct() {
  2. tag('action_begin');
  3. //实例化视图类
  4. $this->view       = Think::instance('View');
  5. //控制器初始化
  6. if(method_exists($this,'_initialize'))
  7. $this->_initialize();
  8. }
 

getActionName()

说明:
获取当前控制器名称
protected string getActionName()

参数:
无

返回值:
string

源码:

  1. protected function getActionName() {
  2. if(empty($this->name)) {
  3. // 获取Action名称
  4. $this->name     =   substr(get_class($this),0,-6);
  5. }
  6. return $this->name;
  7. }
 

isAjax()

说明:
protected bool isAjax()
判断是否是Ajax提交 首先判断是否存在HTTP_X_REQUESTED_WITH系统变量,如果不存在则判断VAR_AJAX_SUBMIT配置定义的提交变量
参数:
无
返回值:
如果是ajax方式提交返回true,否则返回false。

源码:

  1. protected function isAjax() {
  2. if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) ) {
  3. if('xmlhttprequest' == strtolower($_SERVER['HTTP_X_REQUESTED_WITH']))
  4. return true;
  5. }
  6. if(!empty($_POST[C('VAR_AJAX_SUBMIT')]) || !empty($_GET[C('VAR_AJAX_SUBMIT')]))
  7. // 判断Ajax方式提交
  8. return true;
  9. return false;
  10. }

示例:

  1. if($this->isAjax()){
  2. echo 'ajax方式提交';
  3. }else{
  4. echo '不是ajax方式提交';
  5. }
 

display()

说明:
protected void display($templateFile='',$charset='',$contentType='')
模板显示 调用视图类的display方法
参数:

参数 类型 说明
$templateFile string 指定要调用的模板文件,默认为空 由系统自动定位模板文件
$charset string 输出编码
$contentType string 输出类型

返回值:
无
源码:

  1. protected function display($templateFile='',$charset='',$contentType='') {
  2. $this->view->display($templateFile,$charset,$contentType);
  3. }

示例:

  1. $this->display('edit');
 

fetch()

说明:
protected string fetch($templateFile='')
获取输出页面内容,调用视图类的fetch方法
参数:

参数 类型 说明
$templateFile string 指定要调用的模板文件 默认为空 由系统自动定位模板文件

返回值:
返回获取的内容
源码:

  1. protected function buildHtml($htmlfile='',$htmlpath='',$templateFile='') {
  2. $content = $this->fetch($templateFile);
  3. $htmlpath   = !empty($htmlpath)?$htmlpath:HTML_PATH;
  4. $htmlfile =  $htmlpath.$htmlfile.C('HTML_FILE_SUFFIX');
  5. if(!is_dir(dirname($htmlfile)))
  6. // 如果静态目录不存在 则创建
  7. mk_dir(dirname($htmlfile));
  8. if(false === file_put_contents($htmlfile,$content))
  9. throw_exception(L('_CACHE_WRITE_ERROR_').':'.$htmlfile);
  10. return $content;
  11. }
 

buildHtml()

说明:
创建静态页面
protected string buildHtml($htmlfile='',$htmlpath='',$templateFile='')
参数:

参数 类型 说明
$htmlfile string 生成的静态文件名称
$htmlpath string 生成的静态文件路径
$templateFile string 指定要调用的模板文件 默认为空 由系统自动定位模板文件

返回值:
无
源码:

  1. protected function buildHtml($htmlfile='',$htmlpath='',$templateFile='') {
  2. $content = $this->fetch($templateFile);
  3. $htmlpath   = !empty($htmlpath)?$htmlpath:HTML_PATH;
  4. $htmlfile =  $htmlpath.$htmlfile.C('HTML_FILE_SUFFIX');
  5. if(!is_dir(dirname($htmlfile)))
  6. // 如果静态目录不存在 则创建
  7. mk_dir(dirname($htmlfile));
  8. if(false === file_put_contents($htmlfile,$content))
  9. throw_exception(L('_CACHE_WRITE_ERROR_').':'.$htmlfile);
  10. return $content;
  11. }
 

assign()

说明:
模板变量赋值
protected void assign($name,$value='')
参数:

参数 类型 说明
$name mixed 要显示的模板变量 如果是字符串表示单个变量赋值,如果是数组表示批量赋值
$value mixed 变量的值

返回值:
无
源码:

  1. protected function assign($name,$value='') {
  2. $this->view->assign($name,$value);
  3. }

示例:
action中进行模板变量赋值

  1. //单个变量赋值
  2. $this->assign('title','ThinkPHP-PHP最佳实践框架');
  3. $this->assign('author','liu21st@gmail.com');
  4. // 可以用下面的方式替代
  5. $this->title = 'ThinkPHP-PHP最佳实践框架';
  6. $this->author = 'liu21st@gmail.com';
  7. //变量批量赋值
  8. $var['title']='ThinkPHP-PHP最佳实践框架';
  9. $var['author']='liu21st@gmail.com';
  10. $this->assign($var);

模板输出

  1. <HTML>
  2. <HEAD>
  3. <TITLE>{$title}</TITLE>
  4. <META name="Author" content="{$author}">
  5. </HEAD>
  6. <BODY>
  7. </BODY>
  8. </HTML>
 

error()

说明:
操作错误跳转的快捷方法
protected void error($message,$jumpUrl='',$ajax=false)
参数:

参数 类型 说明
$message string 错误信息
$jumpUrl string 是否为Ajax方式
$ajax bool 页面跳转地址

返回值:
void

源码:

  1. protected function error($message,$jumpUrl='',$ajax=false) {
  2. $this->dispatchJump($message,0,$jumpUrl,$ajax);
  3. }
 

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

返回值:
无
源码:

  1. protected function ajaxReturn($data,$info='',$status=1,$type='') {
  2. $result  =  array();
  3. $result['status']  =  $status;
  4. $result['info'] =  $info;
  5. $result['data'] = $data;
  6. //扩展ajax返回数据, 在Action中定义function ajaxAssign(&$result){} 方法 扩展ajax返回数据。
  7. if(method_exists($this,'ajaxAssign'))
  8. $this->ajaxAssign($result);
  9. if(empty($type)) $type  =   C('DEFAULT_AJAX_RETURN');
  10. if(strtoupper($type)=='JSON') {
  11. // 返回JSON数据格式到客户端 包含状态信息
  12. header('Content-Type:text/html; charset=utf-8');
  13. exit(json_encode($result));
  14. }elseif(strtoupper($type)=='XML'){
  15. // 返回xml格式数据
  16. header('Content-Type:text/xml; charset=utf-8');
  17. exit(xml_encode($result));
  18. }elseif(strtoupper($type)=='EVAL'){
  19. // 返回可执行的js脚本
  20. header('Content-Type:text/html; charset=utf-8');
  21. exit($data);
  22. }else{
  23. // TODO 增加其它格式
  24. }
  25. }
 

redirect()

说明:
Action跳转(URL重定向) 支持指定模块和延时跳转
protected function redirect($url,$params=array(),$delay=0,$msg='')
源码:

  1. protected function redirect($url,$params=array(),$delay=0,$msg='') {
  2. $url    =   U($url,$params);
  3. redirect($url,$delay,$msg);
  4. }
 

dispatchJump()

说明:
默认跳转操作 支持错误导向和正确跳转
private function dispatchJump($message,$status=1,$jumpUrl='',$ajax=false)
源码:

  1. private function dispatchJump($message,$status=1,$jumpUrl='',$ajax=false) {
  2. // 判断是否为AJAX返回
  3. if($ajax || $this->isAjax()) $this->ajaxReturn($ajax,$message,$status);
  4. if(!empty($jumpUrl)) $this->assign('jumpUrl',$jumpUrl);
  5. // 提示标题
  6. $this->assign('msgTitle',$status? L('_OPERATION_SUCCESS_') : L('_OPERATION_FAIL_'));
  7. //如果设置了关闭窗口,则提示完毕后自动关闭窗口
  8. if($this->view->get('closeWin'))    $this->assign('jumpUrl','javascript:window.close();');
  9. $this->assign('status',$status);   // 状态
  10. //保证输出不受静态缓存影响
  11. C('HTML_CACHE_ON',false);
  12. if($status) { //发送成功信息
  13. $this->assign('message',$message);// 提示信息
  14. // 成功操作后默认停留1秒
  15. if(!$this->view->get('waitSecond'))    $this->assign('waitSecond','1');
  16. // 默认操作成功自动返回操作前页面
  17. if(!$this->view->get('jumpUrl')) $this->assign("jumpUrl",$_SERVER["HTTP_REFERER"]);
  18. $this->display(C('TMPL_ACTION_SUCCESS'));
  19. }else{
  20. $this->assign('error',$message);// 提示信息
  21. //发生错误时候默认停留3秒
  22. if(!$this->view->get('waitSecond'))    $this->assign('waitSecond','3');
  23. // 默认发生错误的话自动返回上页
  24. if(!$this->view->get('jumpUrl')) $this->assign('jumpUrl',"javascript:history.back(-1);");
  25. $this->display(C('TMPL_ACTION_ERROR'));
  26. // 中止执行  避免出错后继续执行
  27. exit ;
  28. }
  29. }
 

__destruct()

说明:
析构方法
public function __destruct()
源码:

  1. public function __destruct() {
  2. // 保存日志
  3. if(C('LOG_RECORD')) Log::save();
  4. // 执行后续操作
  5. tag('action_end');
  6. }
  7. }

thinkphp action.class.php 学习的更多相关文章

  1. 根据ThinkPHP官方文档学习opensns框架

    根据ThinkPHP官方文档学习opensns框架 1.解读Application下各个Controller文件夹下的作用 控制器类的命名方式是:控制器名(驼峰法,首字母大写)+Controller ...

  2. Redis in Action : Redis 实战学习笔记

    1 1 1 Redis in Action : Redis  实战学习笔记 1 http://redis.io/ https://github.com/antirez/redis https://ww ...

  3. thinkphp快速入门(学习php框架及代码审计)

    之前想学习php代码审计,但是没有坚持下去,记得当时看到了很多CMS框架采用MVC架构,就嘎然而止了. 为了深入学习下框架,一边看着thinkphp官方文档,一边写个简单的登陆注册页面以加深理解. 官 ...

  4. Machine Learning In Action 第二章学习笔记: kNN算法

    本文主要记录<Machine Learning In Action>中第二章的内容.书中以两个具体实例来介绍kNN(k nearest neighbors),分别是: 约会对象预测 手写数 ...

  5. thinkphp action参数绑定

    参数绑定是通过直接绑定URL地址中的变量作为操作方法的参数,可以简化方法的定义甚至路由的解析. 参数绑定功能默认是开启的,其原理是把URL中的参数(不包括模块.控制器和操作名)和操作方法中的参数进行绑 ...

  6. opensns学习

    根据ThinkPHP官方文档学习opensns框架 主要看了下opensns所用的单一入口模式的意义. 基础 opensns目录结构 index.php 入口文件 Application 应用目录(含 ...

  7. Jqgrid学习API

    JQGrid是一个在jquery基础上做的一个表格控件,以ajax的方式和服务器端通信. JQGrid Demo 是一个在线的演示项目.在这里,可以知道jqgrid可以做什么事情. 下面是转自其他人b ...

  8. Action<>和Func<> 委托【代理】

    C#中的Action<>和Func<> 其实他们两个都是委托[代理]的简写形式. 一.[action<>]指定那些只有输入参数,没有返回值的委托 Delegate的 ...

  9. 一步一步学习C++

    根据<C++ primer>第五版 总结学习心得. 在实践中,不必全面地使用C++语言的各种特性,而应根据工程的实际情况,适当取舍(譬如动态类型信息,虚拟继承.异常等特性的使用,很值得商榷 ...

随机推荐

  1. VirtualBox扩展Ubuntu磁盘空间

    有时候我们在使用virtualBox虚拟机时,创建虚拟机时并没有考虑到所占用硬盘大小,后来可能磁盘空间不够用了. 以下方法可以帮你扩展虚拟机的存储空间(以下Ubuntu为例). 1. 在宿主机器进入V ...

  2. lightoj 1291 无向图边双联通+缩点统计叶节点

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1291 #include<cstdio> #include<cstri ...

  3. 关闭ES动态创建mapping

    使用ES的默认配置会使我们在索引不存在于mapping中的字段时,会自动创建. 这无疑会给我们带来困扰. 在我们不想要某个字段被搜索的时候,我们可以在开始关闭动态创建mapping. 执行如下操作: ...

  4. greenplum和postgresql

    想着要不要写,两个原因"懒"和"空".其实懒和空也是有联系的,不是因为懒的写,而是因为对PostgreSQL和Npgsql的知识了解匮乏,也就懒得写.好了,开头 ...

  5. IOS web网页图片上传问题

    用html5编写图片裁切上传,在iphone手机上可能会遇到图片方向错误问题,在此把解决方法和大家分享一下,用到了html5的 FileReader和Canvas,如果还没有接触的同学,先了解一下其方 ...

  6. android获取apk签名信息

    因为工作需要,需要获取应用的apk传递给新浪微博或者微信去申请授权 所以需要程序内获取签名上传服务器 做法如下:   public static String getAPPSecretString(A ...

  7. 【wpf基础】wpf MediaElement全屏播放视频功能

    最近在研究如何将视频全屏播放,一开始思路A:弹窗将MediaElement对象add到一个新的全屏窗体,报错 指定的元素已经是另一个元素的逻辑子元素.请先将其断开连接. 后续转换思路B:将本窗体其他控 ...

  8. XMPPFrameWork IOS 开发(二)- xcode配置

    原始地址:XMPPFrameWork IOS 开发(二) 译文地址:   Getting started using XMPPFramework on iOS 介绍 ios上的XMPPFramewor ...

  9. [Javascript] String method: endsWith() && startsWith()

    With endsWith && startsWith, you can easily find out whether the string ends or starts with ...

  10. 开源实时视频码流分析软件:VideoEye

    本文介绍一个自己做的码流分析软件:VideoEye.为什么要起这个名字呢?感觉这个软件的主要功能就是对"视频"进行"分析".而分析是要用眼睛来看的,因此取了&q ...