$cfg_df_style 用来替换{style}
首页index.php思想就是加载index.html文件。但要加载他首先就要判断他的存在。之后再来更新首页缓存,如果不需要更新,那么直接跳转到301静态页面去就可以了,至于301静态页面是什么,暂时还不清楚?
那么更新首页缓存要做什么,1、要包含文件。一个公共函数类文件,一个视图类文件,因为dedecms是基于mvc三层的,需要用到模板引擎,而模板引擎的本质思想就是替换。我猜测arc.partview.class.php就是模板引擎文件。2、设置一个全局变量,_arclistEnv 。3、从数据表#@__homepageset中取出所有的数据传给GetOne方法。返回值给$row。目的暂时不明。#@__homepageset文件中有两个属性,一个是首页模板名称,一个是生成的静态文件地址。4、基于PartView类实例化一个对象,并设置一个模板。5、当生成模板文件后,把最后生成的页面写到指定位置,再通过include形式显示出来。
看完后也还有几个问题:1、common.inc.php和arc.partview.class.php是干什么的?2、GetOne()干什么了。
3、SetTemplet做了什么。SaveToHtml是怎么实现的。
从上面的代码分析可以看出来,1、dedecms没有使用框架,虽不明白框架是干什么的,但index.php没有框架入口文件。2、index.php的作用其实就是加载一些个类库文件,模板文件。最终得出的是一个index.html文件。也就是我们所看到的页面。3、从这里我们可以看到一些个思想。mvc思想。首页中看到的只是视图层,而模型层和控制层在后端内部。
首页的代码其实可以简化为。
if(!file_exists('index.html')){
header('Location:index.html');
}
if(isset($_GET['upcache'])){
require (dirname(__FILE__)."/include/common.inc.php");
require DEDEINC."arc.partview.class.php";
$GLOBALS['_arclistEnv']='index';
$row=$dsql->GetOne("Select * From #@__homepageset");
$pv= new PartView();
$pv->SetTemplet($cfg_basedir.$cfg_templets_dir."/".$row['templet']);
$pv->SaveToHtml(dir(__FILE__).'index.html');
include(dir(__FILE__).'index.html');
exit();
}else{
header('HTTP/1.1 301 Moved Permanently');
}
附上详细注释,便于日后查看:
//自动生成HTML版
/**
* 当get传来的upcache是否设置,是则为1,否为1.和index.html文件存在为1,非为0.不存在最后为1.
* 当upcache 和index.html没有存在。任一个满足,则if为1.否则的话就发送http标头信息。常用的有header("Content-Type: text/html; charset=UTF-8");
*/
//当index.html文件不存在时,就向发送HTTP标头 信息 Location:index.html。我觉得把这两个逻辑分开表示,不用||表示,虽会增加执行时间,但对初学者来说还是分开清晰点。
if(!file_exists('index.html')){
header('Location:index.html');
}//我这是已经安装好了。如果没安装好的话,就是判断/data/common.inc.php是否存在。如果不存在就跳转到安装页面。这个common.inc.php不是下面那个。这个是数据库的配置信息文件。是系统安装后自动生成的。
/**判断是否有GET['upcache']没有就跳转到301的静态页面去,有就生成静态页。
* ? 我没找到__homepageset这张表
*
*/
if(isset($_GET['upcache']))//upcache存在就更新首页缓存。否则就301直接跳转到index.html文件。
{
/**dirname(__FILE__)得到上一级目录路径。__FILE__是当前文件的绝对地址。
//加载common.inc.php 就是一些常用的函数
*/
require_once (dirname(__FILE__) . "/include/common.inc.php");
/**
包含common.inc.php 和一次包含dedeinc路径下的arc.partview.class.php
加载这个文件。arc.partview.class.php是在include内。而common.inc.php也在include里面,但没用DEDEINC这个常量,说明在common.inc.php中定义了这个常量
不要急着进入common.inc.php和arc.partview.class.php先把后面的更新缓存代码看完。
*/
require_once DEDEINC."/arc.partview.class.php";
/**
$GLOBALS引用全局作用域中的全部变量_arclistEnv 并赋值index(错了)
这里是设置了一个全局变量。 $_arclistEnv 内容是index
*/
$GLOBALS['_arclistEnv'] = 'index';
/**
* GetOne应该是自定义的方法。参数就是从表#@__homepageset中选择所有.由$dsql对象调用GetOne。最后把返回值传给$row
我从数据库中查到__homepageset表中,有两个属性templet和position templet=jp/index.html(模板名称) position=../index.html(生成的静态文件的位置)
作用就是把这张表的的表名前缀换成我们定义的。 $dsql是哪个文件里面的。重要的是通过这句获取首页的相关配置信息。
*/
$row = $dsql->GetOne("Select * From `#@__homepageset`");
/**
* MfTemplet为自定义的方法。在模板目录规则include/channelunit.func.php里面。
在index.html文件中找到{style}替换成 $cfg_df_style。并把index.html文件中的多个/换成一个/
用MfTemplet对$row['templet]进行了某个转换,其实可以等把缓存代码看完,再来细看
*/
$row['templet'] = MfTemplet($row['templet']);
/**
* 根据PartView类实例化一个对象$pv,前面加载了arc.partview.class.php,所以后面可以实例化
可以叫做视图对象。
*/
$pv = new PartView();
/**
* 由对象$pv调用方法SetTemplet。有一个参数导入
我猜测传入的是index.html的路径。传入的只是一个参数,第二个参数应该是指定文件类型的。没有声明,默认就是file类型。
设置模板
*/
$pv->SetTemplet($cfg_basedir . $cfg_templets_dir . "/" . $row['templet']);
//$row 是一个数组变量。当KEY=showmod时,为$row['showmod']和0两个值
$row['showmod'] = isset($row['showmod'])? $row['showmod'] : 0;
/**
* 当成立时,$pv 调用SaveToHtml方法。参数就是index.html dirname(__FILE__)只是路径的查找而已,帮我们找到index.html
*并把index.html文件包含。否则,调用Display()方法。
*/
if ($row['showmod'] == 1)
{
//把最后生成的页面写到指定位置。
$pv->SaveToHtml(dirname(__FILE__).'/index.html');
//用include把最后生成的页面显示出来。
include(dirname(__FILE__).'/index.html');
exit();//退出
} else {
$pv->Display();
exit();
}
}
else
{
header('HTTP/1.1 301 Moved Permanently');
}
?>