找这蟑螂恶霸三人组表情包包

私信发送成功
检测到您已登录开源中国,是否
系统将自动刷新
forked from
Fork 该项目?
使用 fork 功能将在后台会为你创建一个与该项目内容一样的同名项目,你可以在这个新项目里自由的修改内容。
建议只在有意向参与改进该项目时使用 fork 功能。
确定同步?
同步操作将从 ThinkPHP/tpcms 强制同步,此操作会覆盖自 fork 项目以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
1、TP框架核心升级
2、几个扩展类的升级
dc91951846ddb0db215ce3d8f87c
@@ -17,6 +17,124 @@
+ * 获取模版文件 格式 项目://分组@主题/模块/操作
+ * @param string $name 模版资源地址
+ * @param string $layer 视图层(目录)名称
+ * @return string
+function T($template='',$layer=''){
if(is_file($template)) {
// 解析模版资源地址
if(false === strpos($template,'://')){
APP_NAME.'://'.$
parse_url($template);
$info['host'].(isset($info['path'])?$info['path']:'');
isset($info['user'])?$info['user'].'/':(defined('GROUP_NAME')?GROUP_NAME.'/':'');
$info['scheme'];
$layer?$layer:C('DEFAULT_V_LAYER');
// 获取当前主题的模版路径
if(($list = C('EXTEND_GROUP_LIST')) && isset($list[$app])){ // 扩展分组
$list[$app].'/'.$group.$layer.'/';
}elseif(1==C('APP_GROUP_MODE')){ // 独立分组模式
dirname(BASE_LIB_PATH).'/'.$group.$layer.'/';
TMPL_PATH.$
// 分析模板文件规则
if('' == $file) {
// 如果模板文件名为空 按照默认规则定位
$file = MODULE_NAME . '/' . ACTION_NAME;
}elseif(false === strpos($file, '/')){
$file = MODULE_NAME . '/' . $
return $baseUrl.$file.C('TMPL_TEMPLATE_SUFFIX');
+ * 获取输入参数 支持过滤和默认值
+ * 使用方法:
+ * &code&
+ * I('id',0); 获取id参数 自动判断get或者post
+ * I('post.name','','htmlspecialchars'); 获取$_POST['name']
+ * I('get.'); 获取$_GET
+ * &/code&
+ * @param string $name 变量的名称 支持指定类型
+ * @param mixed $default 不存在的时候默认值
+ * @param mixed $filter 参数过滤方法
+ * @return mixed
+function I($name,$default='',$filter=null) {
if(strpos($name,'.')) { // 指定参数来源
list($method,$name) =
explode('.',$name);
}else{ // 默认为自动判断
switch(strtolower($method)) {
case 'get'
$input =& $_GET;
case 'post'
$input =& $_POST;
case 'put'
parse_str(file_get_contents('php://input'), $input);
case 'param'
switch($_SERVER['REQUEST_METHOD']) {
case 'POST':
case 'PUT':
parse_str(file_get_contents('php://input'), $input);
if(C('VAR_URL_PARAMS') && isset($_GET[C('VAR_URL_PARAMS')])){
array_merge($input,$_GET[C('VAR_URL_PARAMS')]);
case 'request' :
$input =& $_REQUEST;
case 'session' :
$input =& $_SESSION;
case 'cookie'
$input =& $_COOKIE;
case 'server'
$input =& $_SERVER;
case 'globals' :
$input =& $GLOBALS;
return NULL;
// 全局过滤
// array_walk_recursive($input,'filter_exp');
if(C('VAR_FILTERS')) {
explode(',',C('VAR_FILTERS'));
foreach($_filters as $_filter){
// 全局参数过滤
array_walk_recursive($input,$_filter);
if(empty($name)) { // 获取全部变量
}elseif(isset($input[$name])) { // 取值操作
= $input[$name];
isset($filter)?$filter:C('DEFAULT_FILTER');
if($filters) {
explode(',',$filters);
foreach($filters as $filter){
if(function_exists($filter)) {
is_array($data)?array_map($filter,$data):$filter($data); // 参数过滤
filter_var($data,is_int($filter)?$filter:filter_id($filter));
if(false === $data) {
isset($default)?$default:NULL;
}else{ // 变量默认值
isset($default)?$default:NULL;
* 记录和统计时间(微秒)和内存使用情况
* 使用方法:
@@ -259,13 +377,18 @@ function D($name='',$layer='') {
static $_model
$layer?$layer:C('DEFAULT_M_LAYER');
if(strpos($name,'://')) {// 指定项目
list($app)
explode('://',$name);
str_replace('://','/'.$layer.'/',$name);
C('DEFAULT_APP').'/'.$layer.'/'.$
C('DEFAULT_APP');
$app.'/'.$layer.'/'.$
if(isset($_model[$name]))
return $_model[$name];
explode('/',$name);
if(count($path)&3 && 1 == C('APP_GROUP_MODE')) { // 独立分组
if($list = C('EXTEND_GROUP_LIST') && isset($list[$app])){ // 扩展分组
$list[$app];
import($path[2].'/'.$path[1].'/'.$path[3].$layer,$baseUrl);
}elseif(count($path)&3 && 1 == C('APP_GROUP_MODE')) { // 独立分组
$path[0]== '@' ? dirname(BASE_LIB_PATH) : APP_PATH.'../'.$path[0].'/'.C('APP_GROUP_PATH').'/';
import($path[2].'/'.$path[1].'/'.$path[3].$layer,$baseUrl);
@@ -312,13 +435,18 @@ function A($name,$layer='',$common=false) {
static $_action = array();
$layer?$layer:C('DEFAULT_C_LAYER');
if(strpos($name,'://')) {// 指定项目
list($app)
explode('://',$name);
str_replace('://','/'.$layer.'/',$name);
'@/'.$layer.'/'.$
if(isset($_action[$name]))
return $_action[$name];
explode('/',$name);
if(count($path)&3 && 1 == C('APP_GROUP_MODE')) { // 独立分组
if($list = C('EXTEND_GROUP_LIST') && isset($list[$app])){ // 扩展分组
$list[$app];
import($path[2].'/'.$path[1].'/'.$path[3].$layer,$baseUrl);
}elseif(count($path)&3 && 1 == C('APP_GROUP_MODE')) { // 独立分组
$path[0]== '@' ? dirname(BASE_LIB_PATH) : APP_PATH.'../'.$path[0].'/'.C('APP_GROUP_PATH').'/';
import($path[2].'/'.$path[1].'/'.$path[3].$layer,$baseUrl);
}elseif($common) { // 加载公共类库目录
@@ -490,19 +618,24 @@ function add_tag_behavior($tag,$behavior,$path='') {
* 执行某个行为
* @param string $name 行为名称
- * @param Mixed $params 传人的参数
+ * @param Mixed $params 传入的参数
* @return void
function B($name, &$params=NULL) {
if(strpos($name,'/')){
list($name,$method) = explode('/',$name);
= $name.'Behavior';
if(APP_DEBUG) {
G('behaviorStart');
= new $class();
$behavior-&run($params);
$behavior-&$method($params);
if(APP_DEBUG) { // 记录行为的执行日志
G('behaviorEnd');
trace('Run '.$name.' Behavior [ RunTime:'.G('behaviorStart','behaviorEnd',6).'s ]','','INFO');
trace($name.' Behavior ::'.$method.' [ RunTime:'.G('behaviorStart','behaviorEnd',6).'s ]','','INFO');
@@ -29,18 +29,10 @@ function halt($error) {
= debug_backtrace();
$e['message']
$e['file']
= $trace[0]['file'];
$e['class']
= isset($trace[0]['class'])?$trace[0]['class']:'';
$e['function']
= isset($trace[0]['function'])?$trace[0]['function']:'';
$e['line']
= $trace[0]['line'];
$traceInfo
$time = date('y-m-d H:i:m');
foreach ($trace as $t) {
$traceInfo .= '[' . $time . '] ' . $t['file'] . ' (' . $t['line'] . ') ';
$traceInfo .= $t['class'] . $t['type'] . $t['function'] . '(';
$traceInfo .= implode(', ', $t['args']);
$traceInfo .=')&br/&';
$e['trace']
ob_start();
debug_print_backtrace();
$e['trace']
= ob_get_clean();
@@ -70,7 +62,7 @@ function halt($error) {
function throw_exception($msg, $type='ThinkException', $code=0) {
if (class_exists($type, false))
throw new $type($msg, $code, true);
throw new $type($msg, $code);
halt($msg);
// 异常类型不存在则输出错误信息字串
@@ -293,13 +285,15 @@ function U($url='',$vars='',$suffix=true,$redirect=false,$domain=false) {
* 渲染输出Widget
* @param string $name Widget名称
- * @param array $data 传人的参数
+ * @param array $data 传入的参数
* @param boolean $return 是否返回内容
+ * @param string $path Widget所在路径
* @return void
-function W($name, $data=array(), $return=false) {
+function W($name, $data=array(), $return=false,$path='') {
$name . 'Widget';
require_cache(BASE_LIB_PATH . 'Widget/' . $class . '.class.php');
empty($path) ? BASE_LIB_PATH : $
require_cache($path . 'Widget/' . $class . '.class.php');
if (!class_exists($class))
throw_exception(L('_CLASS_NOT_EXIST_') . ':' . $class);
Think::instance($class);
@@ -374,7 +368,7 @@ function redirect($url, $time=0, $msg='') {
function S($name,$value='',$options=null) {
static $cache
if(is_array($options)){
if(is_array($options) && empty($cache)){
// 缓存操作的同时初始化
isset($options['type'])?$options['type']:'';
Cache::getInstance($type,$options);
@@ -390,7 +384,11 @@ function S($name,$value='',$options=null) {
}elseif(is_null($value)) { // 删除缓存
return $cache-&rm($name);
}else { // 缓存数据
is_numeric($options)?$options:NULL;
if(is_array($options)) {
isset($options['expire'])?$options['expire']:NULL;
is_numeric($options)?$options:NULL;
return $cache-&set($name, $value, $expire);
@@ -581,10 +579,11 @@ function session($name,$value='') {
}elseif(0===strpos($name,'?')){ // 检查session
substr($name,1);
if($prefix) {
return isset($_SESSION[$prefix][$name]);
if(strpos($name,'.')){ // 支持数组
list($name1,$name2) =
explode('.',$name);
return $prefix?isset($_SESSION[$prefix][$name1][$name2]):isset($_SESSION[$name1][$name2]);
return isset($_SESSION[$name]);
return $prefix?isset($_SESSION[$prefix][$name]):isset($_SESSION[$name]);
}elseif(is_null($name)){ // 清空session
if($prefix) {
@@ -593,9 +592,19 @@ function session($name,$value='') {
$_SESSION = array();
}elseif($prefix){ // 获取session
return isset($_SESSION[$prefix][$name])?$_SESSION[$prefix][$name]:
if(strpos($name,'.')){
list($name1,$name2) =
explode('.',$name);
return isset($_SESSION[$prefix][$name1][$name2])?$_SESSION[$prefix][$name1][$name2]:
return isset($_SESSION[$prefix][$name])?$_SESSION[$prefix][$name]:
return isset($_SESSION[$name])?$_SESSION[$name]:
if(strpos($name,'.')){
list($name1,$name2) =
explode('.',$name);
return isset($_SESSION[$name1][$name2])?$_SESSION[$name1][$name2]:
return isset($_SESSION[$name])?$_SESSION[$name]:
}elseif(is_null($value)){ // 删除session
if($prefix){
@@ -766,4 +775,4 @@ function filter_exp(&$value){
if (in_array(strtolower($value),array('exp','or'))){
$value .= ' ';
\ No newline at end of file
@@ -19,7 +19,7 @@ defined('THINK_PATH') or exit();
if(version_compare(PHP_VERSION,'5.2.0','&'))
die('require PHP & 5.2.0 !');
-define('THINK_VERSION', '3.1.2');
+define('THINK_VERSION', '3.2.0beta');
if(version_compare(PHP_VERSION,'5.4.0','&')) {
@@ -76,7 +76,7 @@ defined('CONF_PATH')
or define('CONF_PATH',
APP_PATH.'Conf/'); // 项目
defined('LANG_PATH')
or define('LANG_PATH',
APP_PATH.'Lang/'); // 项目语言包目录
defined('TMPL_PATH')
or define('TMPL_PATH',
APP_PATH.'Tpl/'); // 项目模板目录
defined('HTML_PATH')
or define('HTML_PATH',
APP_PATH.'Html/'); // 项目静态目录
-defined('LOG_PATH')
or define('LOG_PATH',
RUNTIME_PATH.'Logs/'); // 项目日志目录
+defined('LOG_PATH')
or define('LOG_PATH',
realpath(RUNTIME_PATH).'/Logs/'); // 项目日志目录
defined('TEMP_PATH')
or define('TEMP_PATH',
RUNTIME_PATH.'Temp/'); // 项目缓存目录
defined('DATA_PATH')
or define('DATA_PATH',
RUNTIME_PATH.'Data/'); // 项目数据目录
defined('CACHE_PATH')
or define('CACHE_PATH',
RUNTIME_PATH.'Cache/'); // 项目模板缓存目录
@@ -43,6 +43,7 @@ return
/* 默认设定 */
'DEFAULT_M_LAYER'
'Model', // 默认的模型层名称
'DEFAULT_C_LAYER'
'Action', // 默认的控制器层名称
'DEFAULT_V_LAYER'
'Tpl', // 默认的视图层名称
'DEFAULT_APP'
// 默认项目名称,@表示当前项目
'DEFAULT_LANG'
=& 'zh-cn', // 默认语言
'DEFAULT_THEME'
=& '', // 默认模板主题名称
@@ -122,7 +123,8 @@ return
// 0 (普通模式); 1 (PATHINFO 模式); 2 (REWRITE
模式); 3 (兼容模式)
默认为PATHINFO 模式,提供最好的用户体验和SEO支持
'URL_PATHINFO_DEPR'
=& '/', // PATHINFO模式下,各参数之间的分割符号
'URL_PATHINFO_FETCH'
'ORIG_PATH_INFO,REDIRECT_PATH_INFO,REDIRECT_URL', // 用于兼容判断PATH_INFO 参数的SERVER替代变量列表
'URL_HTML_SUFFIX'
// URL伪静态后缀设置
'URL_HTML_SUFFIX'
=& 'html',
// URL伪静态后缀设置
'URL_DENY_SUFFIX'
'ico|png|gif|jpg', // URL禁止访问的后缀设置
'URL_PARAMS_BIND'
true, // URL变量绑定到Action方法参数
'URL_404_REDIRECT'
'', // 404 跳转页面 部署模式有效
@@ -137,7 +139,7 @@ return
'VAR_TEMPLATE'
// 默认模板切换变量
'VAR_FILTERS'
'filter_exp',
// 全局系统变量的默认过滤方法 多个用逗号分割
'OUTPUT_ENCODE'
true, // 页面压缩输出
'OUTPUT_ENCODE'
false, // 页面压缩输出
'HTTP_CACHE_CONTROL'
'private', // 网页缓存控制
\ No newline at end of file
@@ -24,9 +24,6 @@ return array(
'action_begin'
'action_end'
'view_begin'
'view_template' =&
'LocationTemplate', // 自动定位模板文件
'view_parse'
'ParseTemplate', // 模板解析 支持PHP、内置模板引擎和第三方模板引擎
@@ -53,7 +53,7 @@ class CheckLangBehavior extends Behavior {
}elseif(cookie('think_language')){// 获取上次用户的选择
$langSet = cookie('think_language');
}elseif(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])){// 自动侦测浏览器语言
preg_match('/^([a-z\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);
preg_match('/^([a-z\d\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);
$langSet = $matches[1];
cookie('think_language',$langSet,3600);
@@ -63,19 +63,25 @@ class CheckLangBehavior extends Behavior {
// 定义当前语言
define('LANG_SET',strtolower($langSet));
// 读取项目公共语言包
if (is_file(LANG_PATH.LANG_SET.'/common.php'))
L(include LANG_PATH.LANG_SET.'/common.php');
$group = '';
$lang_path
C('APP_GROUP_MODE')==1 ? BASE_LIB_PATH.'Lang/'.LANG_SET.'/' : LANG_PATH.LANG_SET.'/';
// 读取当前分组公共语言包
if (defined('GROUP_NAME')){
if (is_file($lang_path.GROUP_NAME.'.php'))
L(include $lang_path.GROUP_NAME.'.php');
$group = GROUP_NAME.C('TMPL_FILE_DEPR');
(defined('GROUP_NAME') && C('APP_GROUP_MODE')==1) ? BASE_LIB_PATH.'Lang/'.LANG_SET.'/' : LANG_PATH.LANG_SET.'/';
// 读取项目公共语言包
if(is_file(LANG_PATH.LANG_SET.'/common.php'))
L(include LANG_PATH.LANG_SET.'/common.php');
// 读取分组公共语言包
if(defined('GROUP_NAME')){
if(C('APP_GROUP_MODE')==1){ // 独立分组
$file = $path.'common.php';
}else{ // 普通分组
$file = $path.GROUP_NAME.'.php';
$group = GROUP_NAME.C('TMPL_FILE_DEPR');
if(is_file($file))
L(include $file);
// 读取当前模块语言包
if (is_file($lang_path.$group.strtolower(MODULE_NAME).'.php'))
L(include $lang_path.$group.strtolower(MODULE_NAME).'.php');
if (is_file($path.$group.strtolower(MODULE_NAME).'.php'))
L(include $path.$group.strtolower(MODULE_NAME).'.php');
\ No newline at end of file
@@ -33,6 +33,7 @@ class UploadFile {//类定义开始
'thumbFile'
'',// 缩略图文件名
'thumbExt'
'',// 缩略图扩展名
'thumbRemoveOrigin' =&
false,// 是否移除原图
'thumbType'
1, // 缩略图生成方式 1 按设置大小截取 0 按原图等比例缩略
'zipImages'
false,// 压缩图片文件上传
false,// 启用子目录保存文件
'hash',// 子目录创建方式 可以使用hash date custom
@@ -126,7 +127,12 @@ class UploadFile {//类定义开始
isset($thumbSuffix[$i])?$thumbSuffix[$i]:$thumbSuffix[0];
$thumbname
$prefix.basename($filename,'.'.$file['extension']).$
Image::thumb($filename,$thumbPath.$thumbname.'.'.$thumbExt,'',$thumbWidth[$i],$thumbHeight[$i],true);
if(1 == $this-&thumbType){
Image::thumb2($filename,$thumbPath.$thumbname.'.'.$thumbExt,'',$thumbWidth[$i],$thumbHeight[$i],true);
Image::thumb($filename,$thumbPath.$thumbname.'.'.$thumbExt,'',$thumbWidth[$i],$thumbHeight[$i],true);
if($this-&thumbRemoveOrigin) {
// 生成缩略图之后删除原图
@@ -520,4 +526,4 @@ class UploadFile {//类定义开始
public function getErrorMsg() {
return $this-&
\ No newline at end of file
@@ -228,6 +228,80 @@ class Image {
* 生成特定尺寸缩略图 解决原版缩略图不能满足特定尺寸的问题 PS:会裁掉图片不符合缩略图比例的部分
* @access public
* @param string $image
* @param string $type 图像格式
* @param string $thumbname 缩略图文件名
* @param string $maxWidth
* @param string $maxHeight
* @param boolean $interlace 启用隔行扫描
* @return void
static function thumb2($image, $thumbname, $type='', $maxWidth=200, $maxHeight=50, $interlace=true) {
// 获取原图信息
$info = Image::getImageInfo($image);
if ($info !== false) {
$srcWidth = $info['width'];
$srcHeight = $info['height'];
$type = empty($type) ? $info['type'] : $
$type = strtolower($type);
$interlace = $interlace ? 1 : 0;
unset($info);
$scale = max($maxWidth / $srcWidth, $maxHeight / $srcHeight); // 计算缩放比例
//判断原图和缩略图比例 如原图宽于缩略图则裁掉两边 反之..
if($maxWidth / $srcWidth & $maxHeight / $srcHeight){
$srcX = 0;
$srcY = ($srcHeight - $maxHeight / $scale) / 2 ;
$cutWidth = $srcW
$cutHeight = $maxHeight / $
$srcX = ($srcWidth - $maxWidth / $scale) / 2;
$srcY = 0;
$cutWidth = $maxWidth / $
$cutHeight = $srcH
// 载入原图
$createFun = 'ImageCreateFrom' . ($type == 'jpg' ? 'jpeg' : $type);
$srcImg = $createFun($image);
//创建缩略图
if ($type != 'gif' && function_exists('imagecreatetruecolor'))
$thumbImg = imagecreatetruecolor($maxWidth, $maxHeight);
$thumbImg = imagecreate($maxWidth, $maxHeight);
// 复制图片
if (function_exists(&ImageCopyResampled&))
imagecopyresampled($thumbImg, $srcImg, 0, 0, $srcX, $srcY, $maxWidth, $maxHeight, $cutWidth, $cutHeight);
imagecopyresized($thumbImg, $srcImg, 0, 0, $srcX, $srcY, $maxWidth, $maxHeight, $cutWidth, $cutHeight);
if ('gif' == $type || 'png' == $type) {
//imagealphablending($thumbImg, false);//取消默认的混色模式
//imagesavealpha($thumbImg,true);//设定保存完整的 alpha 通道信息
$background_color = imagecolorallocate($thumbImg, 0, 255, 0);
指派一个绿色
imagecolortransparent($thumbImg, $background_color);
设置为透明色,若注释掉该行则输出绿色的图
// 对jpeg图形设置隔行扫描
if ('jpg' == $type || 'jpeg' == $type)
imageinterlace($thumbImg, $interlace);
// 生成图片
$imageFun = 'image' . ($type == 'jpg' ? 'jpeg' : $type);
$imageFun($thumbImg, $thumbname);
imagedestroy($thumbImg);
imagedestroy($srcImg);
* 根据给定的字符串生成图像
* @access public
@@ -483,4 +557,4 @@ class Image {
imagedestroy($im);
\ No newline at end of file
@@ -58,6 +58,7 @@ class Page {
$this-&nowPage
$this-&totalP
$this-&firstRow
$this-&listRows*($this-&nowPage-1);
if(!empty($url))
$this-&url
public function setConfig($name,$value) {
@@ -150,4 +151,4 @@ class Page {
return $pageS
@@ -167,7 +167,7 @@ class CheckRouteBehavior extends Behavior {
if($paths) {
preg_replace('@(\w+)\/([^\/]+)@e', '$var[strtolower(\'\\1\')]=strip_tags(\'\\2\');', implode('/',$paths));
// 解析路由自动传人参数
// 解析路由自动传入参数
if(is_array($route) && isset($route[1])) {
parse_str($route[1],$params);
array_merge($var,$params);
@@ -200,7 +200,7 @@ class CheckRouteBehavior extends Behavior {
if($regx) {
preg_replace('@(\w+)\/([^,\/]+)@e', '$var[strtolower(\'\\1\')]=strip_tags(\'\\2\');', $regx);
// 解析路由自动传人参数
// 解析路由自动传入参数
if(is_array($route) && isset($route[1])) {
parse_str($route[1],$params);
array_merge($var,$params);
@@ -33,13 +33,6 @@ abstract class Action {
* 模板变量
* @var tVar
* @access protected
protected $tVar
* 控制器参数
* @var config
* @access protected
@@ -52,6 +45,8 @@ abstract class Action {
public function __construct() {
tag('action_begin',$this-&config);
//实例化视图类
$this-&view
= Think::instance('View');
//控制器初始化
if(method_exists($this,'_initialize'))
$this-&_initialize();
@@ -97,7 +92,6 @@ abstract class Action {
* @return void
protected function display($templateFile='',$charset='',$contentType='',$content='',$prefix='') {
$this-&initView();
$this-&view-&display($templateFile,$charset,$contentType,$content,$prefix);
@@ -111,7 +105,6 @@ abstract class Action {
* @return mixed
protected function show($content,$charset='',$contentType='',$prefix='') {
$this-&initView();
$this-&view-&display('',$charset,$contentType,$content,$prefix);
@@ -126,23 +119,10 @@ abstract class Action {
* @return string
protected function fetch($templateFile='',$content='',$prefix='') {
$this-&initView();
return $this-&view-&fetch($templateFile,$content,$prefix);
* 初始化视图
* @access private
* @return void
private function initView(){
//实例化视图类
if(!$this-&view)
$this-&view
= Think::instance('View');
// 模板变量传值
if($this-&tVar)
$this-&view-&assign($this-&tVar);
创建静态页面
* @access protected
* @htmlfile 生成的静态文件名称
@@ -164,18 +144,26 @@ abstract class Action {
* 模板主题设置
* @access protected
* @param string $theme 模版主题
* @return Action
protected function theme($theme){
$this-&view-&theme($theme);
* 模板变量赋值
* @access protected
* @param mixed $name 要显示的模板变量
* @param mixed $value 变量的值
* @return void
* @return Action
protected function assign($name,$value='') {
if(is_array($name)) {
$this-&tVar
array_merge($this-&tVar,$name);
$this-&tVar[$name] = $
$this-&view-&assign($name,$value);
public function __set($name,$value) {
@@ -189,10 +177,7 @@ abstract class Action {
* @return mixed
public function get($name='') {
if('' === $name) {
return $this-&tV
return isset($this-&tVar[$name])?$this-&tVar[$name]:
return $this-&view-&get($name);
public function __get($name) {
@@ -206,7 +191,7 @@ abstract class Action {
* @return boolean
public function __isset($name) {
return isset($this-&tVar[$name]);
return $this-&get($name);
@@ -221,7 +206,7 @@ abstract class Action {
if(method_exists($this,'_empty')) {
// 如果定义了_empty操作 则调用
$this-&_empty($method,$args);
}elseif(file_exists_case(C('TEMPLATE_NAME'))){
}elseif(file_exists_case($this-&view-&parseTemplate())){
// 检查是否存在默认模版 如果有直接输出模版
$this-&display();
}elseif(function_exists('__hack_action')) {
@@ -254,9 +239,8 @@ abstract class Action {
if(C('VAR_URL_PARAMS')){
$params = $_GET[C('VAR_URL_PARAMS')];
array_merge($input,$params);
if(C('VAR_URL_PARAMS') && isset($_GET[C('VAR_URL_PARAMS')])){
array_merge($input,$_GET[C('VAR_URL_PARAMS')]);
case '_request' :
$input =& $_REQUEST;
@@ -283,6 +267,7 @@ abstract class Action {
}else{ // 变量默认值
isset($args[2])?$args[2]:NULL;
Log::record('建议使用I方法替代'.$method,Log::NOTICE);
@@ -295,7 +280,7 @@ abstract class Action {
* @param mixed $ajax 是否为Ajax方式 当数字时指定跳转时间
* @return void
protected function error($message,$jumpUrl='',$ajax=false) {
protected function error($message='',$jumpUrl='',$ajax=false) {
$this-&dispatchJump($message,0,$jumpUrl,$ajax);
@@ -307,7 +292,7 @@ abstract class Action {
* @param mixed $ajax 是否为Ajax方式 当数字时指定跳转时间
* @return void
protected function success($message,$jumpUrl='',$ajax=false) {
protected function success($message='',$jumpUrl='',$ajax=false) {
$this-&dispatchJump($message,1,$jumpUrl,$ajax);
@@ -420,8 +405,6 @@ abstract class Action {
* @access public
public function __destruct() {
// 保存日志
if(C('LOG_RECORD')) Log::save();
// 执行后续操作
tag('action_end');
@@ -25,6 +25,11 @@ class App {
* @return void
static public function init() {
// 页面压缩输出支持
if(C('OUTPUT_ENCODE')){
$zlib = ini_get('zlib.output_compression');
if(empty($zlib)) ob_start('ob_gzhandler');
// 设置系统时区
date_default_timezone_set(C('DEFAULT_TIMEZONE'));
// 加载动态项目公共文件和配置
@@ -43,11 +48,6 @@ class App {
// URL调度结束标签
tag('url_dispatch');
// 页面压缩输出支持
if(C('OUTPUT_ENCODE')){
$zlib = ini_get('zlib.output_compression');
if(empty($zlib)) ob_start('ob_gzhandler');
// 系统变量安全过滤
if(C('VAR_FILTERS')) {
explode(',',C('VAR_FILTERS'));
@@ -58,31 +58,6 @@ class App {
/* 获取模板主题名称 */
$templateSet =
C('DEFAULT_THEME');
if(C('TMPL_DETECT_THEME')) {// 自动侦测模板主题
$t = C('VAR_TEMPLATE');
if (isset($_GET[$t])){
$templateSet = $_GET[$t];
}elseif(cookie('think_template')){
$templateSet = cookie('think_template');
if(!in_array($templateSet,explode(',',C('THEME_LIST')))){
$templateSet =
C('DEFAULT_THEME');
cookie('think_template',$templateSet,864000);
/* 模板相关目录常量 */
define('THEME_NAME',
$templateSet);
// 当前模板主题名称
defined('GROUP_NAME')?GROUP_NAME.'/':'';
if(1==C('APP_GROUP_MODE')){ // 独立分组模式
define('THEME_PATH',
BASE_LIB_PATH.basename(TMPL_PATH).'/'.(THEME_NAME?THEME_NAME.'/':''));
define('APP_TMPL_PATH',__ROOT__.'/'.APP_NAME.(APP_NAME?'/':'').C('APP_GROUP_PATH').'/'.$group.basename(TMPL_PATH).'/'.(THEME_NAME?THEME_NAME.'/':''));
define('THEME_PATH',
TMPL_PATH.$group.(THEME_NAME?THEME_NAME.'/':''));
define('APP_TMPL_PATH',__ROOT__.'/'.APP_NAME.(APP_NAME?'/':'').basename(TMPL_PATH).'/'.$group.(THEME_NAME?THEME_NAME.'/':''));
C('CACHE_PATH',CACHE_PATH.$group);
//动态配置 TMPL_EXCEPTION_FILE,改为绝对地址
C('TMPL_EXCEPTION_FILE',realpath(C('TMPL_EXCEPTION_FILE')));
@@ -125,7 +100,6 @@ class App {
// 获取当前操作名 支持动态路由
$action = C('ACTION_NAME')?C('ACTION_NAME'):ACTION_NAME;
C('TEMPLATE_NAME',THEME_PATH.MODULE_NAME.C('TMPL_FILE_DEPR').$action.C('TMPL_TEMPLATE_SUFFIX'));
$action .=
C('ACTION_SUFFIX');
if(!preg_match('/^[A-Za-z](\w)*$/',$action)){
@@ -147,7 +121,7 @@ class App {
if(C('URL_PARAMS_BIND') && $method-&getNumberOfParameters()&0){
switch($_SERVER['REQUEST_METHOD']) {
case 'POST':
array_merge($_GET,$_POST);
case 'PUT':
parse_str(file_get_contents('php://input'), $vars);
@@ -207,12 +181,10 @@ class App {
App::exec();
// 项目结束标签
tag('app_end');
// 保存日志记录
if(C('LOG_RECORD')) Log::save();
static public function logo(){
return 'iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjVERDVENkZGQjkyNDExRTE5REY3RDQ5RTQ2RTRDQUJCIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjVERDVENzAwQjkyNDExRTE5REY3RDQ5RTQ2RTRDQUJCIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NURENUQ2RkRCOTI0MTFFMTlERjdENDlFNDZFNENBQkIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NURENUQ2RkVCOTI0MTFFMTlERjdENDlFNDZFNENBQkIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5fx6IRAAAMCElEQVR42sxae3BU1Rk/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';
\ No newline at end of file
@@ -52,6 +52,8 @@ class Db {
protected $comparison = array('eq'=&'=','neq'=&'&&','gt'=&'&','egt'=&'&=','lt'=&'&','elt'=&'&=','notlike'=&'NOT LIKE','like'=&'LIKE','in'=&'IN','notin'=&'NOT IN');
// 查询表达式
protected $selectSql
= 'SELECT%DISTINCT% %FIELD% FROM %TABLE%%JOIN%%WHERE%%GROUP%%HAVING%%ORDER%%LIMIT% %UNION%%COMMENT%';
// 参数绑定
protected $bind
= array();
* 取得数据库类实例
@@ -276,13 +278,44 @@ class Db {
protected function parseSet($data) {
foreach ($data as $key=&$val){
$this-&parseValue($val);
if(is_scalar($value)) // 过滤非标量数据
= $this-&parseKey($key).'='.$
if(is_array($val) && 'exp' == $val[0]){
$this-&parseKey($key).'='.$val[1];
}elseif(is_scalar($val)) { // 过滤非标量数据
if(C('DB_BIND_PARAM') && 0 !== strpos($val,':')){
md5($key);
$this-&parseKey($key).'=:'.$
$this-&bindParam($name,$val);
$this-&parseKey($key).'='.$this-&parseValue($val);
return ' SET '.implode(',',$set);
* 参数绑定
* @access protected
* @param string $name 绑定参数名
* @param mixed $value 绑定值
* @return void
protected function bindParam($name,$value){
$this-&bind[':'.$name]
* 参数绑定分析
* @access protected
* @param array $bind
* @return array
protected function parseBind($bind){
array_merge($this-&bind,$bind);
$this-&bind
* 字段名分析
* @access protected
@@ -390,6 +423,9 @@ class Db {
foreach ($where as $key=&$val){
$whereStr .= '( ';
if(is_numeric($key)){
= '_complex';
if(0===strpos($key,'_')) {
// 解析特殊条件表达式
.= $this-&parseThinkWhere($key,$val);
@@ -514,7 +550,7 @@ class Db {
case '_complex':
// 复合查询条件
$whereStr = substr($this-&parseWhere($val),6);
is_string($val)? $val : substr($this-&parseWhere($val),6);
case '_query':
// 字符串模式查询条件
@@ -662,16 +698,24 @@ class Db {
= array();
$this-&model
$options['model'];
foreach ($data as $key=&$val){
$this-&parseValue($val);
if(is_scalar($value)) { // 过滤非标量数据
if(is_array($val) && 'exp' == $val[0]){
$this-&parseKey($key);
}elseif(is_scalar($val)) { // 过滤非标量数据
$this-&parseKey($key);
if(C('DB_BIND_PARAM') && 0 !== strpos($val,':')){
md5($key);
$this-&bindParam($name,$val);
$this-&parseValue($val);
($replace?'REPLACE':'INSERT').' INTO '.$this-&parseTable($options['table']).' ('.implode(',', $fields).') VALUES ('.implode(',', $values).')';
.= $this-&parseLock(isset($options['lock'])?$options['lock']:false);
.= $this-&parseComment(!empty($options['comment'])?$options['comment']:'');
return $this-&execute($sql);
return $this-&execute($sql,$this-&parseBind(!empty($options['bind'])?$options['bind']:array()));
@@ -688,7 +732,7 @@ class Db {
array_walk($fields, array($this, 'parseKey'));
'INSERT INTO '.$this-&parseTable($table).' ('.implode(',', $fields).') ';
.= $this-&buildSelectSql($options);
return $this-&execute($sql);
return $this-&execute($sql,$this-&parseBind(!empty($options['bind'])?$options['bind']:array()));
@@ -708,7 +752,7 @@ class Db {
.$this-&parseLimit(!empty($options['limit'])?$options['limit']:'')
.$this-&parseLock(isset($options['lock'])?$options['lock']:false)
.$this-&parseComment(!empty($options['comment'])?$options['comment']:'');
return $this-&execute($sql);
return $this-&execute($sql,$this-&parseBind(!empty($options['bind'])?$options['bind']:array()));
@@ -726,7 +770,7 @@ class Db {
.$this-&parseLimit(!empty($options['limit'])?$options['limit']:'')
.$this-&parseLock(isset($options['lock'])?$options['lock']:false)
.$this-&parseComment(!empty($options['comment'])?$options['comment']:'');
return $this-&execute($sql);
return $this-&execute($sql,$this-&parseBind(!empty($options['bind'])?$options['bind']:array()));
@@ -746,7 +790,7 @@ class Db {
= $this-&query($sql);
= $this-&query($sql,$this-&parseBind(!empty($options['bind'])?$options['bind']:array()));
if($cache && false !== $result ) { // 查询缓存写入
S($key,$result,$cache);
@@ -26,7 +26,7 @@ class Dispatcher {
static public function dispatch() {
C('URL_MODEL');
if(!empty($_GET[C('VAR_PATHINFO')])) { // 判断URL里面是否有兼容模式参数
if(isset($_GET[C('VAR_PATHINFO')])) { // 判断URL里面是否有兼容模式参数
$_SERVER['PATH_INFO']
= $_GET[C('VAR_PATHINFO')];
unset($_GET[C('VAR_PATHINFO')]);
@@ -47,15 +47,20 @@ class Dispatcher {
// 开启子域名部署
if(C('APP_SUB_DOMAIN_DEPLOY')) {
= C('APP_SUB_DOMAIN_RULES');
$subDomain
= strtolower(substr($_SERVER['HTTP_HOST'],0,strpos($_SERVER['HTTP_HOST'],'.')));
define('SUB_DOMAIN',$subDomain); // 二级域名定义
if($subDomain && isset($rules[$subDomain])) {
$rules[$subDomain];
}elseif(isset($rules['*'])){ // 泛域名支持
if('www' != $subDomain && !in_array($subDomain,C('APP_SUB_DOMAIN_DENY'))) {
$rules['*'];
if(isset($rules[$_SERVER['HTTP_HOST']])) { // 完整域名或者IP配置
$rule = $rules[$_SERVER['HTTP_HOST']];
$subDomain
= strtolower(substr($_SERVER['HTTP_HOST'],0,strpos($_SERVER['HTTP_HOST'],'.')));
define('SUB_DOMAIN',$subDomain); // 二级域名定义
if($subDomain && isset($rules[$subDomain])) {
$rules[$subDomain];
}elseif(isset($rules['*'])){ // 泛域名支持
if('www' != $subDomain && !in_array($subDomain,C('APP_SUB_DOMAIN_DENY'))) {
$rules['*'];
if(!empty($rule)) {
// 子域名部署规则 '子域名'=&array('分组名/[模块名]','var1=a&var2=b');
explode('/',$rule[0]);
@@ -75,7 +80,7 @@ class Dispatcher {
// 分析PATHINFO信息
if(empty($_SERVER['PATH_INFO'])) {
if(!isset($_SERVER['PATH_INFO'])) {
explode(',',C('URL_PATHINFO_FETCH'));
foreach ($types as $type){
if(0===strpos($type,':')) {// 支持函数判断
@@ -93,11 +98,18 @@ class Dispatcher {
tag('path_info');
pathinfo($_SERVER['PATH_INFO']);
define('__EXT__', isset($part['extension'])?strtolower($part['extension']):'');
if(C('URL_HTML_SUFFIX')) {
$_SERVER['PATH_INFO'] = preg_replace('/\.('.trim(C('URL_HTML_SUFFIX'),'.').')$/i', '', $_SERVER['PATH_INFO']);
}elseif(__EXT__) {
$_SERVER['PATH_INFO'] = preg_replace('/.'.__EXT__.'$/i','',$_SERVER['PATH_INFO']);
if(__EXT__){
if(C('URL_DENY_SUFFIX') && preg_match('/\.('.trim(C('URL_DENY_SUFFIX'),'.').')$/i', $_SERVER['PATH_INFO'])){
send_http_status(404);
if(C('URL_HTML_SUFFIX')) {
$_SERVER['PATH_INFO'] = preg_replace('/\.('.trim(C('URL_HTML_SUFFIX'),'.').')$/i', '', $_SERVER['PATH_INFO']);
$_SERVER['PATH_INFO'] = preg_replace('/.'.__EXT__.'$/i','',$_SERVER['PATH_INFO']);
if(!self::routerCheck()){
// 检测路由规则 如果没有则按默认规则调度URL
$paths = explode($depr,trim($_SERVER['PATH_INFO'],'/'));
if(C('VAR_URL_PARAMS')) {
@@ -121,6 +133,8 @@ class Dispatcher {
array_merge($var,$_GET);
define('__INFO__',$_SERVER['PATH_INFO']);
define('__INFO__','');
// URL常量
@@ -132,7 +146,7 @@ class Dispatcher {
if (C('APP_GROUP_LIST')) {
define('GROUP_NAME', self::getGroup(C('VAR_GROUP')));
// 分组URL地址
define('__GROUP__',(!empty($domainGroup) || strtolower(GROUP_NAME) == strtolower(C('DEFAULT_GROUP')) )?__APP__ : __APP__.'/'.GROUP_NAME);
define('__GROUP__',(!empty($domainGroup) || strtolower(GROUP_NAME) == strtolower(C('DEFAULT_GROUP')) )?__APP__ : __APP__.'/'.(C('URL_CASE_INSENSITIVE') ? strtolower(GROUP_NAME) : GROUP_NAME));
// 定义项目基础加载路径
@@ -164,9 +178,9 @@ class Dispatcher {
// 当前模块和分组地址
$moduleName
defined('MODULE_ALIAS')?MODULE_ALIAS:MODULE_NAME;
if(defined('GROUP_NAME')) {
define('__URL__',!empty($domainModule)?__GROUP__.$depr : __GROUP__.$depr.$moduleName);
define('__URL__',!empty($domainModule)?__GROUP__.$depr : __GROUP__.$depr.( C('URL_CASE_INSENSITIVE') ? strtolower($moduleName) : $moduleName ) );
define('__URL__',!empty($domainModule)?__APP__.'/' : __APP__.'/'.$moduleName);
define('__URL__',!empty($domainModule)?__APP__.'/' : __APP__.'/'.( C('URL_CASE_INSENSITIVE') ? strtolower($moduleName) : $moduleName) );
// 当前操作地址
define('__ACTION__',__URL__.$depr.(defined('ACTION_ALIAS')?ACTION_ALIAS:ACTION_NAME));
@@ -251,4 +265,4 @@ class Dispatcher {
return strip_tags(C('URL_CASE_INSENSITIVE') ?ucfirst(strtolower($group)):$group);
\ No newline at end of file
@@ -60,7 +60,7 @@ class Model {
// 是否批处理验证
protected $patchValidate
// 链操作方法列表
protected $methods
array('table','order','alias','having','group','lock','distinct','auto','filter','validate');
protected $methods
array('table','order','alias','having','group','lock','distinct','auto','filter','validate','result','bind','token');
* 架构函数
@@ -112,7 +112,7 @@ class Model {
$this-&dbName?$this-&dbName:C('DB_NAME');
$fields = F('_fields/'.strtolower($db.'.'.$this-&name));
if($fields) {
C('DB_FIELD_VERISON');
C('DB_FIELD_VERSION');
if(empty($version) || $fields['_version']== $version) {
$this-&fields
@@ -148,7 +148,7 @@ class Model {
// 记录字段类型信息
$this-&fields['_type'] =
if(C('DB_FIELD_VERISON')) $this-&fields['_version'] =
C('DB_FIELD_VERISON');
if(C('DB_FIELD_VERSION')) $this-&fields['_version'] =
C('DB_FIELD_VERSION');
增加缓存开关控制
if(C('DB_FIELDS_CACHE')){
@@ -546,7 +546,7 @@ class Model {
$options['model']
// 字段类型验证
if(isset($options['where']) && is_array($options['where']) && !empty($fields)) {
if(isset($options['where']) && is_array($options['where']) && !empty($fields) && !isset($options['join'])) {
// 对数组查询条件进行字段类型检查
foreach ($options['where'] as $key=&$val){
trim($key);
@@ -554,7 +554,7 @@ class Model {
if(is_scalar($val)) {
$this-&_parseType($options['where'],$key);
}elseif('_' != substr($key,0,1) && false === strpos($key,'.') && false === strpos($key,'(') && false === strpos($key,'|') && false === strpos($key,'&')){
}elseif(!is_numeric($key) && '_' != substr($key,0,1) && false === strpos($key,'.') && false === strpos($key,'(') && false === strpos($key,'|') && false === strpos($key,'&')){
unset($options['where'][$key]);
@@ -575,13 +575,15 @@ class Model {
* @return void
protected function _parseType(&$data,$key) {
$fieldType = strtolower($this-&fields['_type'][$key]);
if(false === strpos($fieldType,'bigint') && false !== strpos($fieldType,'int')) {
$data[$key]
intval($data[$key]);
}elseif(false !== strpos($fieldType,'float') || false !== strpos($fieldType,'double')){
$data[$key]
floatval($data[$key]);
}elseif(false !== strpos($fieldType,'bool')){
$data[$key]
(bool)$data[$key];
if(empty($this-&options['bind'][':'.$key])){
$fieldType = strtolower($this-&fields['_type'][$key]);
if(false === strpos($fieldType,'bigint') && false !== strpos($fieldType,'int')) {
$data[$key]
intval($data[$key]);
}elseif(false !== strpos($fieldType,'float') || false !== strpos($fieldType,'double')){
$data[$key]
floatval($data[$key]);
}elseif(false !== strpos($fieldType,'bool')){
$data[$key]
(bool)$data[$key];
@@ -610,11 +612,29 @@ class Model {
$this-&data
$resultSet[0];
$this-&_after_find($this-&data,$options);
if(!empty($this-&options['result'])) {
return $this-&returnResult($this-&data,$this-&options['result']);
return $this-&
// 查询成功的回调方法
protected function _after_find(&$result,$options) {}
protected function returnResult($data,$type=''){
if ($type){
if(is_callable($type)){
return call_user_func($type,$data);
switch (strtolower($type)){
case 'json':
return json_encode($data);
case 'xml':
return xml_encode($data);
* 处理字段映射
* @access public
@@ -783,7 +803,7 @@ class Model {
if(!$this-&autoValidation($data,$type))
// 表单令牌验证
if(C('TOKEN_ON') && !$this-&autoCheckToken($data)) {
if(!$this-&autoCheckToken($data)) {
$this-&error = L('_TOKEN_ERROR_');
@@ -811,6 +831,8 @@ class Model {
// 自动表单令牌验证
ajax无刷新多次提交暂不能满足
public function autoCheckToken($data) {
// 支持使用token(false) 关闭令牌验证
if(isset($this-&options['token']) && !$this-&options['token'])
if(C('TOKEN_ON')){
= C('TOKEN_NAME');
if(!isset($data[$name]) || !isset($_SESSION[$name])) { // 令牌数据无效
@@ -839,7 +861,7 @@ class Model {
public function regex($value,$rule) {
$validate = array(
'/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/',
'/^http(s?):\/\/(?:[A-za-z0-9-]+\.)+[A-za-z]{2,4}(?:[\/\?#][\/=\?%\-&~`@[\]\':+!\.#\w]*)?$/',
'currency'
'/^\d+(\.\d+)?$/',
@@ -969,6 +991,8 @@ class Model {
* @return boolean
protected function _validationField($data,$val) {
if($this-&patchValidate && isset($this-&error[$val[0]]))
+ //当前字段已经有规则验证没有通过
if(false === $this-&_validationFieldItem($data,$val)){
if($this-&patchValidate) {
$this-&error[$val[0]]
@@ -245,7 +245,18 @@ class Think {
* @param mixed $e 异常对象
static public function appException($e) {
halt($e-&__toString());
$error = array();
$error['message']
= $e-&getMessage();
$e-&getTrace();
if('throw_exception'==$trace[0]['function']) {
$error['file']
$trace[0]['file'];
$error['line']
$trace[0]['line'];
$error['file']
= $e-&getFile();
$error['line']
= $e-&getLine();
Log::record($error['message'],Log::ERR);
halt($error);
@@ -286,8 +297,19 @@ class Think {
// 致命错误捕获
static public function fatalError() {
// 保存日志记录
if(C('LOG_RECORD')) Log::save();
if ($e = error_get_last()) {
Think::appError($e['type'],$e['message'],$e['file'],$e['line']);
switch($e['type']){
case E_ERROR:
case E_PARSE:
case E_CORE_ERROR:
case E_COMPILE_ERROR:
case E_USER_ERROR:
ob_end_clean();
function_exists('halt')?halt($e):exit('ERROR:'.$e['message']);
@@ -17,71 +17,4 @@
liu21st &&
class ThinkException extends Exception {
* 异常类型
* @var string
* @access private
// 是否存在多余调试信息
* 架构函数
* @access public
* @param string $message
public function __construct($message,$code=0,$extra=false) {
parent::__construct($message,$code);
$this-&type = get_class($this);
$this-&extra = $
* 异常输出 所有异常处理类均通过__toString方法输出错误
* 每次异常都会写入系统日志
* 该方法可以被子类重载
* @access public
* @return array
public function __toString() {
$trace = $this-&getTrace();
if($this-&extra)
// 通过throw_exception抛出的异常要去掉多余的调试信息
array_shift($trace);
$this-&class
isset($trace[0]['class'])?$trace[0]['class']:'';
$this-&function =
isset($trace[0]['function'])?$trace[0]['function']:'';
$this-&file
$trace[0]['file'];
$this-&line
$trace[0]['line'];
file($this-&file);
$traceInfo
$time = date('y-m-d H:i:m');
foreach($trace as $t) {
$traceInfo .= '['.$time.'] '.$t['file'].' ('.$t['line'].') ';
$traceInfo .= $t['class'].$t['type'].$t['function'].'(';
$traceInfo .= implode(', ', $t['args']);
$traceInfo .=&)\n&;
$error['message']
$error['type']
$error['detail']
= L('_MODULE_').'['.MODULE_NAME.'] '.L('_ACTION_').'['.ACTION_NAME.']'.&\n&;
$error['detail']
($this-&line-2).': '.$file[$this-&line-3];
$error['detail']
($this-&line-1).': '.$file[$this-&line-2];
$error['detail']
'&font color=&#FF6600& &'.($this-&line).': &strong&'.$file[$this-&line-1].'&/strong&&/font&';
$error['detail']
($this-&line+1).': '.$file[$this-&line];
$error['detail']
($this-&line+2).': '.$file[$this-&line+1];
$error['class']
$error['function']
$error['file']
$error['line']
$error['trace']
// 记录 Exception 日志
if(C('LOG_EXCEPTION_RECORD')) {
Log::Write('('.$this-&type.') '.$this-&message);
\ No newline at end of file
@@ -21,8 +21,15 @@ class View {
* 模板输出变量
* @var tVar
* @access protected
protected $tVar
protected $tVar
* 模板主题
* @var theme
* @access protected
protected $theme
* 模板变量赋值
@@ -102,8 +109,7 @@ class View {
public function fetch($templateFile='',$content='',$prefix='') {
if(empty($content)) {
// 模板文件解析标签
tag('view_template',$templateFile);
$templateFile
$this-&parseTemplate($templateFile);
// 模板文件不存在直接返回
if(!is_file($templateFile)) return NULL;
@@ -127,4 +133,82 @@ class View {
// 输出模板文件
* 自动定位模板文件
* @access protected
* @param string $template 模板文件规则
* @return string
public function parseTemplate($template='') {
if(is_file($template)) {
$template = str_replace(':', '/', $template);
// 获取当前主题名称
$theme = $this-&getTemplateTheme();
// 获取当前模版分组
defined('GROUP_NAME')?GROUP_NAME.'/':'';
if(defined('GROUP_NAME') && strpos($template,'@')){ // 跨分组调用模版文件
list($group,$template)
explode('@',$template);
// 获取当前主题的模版路径
if(1==C('APP_GROUP_MODE')){ // 独立分组模式
define('THEME_PATH',
dirname(BASE_LIB_PATH).'/'.$group.basename(TMPL_PATH).'/'.$theme);
define('APP_TMPL_PATH',__ROOT__.'/'.APP_NAME.(APP_NAME?'/':'').C('APP_GROUP_PATH').'/'.$group.basename(TMPL_PATH).'/'.$theme);
define('THEME_PATH',
TMPL_PATH.$group.$theme);
define('APP_TMPL_PATH',__ROOT__.'/'.APP_NAME.(APP_NAME?'/':'').basename(TMPL_PATH).'/'.$group.$theme);
// 分析模板文件规则
if('' == $template) {
// 如果模板文件名为空 按照默认规则定位
$template = MODULE_NAME . '/' . ACTION_NAME;
}elseif(false === strpos($template, '/')){
$template = MODULE_NAME . '/' . $
return THEME_PATH.$template.C('TMPL_TEMPLATE_SUFFIX');
* 设置当前输出的模板主题
* @access public
mixed $theme 主题名称
* @return View
public function theme($theme){
$this-&theme = $
* 获取当前的模板主题
* @access private
* @return string
private function getTemplateTheme() {
if($this-&theme) { // 指定模板主题
$theme = $this-&
/* 获取模板主题名称 */
C('DEFAULT_THEME');
if(C('TMPL_DETECT_THEME')) {// 自动侦测模板主题
$t = C('VAR_TEMPLATE');
if (isset($_GET[$t])){
$theme = $_GET[$t];
}elseif(cookie('think_template')){
$theme = cookie('think_template');
if(!in_array($theme,explode(',',C('THEME_LIST')))){
C('DEFAULT_THEME');
cookie('think_template',$theme,864000);
define('THEME_NAME',
// 当前模板主题名称
return $theme?$theme . '/':'';
\ No newline at end of file
@@ -41,15 +41,9 @@ class CacheFile extends Cache {
* @return boolen
private function init() {
$stat = stat($this-&options['temp']);
$dir_perms = $stat['mode'] & 0007777; // Get the permission bits.
$file_perms = $dir_perms & 0000666; // Remove execute bits for files.
// 创建项目缓存目录
if (!is_dir($this-&options['temp'])) {
mkdir($this-&options['temp']))
chmod($this-&options['temp'], $dir_perms);
mkdir($this-&options['temp']);
@@ -174,14 +168,17 @@ class CacheFile extends Cache {
public function clear() {
$this-&options['temp'];
if ( $dir = opendir( $path ) ) {
while ( $file = readdir( $dir ) ) {
$check = is_dir( $file );
if ( !$check )
scandir($path);
if($files){
foreach($files as $file){
if ($file != '.' && $file != '..' && is_dir($path.$file) ){
array_map( 'unlink', glob( $path.$file.'/*.*' ) );
}elseif(is_file($path.$file)){
unlink( $path . $file );
closedir( $dir );
\ No newline at end of file
@@ -90,6 +90,7 @@ class DbMysql extends Db{
public function query($str) {
if(0===stripos($str, 'call')){ // 存储过程查询支持
$this-&close();
$this-&connected
$this-&initConnect(false);
if ( !$this-&_linkID )
@@ -217,7 +218,7 @@ class DbMysql extends Db{
$info[$val['Field']] = array(
=& $val['Field'],
=& $val['Type'],
'notnull' =& (bool) ($val['Null'] === ''), // not null is empty, null is yes
'notnull' =& (bool) (strtoupper($val['Null']) === 'NO'), // not null is empty, null is yes
'default' =& $val['Default'],
'primary' =& (strtolower($val['Key']) == 'pri'),
'autoinc' =& (strtolower($val['Extra']) == 'auto_increment'),
@@ -311,7 +312,7 @@ class DbMysql extends Db{
* @return string
public function error() {
$this-&error = mysql_error($this-&_linkID);
$this-&error = mysql_errno().':'.mysql_error($this-&_linkID);
if('' != $this-&queryStr){
$this-&error .= &\n [ SQL语句 ] : &.$this-&queryS
@@ -306,7 +306,7 @@ class DbMysqli extends Db{
* @return string
public function error() {
$this-&error = $this-&_linkID-&err
$this-&error = $this-&_linkID-&errno.':'.$this-&_linkID-&err
if('' != $this-&queryStr){
$this-&error .= &\n [ SQL语句 ] : &.$this-&queryS
@@ -360,7 +360,7 @@ class TagLibCx extends TagLib {
if($type=='between') {
$parseStr = '&?php $_RANGE_VAR_='.$str.';if('.$name.'&= $_RANGE_VAR_[0] && '.$name.'&= $_RANGE_VAR_[1]):?&'.$content.'&? ?&';
}elseif($type=='notbetween'){
$parseStr = '&?php $_RANGE_VAR_='.$str.';if('.$name.'&$_RANGE_VAR_[0] && '.$name.'&$_RANGE_VAR_[1]):?&'.$content.'&? ?&';
$parseStr = '&?php $_RANGE_VAR_='.$str.';if('.$name.'&$_RANGE_VAR_[0] || '.$name.'&$_RANGE_VAR_[1]):?&'.$content.'&? ?&';
($type == 'in')? 'in_array'
'!in_array';
= '&?php if('.$fun.'(('.$name.'), '.$str.')): ?&'.$content.'&? ?&';
@@ -639,4 +639,4 @@ class TagLibCx extends TagLib {
return $parseS
\ No newline at end of file
@@ -508,7 +508,7 @@ class
ThinkTemplate {
$name = &$&.$
preg_match('/(.+?)\[(.+?)\]/is',$var,$match);
$var = $match[1];
}elseif(false !==strpos($var,':') && false ===strpos($var,'::') && false ===strpos($var,'?')){
}elseif(false !==strpos($var,':') && false ===strpos($var,'(') && false ===strpos($var,'::') && false ===strpos($var,'?')){
//支持 {$var:property} 方式输出对象的属性
$vars = explode(':',$var);
str_replace(':','-&',$var);
@@ -671,16 +671,25 @@ class
ThinkTemplate {
foreach ($array as $templateName){
if(false === strpos($templateName,$this-&config['template_suffix'])) {
// 解析规则为 模板主题:模块:操作 不支持 跨项目和跨分组调用
explode(':',$templateName);
$action = array_pop($path);
$module = !empty($path)?array_pop($path):MODULE_NAME;
if(!empty($path) && THEME_NAME) {// 设置模板主题
$path = dirname(THEME_PATH).'/'.array_pop($path).'/';
// 解析规则为 分组@模板主题:模块:操作
if(strpos($templateName,'@')){
list($group,$templateName) =
explode('@',$templateName);
if(1==C('APP_GROUP_MODE')){
dirname(BASE_LIB_PATH).'/'.$group.'/'.basename(TMPL_PATH).'/'.(THEME_NAME?THEME_NAME.'/':'');
TMPL_PATH.'/'.$group.'/'.(THEME_NAME?THEME_NAME.'/':'');
$path = THEME_PATH;
THEME_PATH;
$templateName
$path.$module.C('TMPL_FILE_DEPR').$action.$this-&config['template_suffix'];
$templateName = str_replace(':', '/', $templateName);
explode('/',$templateName);
array_pop($path);
!empty($path)?array_pop($path):MODULE_NAME;
if(!empty($path)) {// 设置模板主题
$basePath = dirname($basePath).'/'.array_pop($path).'/';
$templateName
$basePath.$module.C('TMPL_FILE_DEPR').$action.$this-&config['template_suffix'];
// 获取模板文件内容
$parseStr .= file_get_contents($templateName);
@@ -3,9 +3,9 @@
+-------------------------------------------------------------------
| 憭折??喟? 撘?????? WE CAN DO IT,JUST THINK
+-------------------------------------------------------------------
-| ???靽⊥?嚗?hinkPHP 3.1 Release
+| ???靽⊥?嚗?hinkPHP 3.1.3 Release
+-------------------------------------------------------------------
-| Copyright(c) 2
All rights reserved.
+| Copyright(c) 3
All rights reserved.
+-------------------------------------------------------------------
[ 蝞?隞? ]
@@ -16,7 +16,7 @@ ThinkPHP ?臭?銝芸?韐孵?皞??嚗?翰?????????W?撖寡情?? 頧駁?蝥判
蝷曉??a???妖???銝??嚗??????扼???撅??批??扯??寥?銝??隡?????餈??隡??
??????靘?&靽??隞亦迅摰??鈭??銝?誑????瑞漣???????
-蝏??6撟渡?銝??蝘舐敞??????3.0????冽??嗅?撅??摰?????撅???Z?鈭?????
+蝏??6撟渡?銝??蝘舐敞??????3.*????冽??嗅?撅??摰?????撅???Z?鈭?????
雿踹?摨?????????游???瘙????摨行????憭改??賢?皛∟雲銝??蝔?漲?????犖???
??瘙??????撘??鈭???啁?CBD嚗??敹?+銵?蛹+撽勗?嚗????芋撘???典?????IY獢??
??OP蝻??雿??嚗?悟ThinkPHP?賢??其?????a??賢翰??說頞喲★?桀?摨?????瘙??
@@ -87,8 +87,8 @@ AJAX?舀?嚗??蝵桀?摰X?蝡舀??喟?AJAX?唳?餈???寞?嚗????SON??M
餈??摰X?蝡荔?????臭誑?拙?餈???唳??澆?嚗?頂蝏??蝏??隞颱?AJAX蝐餃?嚗?????雿?
?刻?撌梁????AJAX蝐餃?餈???????
-SAE?舀?嚗??靘???唳答SAE撟喳???撩???????瑕???赤頝冽?把?????像皛??把????舀??砍???
-撘????靚??隞亙??函蔡???嚗?悟雿?蝠?曇?皜∪?SAE撘??????????啁?SAE撘????撉???
+鈭???????????鈭??瘚杵AE撟喳????摨冰AE撟喳???撩???????瑕???赤頝冽?把?????像皛??把????舀??砍???
+撘????靚??隞亙??函蔡???嚗?悟雿?蝠?曇?皜∴???????啁?撘????撉???
RESTFul?舀?嚗?EST璅∪????鈭?ESTFul?舀?嚗?蛹雿??????啁?URL霈曇恣??挪?桐?撉??
???銝箸?????冽?靘???舀???
@@ -124,4 +124,4 @@ ThinkPHP???摰??嚗??頧確hinkPHP?詨????????渡?銋??嚗??閫???
?孵?閬?腦靚㎡hinkPHP?a???????瘜典??舀?ThinkPHP????瑯??
-?游???捆?????窈霈輸?ThinkPHP摰??蝵??/ ??捏?? ??
\ No newline at end of file
+?游???捆?????窈霈輸?ThinkPHP摰??蝵??/??
\ No newline at end of file
@@ -18,12 +18,12 @@ if(MEMORY_LIMIT_ON) $GLOBALS['_startUseMems'] = memory_get_usage();
// 系统目录定义
defined('THINK_PATH')
or define('THINK_PATH', dirname(__FILE__).'/');
defined('APP_PATH')
or define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']).'/');
-defined('RUNTIME_PATH') or define('RUNTIME_PATH',APP_PATH.'Runtime/');
defined('APP_DEBUG')
or define('APP_DEBUG',false); // 是否调试模式
if(defined('ENGINE_NAME')) {
defined('ENGINE_PATH') or define('ENGINE_PATH',THINK_PATH.'Extend/Engine/');
require ENGINE_PATH.strtolower(ENGINE_NAME).'.php';
defined('RUNTIME_PATH') or define('RUNTIME_PATH',realpath(APP_PATH).'/Runtime/');
$runtime = defined('MODE_NAME')?'~'.strtolower(MODE_NAME).'_runtime.php':'~runtime.php';
defined('RUNTIME_FILE') or define('RUNTIME_FILE',RUNTIME_PATH.$runtime);
if(!APP_DEBUG && is_file(RUNTIME_FILE)) {
后才可以发表评论

我要回帖

更多关于 一组最火猫咪表情包 的文章

 

随机推荐