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