控制器类(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');
- }
- }