dede的模块开发一
首先包含的是include/common.inc.php
现在我们能分析一下,他的作用。
第一段
error_reporting(E_ALL || ~E_NOTICE);
define('DEDEINC', str_replace("\\", '/', dirname(__FILE__) ) );
define('DEDEROOT', str_replace("\\", '/', substr(DEDEINC,0,-8) ) );
define('DEDEDATA', DEDEROOT.'/data');
define('DEDEMEMBER', DEDEROOT.'/member');
define('DEDETEMPLATE', DEDEROOT.'/templets');
==========================================
首先是屏蔽错误,然后定义几个目录,没什么讲的....
***************************************
第二段
define('DEDEMODEL', './model');
define('DEDECONTROL', './control');
define('DEDEAPPTPL', './templates');
**********************************
定义模型相对目录
**********************************
define('DEBUG_LEVEL', TRUE);
if (version_compare(PHP_VERSION, '5.3.0', '<'))
{
set_magic_quotes_runtime(0);
}
//是否启用mb_substr替换cn_substr来提高效率
$cfg_is_mb = $cfg_is_iconv = FALSE;
if(function_exists('mb_substr')) $cfg_is_mb = TRUE;
if(function_exists('iconv_substr')) $cfg_is_iconv = TRUE;
定义常量,和替换个替换函数,这一段也很理解,注意他的变量开头都是$cfg
下面进行过滤用的到啊.............
============================================================
第三段:
function _RunMagicQuotes(&$svar)
{
if(!get_magic_quotes_gpc())
{
if( is_array($svar) )
{
foreach($svar as $_k => $_v) $svar[$_k] = _RunMagicQuotes($_v);
}
else
{
if( strlen($svar)>0 && preg_match('#^(cfg_|GLOBALS|_GET|_POST|_COOKIE)#',$svar) )
{
exit('Request var not allow!');
}
$svar = addslashes($svar);
}
}
return $svar;
}
定义一个函数,直接改变变量,先通过get_mageic_qutoes_gpc判断对提交的数据进行判断是否转义,然后返回数组;函数用到迭代....
=========================================================================
第三段
if (!defined('DEDEREQUEST'))
{
//检查和注册外部提交的变量 (2011.8.10 修改登录时相关过滤)
function CheckRequest(&$val) {
if (is_array($val)) {
foreach ($val as $_k=>$_v) {
if($_k == 'nvarname') continue;//这句话不理解啊.....
CheckRequest($_k); //对传递值文字索引进行判断,是否是全局,url,表单获得的》。。。
CheckRequest($val[$_k]); //对传递过去值默认是上面的返回的,再进行重复验证。
}
} else
{
if( strlen($val)>0 && preg_match('#^(cfg_|GLOBALS|_GET|_POST|_COOKIE)#',$val) )
{
exit('Request var not allow!');
}
}
}
//var_dump($_REQUEST);exit;
CheckRequest($_REQUEST);
foreach(Array('_GET','_POST','_COOKIE') as $_request)
{
foreach($$_request as $_k => $_v) ${$_k} = _RunMagicQuotes($_v);
}
}
先是定义一个自定义过滤函数,过滤指定类型,然后再过滤$_request这个数组,学php的都应该知道,这个数组代表了post,get,cookie,超级全局数组,其实超级全局数组,最好用的.
然后对数组值进行循环替换成已经经过转义的数据。
这里大家还要注意一下,前提条件DEDEREQUEST这个常量没定义之前,是这么进行过滤的,估计后面还要个其他的过滤方式,以后再说.....
===================================================
第五段
//系统相关变量检测
if(!isset($needFilter))
{
$needFilter = false;
}
$registerGlobals = @ini_get("register_globals");
$isUrlOpen = @ini_get("allow_url_fopen");
$isSafeMode = @ini_get("safe_mode");
if( preg_match('/windows/i', @getenv('OS')) )
{
$isSafeMode = false;
}
//Session保存路径
$sessSavePath = DEDEDATA."/sessions/";
if(is_writeable($sessSavePath) && is_readable($sessSavePath))
{
session_save_path($sessSavePath);
}
//系统配置参数
require_once(DEDEDATA."/config.cache.inc.php");
//转换上传的文件相关的变量及安全处理、并引用前台通用的上传函数
if($_FILES)
{
require_once(DEDEINC.'/uploadsafe.inc.php');
}
//数据库配置文件
require_once(DEDEDATA.'/common.inc.php');
//载入系统验证安全配置
if(file_exists(DEDEDATA.'/safe/inc_safe_config.php'))
{
require_once(DEDEDATA.'/safe/inc_safe_config.php');
if(!empty($safe_faqs)) $safefaqs = unserialize($safe_faqs);
}
//Session跨域设置
if(!empty($cfg_domain_cookie))
{
@session_set_cookie_params(0,'/',$cfg_domain_cookie);
}
//php5.1版本以上时区设置
//由于这个函数对于是php5.1以下版本并无意义,因此实际上的时间调用,应该用MyDate函数调用
if(PHP_VERSION > '5.1')
{
$time51 = $cfg_cli_time * -1;
@date_default_timezone_set('Etc/GMT'.$time51);
}
$cfg_isUrlOpen = @ini_get("allow_url_fopen");
//用户访问的网站host
$cfg_clihost = 'http://'.$_SERVER['HTTP_HOST'];
//站点根目录
$cfg_basedir = preg_replace('#'.$cfg_cmspath.'\/include$#i', '', DEDEINC);
if($cfg_multi_site == 'Y')
{
$cfg_mainsite = $cfg_basehost;
}
else
{
$cfg_mainsite = '';
}
//模板的存放目录
$cfg_templets_dir = $cfg_cmspath.'/templets';
$cfg_templeturl = $cfg_mainsite.$cfg_templets_dir;
$cfg_templets_skin = empty($cfg_df_style)? $cfg_mainsite.$cfg_templets_dir."/default" : $cfg_mainsite.$cfg_templets_dir."/$cfg_df_style";
//cms安装目录的网址
$cfg_cmsurl = $cfg_mainsite.$cfg_cmspath;
//插件目录,这个目录是用于存放计数器、投票、评论等程序的必要动态程序
$cfg_plus_dir = $cfg_cmspath.'/plus';
$cfg_phpurl = $cfg_mainsite.$cfg_plus_dir;
$cfg_data_dir = $cfg_cmspath.'/data';
$cfg_dataurl = $cfg_mainsite.$cfg_data_dir;
//会员目录
$cfg_member_dir = $cfg_cmspath.'/member';
$cfg_memberurl = $cfg_mainsite.$cfg_member_dir;
//专题列表的存放路径
$cfg_special = $cfg_cmspath.'/special';
$cfg_specialurl = $cfg_mainsite.$cfg_special;
//附件目录
$cfg_medias_dir = $cfg_cmspath.$cfg_medias_dir;
$cfg_mediasurl = $cfg_mainsite.$cfg_medias_dir;
//上传的普通图片的路径,建议按默认
$cfg_image_dir = $cfg_medias_dir.'/allimg';
//上传的缩略图
$ddcfg_image_dir = $cfg_medias_dir.'/litimg';
//用户投稿图片存放目录
$cfg_user_dir = $cfg_medias_dir.'/userup';
//上传的软件目录
$cfg_soft_dir = $cfg_medias_dir.'/soft';
//上传的多媒体文件目录
$cfg_other_medias = $cfg_medias_dir.'/media';
//软件摘要信息,****请不要删除本项**** 否则系统无法正确接收系统漏洞或升级信息
$cfg_version = 'V57_GBK';
$cfg_soft_lang = 'gb2312';
$cfg_soft_public = 'base';
$cfg_softname = '织梦内容管理系统';
$cfg_soft_enname = 'DedeCMS';
$cfg_soft_devteam = 'DedeCMS官方团队';
//文档的默认命名规则
$art_shortname = $cfg_df_ext = '.html';
$cfg_df_namerule = '{typedir}/{Y}/{M}{D}/{aid}'.$cfg_df_ext;
//新建目录的权限,如果你使用别的属性,本程不保证程序能顺利在Linux或Unix系统运行
if(isset($cfg_ftp_mkdir) && $cfg_ftp_mkdir=='Y')
{
$cfg_dir_purview = '0755';
}
else
{
$cfg_dir_purview = 0755;
}
//会员是否使用精简模式(已禁用)
$cfg_mb_lit = 'N';
//特殊全局变量
$_sys_globals['curfile'] = '';
$_sys_globals['typeid'] = 0;
$_sys_globals['typename'] = '';
$_sys_globals['aid'] = 0;
if(empty($cfg_addon_savetype))
{
$cfg_addon_savetype = 'Ymd';
}
if($cfg_sendmail_bysmtp=='Y' && !empty($cfg_smtp_usermail))
{
$cfg_adminemail = $cfg_smtp_usermail;
}
这一段大家看到了,非常的长,但是很简答,载入数据库操作文件啊,或者载入安全文件,其实安全文件就是限定一些文件类型啊,然后定义各种目录的路径,很简答,却非常实用...貌似快完了
===================================
// 设定缓存配置信息
if ($cfg_memcache_enable == 'Y')
{
$cache_helper_config = array();
$cache_helper_config['memcache']['is_mc_enable'] = $GLOBALS["cfg_memcache_enable"];
$cache_helper_config['memcache']['mc'] = array (
'default' => $GLOBALS["cfg_memcache_mc_defa"],
'other' => $GLOBALS["cfg_memcache_mc_oth"]
);
$cache_helper_config['memcache']['mc_cache_time'] = $GLOBALS["cfg_puccache_time"];
}
if(!isset($cfg_NotPrintHead)) {
header("Content-Type: text/html; charset={$cfg_soft_lang}");
}
这个也就是从配置文件中读取配置,然后定义缓存,其实缓存怎么做的,我也不了解,但是你要注意,他的$cfg_memecah_enable 这个变量怎么出来的,先留着,待会找找》。。。
======================================================================================
第六段
//自动加载类库处理
function __autoload($classname)
{
global $cfg_soft_lang;
$classname = preg_replace("/[^0-9a-z_]/i", '', $classname);
if( class_exists ( $classname ) )
{
return TRUE;
}
$classfile = $classname.'.php';
$libclassfile = $classname.'.class.php';
if ( is_file ( DEDEINC.'/'.$libclassfile ) )
{
require DEDEINC.'/'.$libclassfile;
}
else if( is_file ( DEDEMODEL.'/'.$classfile ) )
{
require DEDEMODEL.'/'.$classfile;
}
else
{
if (DEBUG_LEVEL === TRUE)
{
echo '<pre>';
echo $classname.'类找不到';
echo '</pre>';
exit ();
}
else
{
header ( "location:/404.html" );
die ();
}
}
}
这个autoload真是很hi的系统内置函数,根据命名规则,自动加载include和当前模型下的类.
=============================
第7段
//引入数据库类
if ($GLOBALS['cfg_mysql_type'] == 'mysqli' && function_exists("mysqli_init"))
{
require_once(DEDEINC.'/dedesqli.class.php');
} else {
require_once(DEDEINC.'/dedesql.class.php');
}
//全局常用函数
require_once(DEDEINC.'/common.func.php');
// 模块MVC框架需要的控制器和模型基类
require_once(DEDEINC.'/control.class.php');
require_once(DEDEINC.'/model.class.php');
判断使用哪个数据库哪类函数,和包含mvc框架中控制器和模型的积类
==================================
第八段
//载入小助手配置,并对其进行默认初始化
if(file_exists(DEDEDATA.'/helper.inc.php'))
{
require_once(DEDEDATA.'/helper.inc.php');
// 若没有载入配置,则初始化一个默认小助手配置
if (!isset($cfg_helper_autoload))
{
$cfg_helper_autoload = array('util', 'charset', 'string', 'time', 'cookie');
}
// 初始化小助手
helper($cfg_helper_autoload);
}