dedecms的include文件夹是干什么的?
1、这个是显示时间的代码
你可以随便放到一个位置 一般放到header的一个位置
<script language="javascript">
function showtime()
{
var today,hour,second,minute,year,month,date;
var strDate ;
today=new Date();
var n_day = todaygetDay();
switch (n_day)
{
case 0:{
strDate = "星期日"
}break;
case 1:{
strDate = "星期一"
}break;
case 2:{
strDate ="星期二"
}break;
case 3:{
strDate = "星期三"
}break;
case 4:{
strDate = "星期四"
}break;
case 5:{
strDate = "星期五"
}break;
case 6:{
strDate = "星期六"
}break;
case 7:{
strDate = "星期日"
}break;
}
year = todaygetYear();
month = todaygetMonth()+1;
date = todaygetDate();
hour = todaygetHours();
minute =todaygetMinutes();
second = todaygetSeconds();
if(month<10) month="0"+month;
if(date<10) date="0"+date;
if(hour<10) hour="0"+hour;
if(minute<10) minute="0"+minute;
if(second<10) second="0"+second;
documentgetElementById('time')innerHTML = year + " 年 " + month + " 月 " + date + " 日 " + strDate +" " + hour + ":" + minute + ":" + second; //显示时间
setTimeout("showtime();", 1000); //设定函数自动执行时间为 1000 ms(1 s)
}
</script>
<div id="time"></div>
<script language="javascript"> showtime();</script>
2、DEDE默认是有会员登录框的 你可以去自己更改样式
3、页面可以设置成你想要的分辨率
4、不用再买mysql了 一个就可以用了 不会冲突
一、修改文件:\include\taglib目录下的channellibphp,请将以下代码全部复制替换上述文件
<phpfunction lib_channel(&$ctag,&$refObj)
{
global $_sys_globals,$envs,$dsql;
$attlist = "typeid|0,reid|0,row|100,col|1,type|son,currentstyle|";
FillAttsDefault($ctag->CAttribute->Items,$attlist);
extract($ctag->CAttribute->Items, EXTR_SKIP);
$innertext = $ctag->GetInnerText();
$cacheid = trim($cacheid);
if($cacheid !='') {
$likeType = GetCacheBlock($cacheid);
if($likeType != '') return $likeType;
}
$reid = 0;
$topid = 0;
if(empty($typeid) && $envs['typeid']!=0)
{
$typeid = $envs['typeid'];
$reid = $envs['reid'];
}else{
$reid=0;
}
if($type==''||$type=='sun') $type="son";
if($innertext=='') $innertext = GetSysTemplets("channel_listhtm");
if($reid==0 && $typeid>0)
{
$dbrow = $dsql->GetOne("Select reid From dede_arctype where id='$typeid' ");
if(is_array($dbrow)) $reid = $dbrow['reid'];
}
$likeType = '';
if($type=='top')
{
$sql = "Select id,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath,description
From dede_arctype where reid=0 And ishidden<>1 order by sortrank asc limit 0,$row";
}
else if($type=="son")
{
//if($_sys_globals['typeid']>0) $typeid = $_sys_globals['typeid'];
if($typeid==0) {
return '';
}
$sql = "Select id,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath,description
From dede_arctype where reid='$typeid' And ishidden<>1 order by sortrank asc limit 0,$row";
}
else if($type=="self")
{
if($reid==0) {
return '';
}
$sql = "Select id,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath,description
From `dede_arctype` where reid='$reid' And ishidden<>1 order by sortrank asc limit 0,$row";
}
//And id<>'$typeid'
$needRel = false;
$dtp2 = new DedeTagParse();
$dtp2->SetNameSpace("field","[","]");
$dtp2->LoadSource($innertext);
$dsql2 = clone $dsql;
$dsql->SetQuery($sql);
$dsql->Execute();
$line = $row;
//检查是否有子栏目,并返回rel提示(用于二级菜单)
if(ereg(':rel', $innertext)) $needRel = true;
if(empty($sql)) return '';
$dsql->SetQuery($sql);
$dsql->Execute();
$totalRow = $dsql->GetTotalRow();
$GLOBALS['autoindex'] = 0;
for($i=0;$i < $line;$i++)
{
if($col>1) $likeType = "<dl>\r\n";
for($j=0;$j<$col;$j++)
{
if($col>1) $likeType = "<dd>\r\n";
if($row=$dsql->GetArray())
{
$row['sonids'] = $row['rel'] = '';
if($needRel)
{
$row['sonids'] = GetSonIds($row['id'], 0, false);
if($row['sonids']=='') $row['rel'] = '';
else $row['rel'] = " rel='dropmenu{$row['id']}'";
}
//处理同级栏目中,当前栏目的样式
if( ($row['id']==$typeid || ($topid==$row['id'] && $type=='top') ) && $currentstyle!='' )
{
if($currentstyle!='')
{
$linkOkstr = $currentstyle;
$row['typelink'] = GetOneTypeUrlA($row);
$linkOkstr = str_replace("~rel~",$row['rel'],$linkOkstr);
$linkOkstr = str_replace("~id~",$row['id'],$linkOkstr);
$linkOkstr = str_replace("~typelink~",$row['typelink'],$linkOkstr);
$linkOkstr = str_replace("~typename~",$row['typename'],$linkOkstr);
$likeType = $linkOkstr;
}
}else
{
$row['typelink'] = $row['typeurl'] = GetOneTypeUrlA($row);
if(is_array($dtp2->CTags))
{
foreach($dtp2->CTags as $tagid=>$ctag){
if(isset($row[$ctag->GetName()]))
{
$dtp2->Assign($tagid,$row[$ctag->GetName()]);
}
elseif (preg_match('/^sonchannel[0-9]$/',$ctag->GetName()))
{
$dtp2->Assign($tagid,lib_channel_son($ctag,$row['id'],$dsql2));
}
}
}
$likeType = $dtp2->GetResult();
}
}
if($col>1) $likeType = "</dd>\r\n";
$GLOBALS['autoindex']++;
}//Loop Col
if($col>1)
{
$i += $col - 1;
$likeType = " </dl>\r\n";
}
}//Loop for $i
reset($dsql2);
$dsql->FreeResult();
return $likeType;
}
function lib_channel_son($ctag,$typeid = 0,$dsql2)
{
$attlist = "row|100,col|1,currentstyle|";
FillAttsDefault($ctag->CAttribute->Items,$attlist);
extract($ctag->CAttribute->Items, EXTR_SKIP);
$innertext = $ctag->GetInnerText();
$dsql3 = clone $dsql2;
$likeType = '';
//if($_sys_globals['typeid']>0) $typeid = $_sys_globals['typeid'];
if($typeid==0) {
return '';
}
$sql = "Select id,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath,description
From dede_arctype where reid='$typeid' And ishidden<>1 order by sortrank asc limit 0,$row";
//And id<>'$typeid'
$dtp2 = new DedeTagParse();
$dtp2->SetNameSpace("field","[","]");
$dtp2->LoadSource($innertext);
$dsql2->SetQuery($sql);
$dsql2->Execute();
$line = $row;
for($i=0;$i < $line;$i++)
{
if($col>1) $likeType = "<dl>\r\n";
for($j=0;$j<$col;$j++)
{
if($col>1) $likeType = "<dd>\r\n";
if($row=$dsql2->GetArray())
{
$row['typelink'] = $row['typeurl'] = GetOneTypeUrlA($row);
if(is_array($dtp2->CTags))
{
foreach($dtp2->CTags as $tagid=>$ctag){
if(isset($row[$ctag->GetName()]))
{
$dtp2->Assign($tagid,$row[$ctag->GetName()]);
}
elseif (preg_match('/^sonchannel[0-9]$/',$ctag->GetName()))
{
$dtp2->Assign($tagid,lib_channel_son($ctag,$row['id'],$dsql3));
}
}
}
$likeType = $dtp2->GetResult();
}
if($col>1) $likeType = "</dd>\r\n";
}//Loop Col
if($col>1)
{
$i += $col - 1;
$likeType = " </dl>\r\n";
}
}//Loop for $i
reset($dsql3);
$dsql2->FreeResult();
return $likeType;
}
>
二、在模板调用
实例:
{dede:channel type='son' typeid='改成你的大栏目ID'}[field:typename/]
<ul>
[field:sonchannel0]
<li><a href="[field:typelink/]">[field:typename/]</a></li>
[field:sonchannel1]
<li><a href="[field:typelink/]">---[field:typename/]</a></li>
[field:sonchannel2]
<li><a href="[field:typelink/]">===[field:typename/]</a></li>
[field:sonchannel3]
<li><a href="[field:typelink/]">===[field:typename/]</a></li>
[/field:sonchannel3]
[/field:sonchannel2]
[/field:sonchannel1]
[/field:sonchannel0]
</ul>
{/dede:channel}
模板调用 [field:sonchannel0] [/field:sonchannel0] 这个是用来取子栏目用的(使用[sonchannel+数字] 作为标签名是为了防止嵌套的时候无法正确解析标签)
这个的作用就是当你的栏目有很多子栏目 无限分级的时候方便你取子栏目的。
include是DEDECMS的系统文件夹,里面放的是DEDECMS系统下的一些系统功能函数文件和功能定义与说明以及参数的文件。\x0d\include目录文件作用解析\x0d\arcarchivesclass 主文档类(Archives类)\x0d\arccaicaiclass 踩踩文档类\x0d\arcfreelistclass 自由列表类\x0d\arclistviewclass 文档列表类\x0d\arcmemberlistviewclass 会员列表视图类\x0d\arcpartviewclass 视图类\x0d\arcrssviewclass RSS视图类\x0d\arcsearchviewclass 搜索视图类\x0d\arcsglistviewclass 单表模型列表视图类\x0d\arcsgpageclass 单表模型视图类\x0d\arcspecviewclass 专题视图类\x0d\arctaglistclass Tag列表类\x0d\channelunitclass 频道模型单元类\x0d\commonfunc 系统核心函数存放文件\x0d\commoninc 系统变量定义文件\x0d\datalistcpclass 动态分页类\x0d\typelinkclass 栏目连接\x0d\userloginclass 管理员登陆类\x0d\vdimgck 验证码\x0d\typeunitclassadmin 栏目单元,主要用户管理后台管理处\x0d\typeunitclassmenu 栏目单元,主要用户管理后台管理菜单处\x0d\typeunitclassselector 栏目单元,选择框\x0d\uploadsafeinc 防止用户通过注入,强制限定的某些文件类型禁止上传\x0d\dedeattclass 属性的数据描述\x0d\dedecollectionclass Dede采集类\x0d\dedecollectionfunc 采集小助手\x0d\dedehtml2class 织梦HTML解析类V16 PHP版,针对于采集程序,主要是获取某区域内的、超链接等信息\x0d\dedehttpdownclass 织梦HTTP下载类\x0d\dedemoduleclass 织梦模块类\x0d\dedesqlclass 数据库类,系统底层数据库核心类\x0d\dedesqliclass 数据库类\x0d\dedetagclass Dede织梦模板类\x0d\dedetemplateclass 模板引擎文件\x0d\dedevoteclass 投票类\x0d\diyformcls 自定义表单解析类
织梦DedeCms全站伪静态,是为了更方便管理和SEO,织梦DedeCms默认是生成静态html文件的,对于优化已经非常友好,但还是有部分页面是动态形式的(比如:Tag标签页面、网站内容搜索页面、DedeCms问答页面等),为了是这些页面更好的被搜索引擎收录,就需要进行伪静态了,虽然织梦DedeCms系统可以生成静态html文件,但如果每天更新内容量特别大的话,对于生成html文件也成为系统和人力的一个负担,那么也可以做成伪静态形式,这样就免去了不断繁琐的生成html文件了。
将DedeCms全站静态化,这就需要mod_rewrite伪静态模块的支持。只要站长对htaccess正则表达式精通,就可以把dede整站静态
化,更符合搜索引擎,而且还可以避免重复URL来。DedeCms全站伪静态配置有些麻烦,主要是需要我们手动修改源代码。整理步骤如下:
1、首先开启站点伪静态功能。登录dede管理员后台->系统->系统基本参数->核心设置->是否使用伪静态 请选择“是”。
2、修改源程序,实现首页伪静态、频道页伪静态、列表页伪静态、文章页伪静态,这是过程比较复杂,不如其它php开源程序操作简单。
3、制作编写htaccess和htaccess文件规则,上传到DedeCms的安装目录。
织梦DedeCms全站伪静态教程:含列表|文章|问答|搜索|TAG伪静态规则:
1、网站服务器和网站空间是否支持伪静态:
这点特别重要,要么所以设置都不起作用。如果你的网站使用的是服务器,那么就可以自己动手设置一下,如果是空间的话,可以询问下IDC服务商客服,看是否
支持伪静态(一般空间都是支持伪静态的)。Apache服务器伪静态相对简单,直接在htaccess文件中加入相应伪静态规则即可;而IIS服务器伪
静态的实现,则需要加载Rewrite组件,然后配置httpdini文件。
2、开启DedeCMS伪静态:
1)织梦DedeCms后台-系统参数-核心设置-是否使用伪静态:选择“是”;
2)如果你启用了织梦DedeCms问答模块,则在后台-系统参数-模块设置-是否使用Rewrite:选择“是”;
3)创建栏目或批量增加栏目时,栏目列表选项:选择“使用动态页”; 添加新文章时,发布选项:选择“仅动态浏览 ”。同样你也可以更改他们的模板,让他们默认就是这两个值,一劳永逸。修改方法很简单,方法如下:
找到后台文件:/dede/templets/catalog_addhtm 修改添加栏目时默认“使用动态页”
<td height="26" style="padding-left:10px;">栏目列表选项:</td>
<td><input type='radio' name='isdefault' value='1' class='np' checked="checked" />链接到默认页
<input type='radio' name='isdefault' value='0' class='np' />链接到列表第一页
<input type='radio' name='isdefault' value='-1' class='np' />使用动态页</td>
改为下面代码
<td height="26" style="padding-left:10px;">栏目列表选项:</td>
<td><input type='radio' name='isdefault' value='1' class='np' />链接到默认页
<input type='radio' name='isdefault' value='0' class='np' />链接到列表第一页
<input type='radio' name='isdefault' value='-1' checked="checked" class='np' />使用动态页</td>
找到后台文件:/dede/templets/article_addhtm 修改添加文章时默认“仅动态浏览”
<td width="90">发布选项:</td>
<td width="379"><input name="ishtml" type="radio" class="np" value="1" checked="1" />生成HTML
<input type="radio" name="ishtml" class="np" value="0"/>仅动态浏览 </td>
改为下面代码
<td width="90">发布选项:</td>
<td width="379"><input name="ishtml" type="radio" class="np" value="1" />生成HTML
<input type="radio" name="ishtml" class="np" value="0" checked="1"/>仅动态浏览 </td>
4)如果网站已经存在生成的静态栏目或文章HTML,那么只需在后台-系统-SQL命令行工具 中执行如下语句:
update dede_arctype set isdefault=-1;
update dede_archives set ismake=-1;
注:命令中dede是网站安装时的数据表前缀,根据实际情况进行替换。
3、开启DedeCms伪静态支持并不能完全在后台配置,有很多地方还是需
要手动修改的。下面讲解DedeCms全站伪静态的实现方法,适用于V53以上版本。这次的DedeCms伪静态测试环境是Windows
IIS6,对于Linux或其它服务器的伪静态实现原理都是一样的,只要搞清楚思路就行。
1)DedeCms首页伪静态:
把站点根目录下indexhtml删除,以后不更新主页HTML就可以了,当然你也可以选择不使用动态首页。
2)DedeCms频道|列表页|文章页伪静态:
主要通过修改GetFileName()、GetTypeUrl()这两个函数实现。DedeCms V53、DedeCms
V55和DedeCms V56版本,打开/include/channelunitfuncphp进行修改。注意:DedeCms
V57,此文件路径更改了,你打开/include/helpers/channelunithelperphp即可。
A将GetTypeUrl()中的如下代码:
//动态
$reurl = $GLOBALS['cfg_phpurl']"/listphptid="$typeid;
替换为
//动态
$reurl = "/category/list-"$typeid"html";
这步必须修改,即让你的频道或是列表页URL变更为/category/list-1html形式。
B将GetFileName()中的如下代码:
//动态文章
if($cfg_rewrite == 'Y')
{
return $GLOBALS["cfg_plus_dir"]"/view-"$aid'-1html';
}
替换为
//动态文章
if($cfg_rewrite == 'Y')
{
return "/archives/view-"$aid'-1html';
}
将文章页默认的/plus/view-1-1html链接格式改为/archives/view-1-1html,随个人喜好,不改也行。
3)DedeCms列表分页伪静态:
打开/include/arclistviewclassphp,找到获取动态的分页列表GetPageListDM()函数末尾处:
$plist = str_replace('phptid=', '-', $plist);
替换为
$plist = str_replace('plus', 'category', $plist);//将默认的plus替换成category
$plist = str_replace('phptid=', '-', $plist);
将列表分页默认链接格式/plus/list-1-2-1html修改为/category/list-1-2-1html,这步也可以不作更改。
4)DedeCms文章分页伪静态:
打开/include/arcarchivesclassphp,找到获取动态的分页列表GetPagebreakDM()函数末尾片:
$PageList = str_replace("phpaid=","-",$PageList);
替换为
$plist = str_replace('plus', 'archives', $plist);//将默认的plus替换成archives
$PageList = str_replace("phpaid=","-",$PageList);
这步不作修改也可以,只是个人喜好问题。
5)DedeCmsTAG标签伪静态:
DedeCms默认的TAG标签URL,形如/tagsphp/dedecms57/,特别的难看。打开/include/taglib/taglibphp,找到lib_tag()函数下的:
$row['link'] = $cfg_cmsurl"/tagsphp/"urlencode($row['keyword'])"/";
替换为
$row['link'] = $cfg_cmsurl"/tags/"urlencode($row['keyword'])"/";
到这里,TAG标签URL中的“php”号就去掉了。
6)DedeCms搜索伪静态:
DedeCms搜索URL静态化比较麻烦,附带参数多不说,参数也可能变化,像搜索结果分页的URL就特麻烦,伪静态规则匹配复杂。将搜索URL中“searchphp…”直接替换为“searchhtml…”,至于“”号之后的参数以任意字符进行匹配。
依次打开include文件夹下的channelunitfuncphp、arcsearchviewclassphp、
arctaglistclassphp以及/include/taglib/hotwordslibphp,查找“searchphp”替
换为“searchhtml”即可。
7)DedeCms问答伪静态:
问答模块的伪静态实现比较简单,只要后台开启伪静态支持即可,至于个别页面,如ask目录下的browserphp、questionphp以及
include目录下的commonincphp、functionsincphp都需要简单修改才可以匹配伪静态规则。注意一
点,DedeCms V57问答模块整体升级了,之前的规则已经不适用了。
4、DedeCms伪静态规则:
依照上面的步骤修改完毕,接下来配置好httpdini文件和htaccess文件伪静态规则,则DedeCms全站伪静态就完美实现。
1)IIS伪静态
打开httpdini文件,加入如下规则:
#首页伪静态规则,如果不使用动态首页,请勿必删除这一行,否则打开首页会出现死循环
RewriteRule ^()/index\html $1/index\php [I]
#列表页伪静态规则
RewriteRule ^()/category/list-([0-9]+)\html $1/plus/list\php\tid=$2 [I]
RewriteRule ^()/category/list-([0-9]+)-([0-9]+)-([0-9]+)\html
$1/plus/list\php\tid=$2&TotalResult=$3&PageNo=$4 [I]
#文章页伪静态规则
RewriteRule ^()/archives/view-([0-9]+)-([0-9]+)\html $1/plus/view\php\arcID=$2&pageno=$3 [I]
#搜索伪静态规则
RewriteRule ^()/search\html(:(\)) $1/search\php$2 [I]
#TAG标签伪静态规则
RewriteRule ^()/tags\html $1/tags\php [I]
RewriteRule ^()/tags/()(:(\)) $1/tags\php\\/$2 [I]
RewriteRule ^()/tags/()\/(:(\)) $1/tags\php\\/$2\/ [I]
RewriteRule ^()/tags/()\/([0-9])(:(\)) $1/tags\php\\/$2\/$3 [I]
RewriteRule ^()/tags/()\/([0-9])\/(:(\)) $1/tags\php\\/$2\/$3\/ [I]
#问答伪静态规则,适用于DedeCmsV53-56版本,需要修改几处程序
RewriteRule ^()/post\html $1/post\php [I]
RewriteRule ^()/type\html $1/type\php [I]
RewriteRule ^()/question-([0-9]+)\html $1/question\php\id=$2 [I]
RewriteRule ^()/browser-1-([0-9]+)\html $1/browser\php\tid=$2 [I]
RewriteRule ^()/browser-2-([0-9]+)\html $1/browser\php\tid2=$2 [I]
RewriteRule ^()/browser-1-([0-9]+)-([0-9]+)\html $1/browser\php\tid=$2&page=$3 [I]
RewriteRule ^()/browser-2-([0-9]+)-([0-9]+)\html $1/browser\php\tid2=$2&page=$3 [I]
RewriteRule ^()/browser-([0-9]+)\html $1/browser\php\lm=$2 [I]
RewriteRule ^()/browser-1-([0-9]+)-([0-9]+)\html $1/browser\php\tid=$2&lm=$3 [I]
RewriteRule ^()/browser-2-([0-9]+)-([0-9]+)\html $1/browser\php\tid2=$2&lm=$3 [I]
2)Apache伪静态:
打开htaccess文件,加入如下规则:
#提供部分规则作参考
RewriteRule ^category/list-([0-9]+)\html$ /plus/listphptid=$1
RewriteRule ^category/list-([0-9]+)-([0-9]+)-([0-9]+)\html$ /plus/listphptid=$1&totalresult=$2&PageNo=$3
RewriteRule ^archives/view-([0-9]+)-([0-9]+)\html$ /plus/viewphpaid=$1&pageno=$2
RewriteRule ^indexhtml$ indexphp
织梦标签调用:根据特定需求调用文章的标签代码;
1、相关文章调用标签
{dede:likeart titlelen='30' row='10'}
<li><a title="[field:title function='htmlspecialchars(@me)'/]" href="[field:arcurl /]">[field:title /]</a></li>
{/dede:likeart}
表示读取10条相关文章,标题长度30个字符。
2、热点文章调用标签
{dede:arclist orderby='click' titlelen='30' row='10'}
<li><a title="[field:title function='htmlspecialchars(@me)'/]" href="[field:arcurl /]">[field:title /]</a></li>
{/dede:arclist}
表示读取10条热点文章,标题长度30个字符。
3、随机推荐调用标签
{dede:arclist type='commend' titlelen='30' orderby='rand' row='10'}
<li><a title="[field:title function='htmlspecialchars(@me)'/] " href="[field:arcurl /]">[field:title /]</a></li>
{/dede:arclist}
表示随机读取10条推荐文章,标题长度30个字符。
4、推荐文章调用标签
{dede:arclist type='commend' titlelen='30' row='10'}
<li><a title="[field:title function='htmlspecialchars(@me)'/] " href="[field:arcurl /]">[field:title /]</a></li>
{/dede:arclist}
表示读取10条推荐文章,标题长度30个字符
5、指定从第二篇文章开始调用的图文标签
{dede:arclist limit='1,10' titlelen=30 orderby=pubdate typeid='1' idlist='' type='image' imgwidth='200' imgheight='100'}
<a href="[field:arcurl/]"><img src="[field:picname/]" alt="[field:title/]" ></a>
<a title="[field:title function='htmlspecialchars(@me)'/] " href="[field:arcurl /]">[field:title /]</a>
{/dede:arclist}
函数TestPurview($n)虽然,看上去只是一个相对比较简单的函数,但是这个函数是非常非常重要的,试想一下如果一个系统中没有检验某个用
户是否有权限操作某些功能的话,那么,这个系统一定非常危险,因为,随便一个人都可以操作某个功能,例如,进入后台,删除栏目,删除数据库等,就如同一个
家四周都没有墙一样,随便什么人都可以进入,这样的家完全就是公共场合,完全没有什么安全可言,一个系统也是如此。
所以,检测系统函数就比较重要了,当然,光这个一个函数还不够,不光要检验用户的使用权限,还要检验用户密码,是不是管理员,甚至是用户登录ip等,都要检验一下,这样才可以称得上安全的系统。
本函数在“管理员登陆类”userloginclassphp里面的第一个函数就是它,返回的值是true或false,若有权限则返回trure否则返回false。
通过教程“织梦中cookie和session的应用”我们知道了,当我们登录后台后,织梦系统会把登录的用户信息写入session里面,并把session存放在/data/session文件夹里面。
因为不同的用户登录后台,产生的session是不一样的,我就在后台注册一个发布员,用户名为fby。并且,在后台定义“信息发布员”的权限如下图所示。
登录/注册后可看大图
我整理了一下“信息发布员”的权限如下:
列出授权栏目(t_AccList)
发布授权文档(a_AccNew)
列出授权文档(a_AccList)
列出我发布的文档(a_MyList)
修改我发布的文档(a_MyEdit)
删除我发布的文档(a_MyDel)
更改个人密码(sys_MdPwd)
评论管理(sys_Feedback)
管理我的上传(sys_MyUpload)
当我用fby用户名登录后,在data/session/文件夹里面,生成一个名为sess_3vtlqpg0pnlmc63pd5ai86gl16 的 session 。这个session里面的内容如下所示。
securimage_code_value|s:4:"npll";
dede_admin_id|s:1:"8";
dede_admin_type|s:1:"1";
dede_admin_channel|s:0:"";
dede_admin_name|s:3:"fby";
<font color="Blue">dede_admin_purview|s:107:"t_AccList
a_AccNew a_AccList a_MyList a_MyEdit a_MyDel sys_MdPwd sys_Feedback
sys_MyUpload plus_留言簿模块 ";</font>
dede_admin_style|s:10:"newdedecms";
复制代码
如果我们以超级管理员,也就是最高级别的身份登录后台后,我们同样得到类似的如下内容。
securimage_code_value|s:4:"2gsf";
dede_admin_id|s:1:"1";
dede_admin_type|s:2:"10";
dede_admin_channel|s:1:"0";
dede_admin_name|s:5:"admin";
<font color="Blue">dede_admin_purview|s:15:"admin_AllowAll ";</font>
dede_admin_style|s:10:"newdedecms";
复制代码
当登录后,这些是如何生成的?这个我们在上面提到了,以前的教程已经详细讲解了,其实,就是通过“管理员登陆类”userloginclassphp里面的函数来实现的,当然,不只是这个文件。
我们分析上面这些,完全就是为了函数TestPurview($n)作准备的,好了,现在我们来分析一下这个用户权限检验函数。
函数:
function TestPurview($n)
{
$rs = FALSE;
$purview = $GLOBALS['cuserLogin']->getPurview();
if(preg_match('/admin_AllowAll/i',$purview))
{
return TRUE;
}
if($n=='')
{
return TRUE;
}
if(!isset($GLOBALS['groupRanks']))
{
$GLOBALS['groupRanks'] = explode(' ',$purview);
}
$ns = explode(',',$n);
foreach($ns as $n)
{
//只要找到一个匹配的权限,即可认为用户有权访问此页面
if($n=='')
{
continue;
}
if(in_array($n,$GLOBALS['groupRanks']))
{
$rs = TRUE; break;
}
}
return $rs;
}
复制代码
通过getPurview()方法,我们从session得到了dede_admin_purview里面的值,因
为,$GLOBALS['cuserLogin']是实例化“登录类”的对像,而这个登录类的构造函数,在我们实例化时,已经把session里面的值赋
给了$this->userPurview,代码如下所示。
$this->userID = $_SESSION[$this->keepUserIDTag];
$this->userType = $_SESSION[$this->keepUserTypeTag];
$this->userChannel = $_SESSION[$this->keepUserChannelTag];
$this->userName = $_SESSION[$this->keepUserNameTag];
$this->userPurview = $_SESSION[$this->keepUserPurviewTag];
$this->adminStyle = $_SESSION[$this->keepAdminStyleTag];
复制代码
从上面代码我们就不难发现$this->userPurview=$_SESSION['dede_admin_purview'],即
t_AccList a_AccNew a_AccList a_MyList a_MyEdit a_MyDel sys_MdPwd
sys_Feedback sys_MyUpload plus_留言簿模块这些值,明白了这一点,这个TestPurview($n)就简单多了。
1、条件判断:
if(preg_match('/admin_AllowAll/i',$purview))
{
return TRUE;
}
复制代码
如果我们用的是管理员登录,那么,$_SESSION['dede_admin_purview']的值等于admin_AllowAll,返回true,所以,这句代码就是判断是不是管理登录。
2、条件判断
if($n=='')
{
return TRUE;
}
复制代码
若参数为空,直接返回true,也就是说,只要不提供功能参数,就认为是可以操作的,所以,这一点要注意了,如果你不小心,忘记写参数,那么,很可能本想过虑掉的用户结果没有过虑掉,这是非常危险的,所以,这个最好有个提示,有个对话框,这样可以提醒管理员。
3、把登录的后台的用户的权限,例如,本例子中的“信息发布员”权限$_SESSION['dede_admin_purview'],转换成数组存放到全局变量$GLOBALS['groupRanks']里面,以备下面之用。
if(!isset($GLOBALS['groupRanks']))
{
$GLOBALS['groupRanks'] = explode(' ',$purview);
}
复制代码
4、把功能参数转换成数组:$ns = explode(',',$n);
5、遍历:foreach($ns as
$n),就是把传递过来的功能参数,通过in_array($n,$GLOBALS['groupRanks'])这个函数进行对比,看一下$n里面的有
没有存功能在数组$_SESSION['dede_admin_purview']里面。例如:本例子信息发布员的权限在上我们已经知道了
有:t_AccList a_AccNew a_AccList a_MyList a_MyEdit a_MyDel sys_MdPwd
sys_Feedback sys_MyUpload plus_留言簿模块这些值。
如果$n是:a_AccNew,t_New,经过上面一个遍历,我们发现,其中a_AccNew在数
组$GLOBALS['groupRanks'],函数立马跳出来,返回一个true,也就是说织梦的这个函数,只要$n里面有一个是
与$GLOBALS['groupRanks']里面的值一样,
就可以操作这个页面。而不需要全部都在$GLOBALS['groupRanks']里面才可以操作这个页面。
当然,你可以根据自己需要,直接严格匹配,只有全部都在登录用户的权限里面才可以操作页面。这个功能也简单,只要作如下更改:
if(!in_array($n,$GLOBALS['groupRanks']))
{
$rs = FALSE; break;
}
复制代码
也就是把$n参数里面的值判断一下,只要有一个不在登录用户的权限里面,就返回false,退出操作。
利用模板。目前PHP的模板可以说是很多了,有功能强大的smarty,还有简单易用的smarttemplate等。它们每一种模板,都有一个获取输出内容的函数。我们生成静态页面的方法,就是利用了这个函数。用这个方法的优点是,代码比较清晰,可读性好。
这里我用smarty做例子,说明如何生成静态页:
<php
require("smarty/Smartyclassphp");
$t = new Smarty;
$t->assign("title","Hello World!");
$content = $t->fetch("templates/indexhtm");
//这里的 fetch() 就是获取输出内容的函数,现在$content变量里面,就是要显示的内容了
$fp = fopen("archives/2005/05/19/0001html", "w");
fwrite($fp, $content);
fclose($fp);
>
0条评论