文档章节

dedecms源码分析之index.php页面(2014/4/4)

YYCRiver
 YYCRiver
发布于 2014/04/04 17:34
字数 1421
阅读 751
收藏 2


$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');

}

?>


© 著作权归作者所有

共有 人打赏支持
YYCRiver
粉丝 1
博文 46
码字总数 23681
作品 0
南昌
程序员
加载中

评论(4)

YYCRiver
YYCRiver
好的!
买红薯
买红薯

引用来自“xuewl”的评论

讲得太复杂~

引用来自“袁亦川”的评论

还是PHP的初学者,想注释这个入门,连一些个PHP的语法,函数我都会写上。大神如果有什么建议之类的。虚心接受你的看法。[83]

初学者能理解到这个程序也是非常不错的~ 加油。 只给你一个建议:写这样的源码分析还是注重一下排版和美观,要不等几天你自己回来估计都看得头晕。这是习惯问题~

YYCRiver
YYCRiver

引用来自“xuewl”的评论

讲得太复杂~

还是PHP的初学者,想注释这个入门,连一些个PHP的语法,函数我都会写上。大神如果有什么建议之类的。虚心接受你的看法。[83]

买红薯
买红薯
讲得太复杂~
Dedecms备份还原网站有效方法

Dedecms备份还原方法为您提供3个,其实这3个dedecms网站备份恢复还原都很有效,所以不管你选择哪种,都能成功备份dedecms网站,以及dedecms网站恢复还原成功! Dedecms网站备份还原技巧1: ...

冰袋雪条火筒木冬瓜
2013/11/27
0
0
DedeCMS数据负载性能优化方案 简单几招让你DedeCMS提速N倍

前文介绍了DedeCMS栏目列表页实现完美分页的方法,避免了大部分重复栏目标题对搜索引擎的影响,对SEO更有利。今天,分享一下DedeCMS数据负载性能优化的方法。 接触织梦也有三年多时间了,对它...

mickelfeng
2014/05/31
0
0
DedeCMS+ucenter+uchome同步登录退出整合教程

现在已经完成了dedecms、ucenter、uchome的安装了现在就把dedecms及uchome通过ucenter整合到一起以实现资源整合并且两个网站的会员要实现同步登录及退出! 1.通过浏览器访问 http://127.0.0...

杨强易
2012/06/13
0
0
织梦dedecms在自定义表单里加入验证码的方法

在很多建站需求中,需要一些额外的表单供前台用户提交。以便于收集、统计、分析及处理更多的数据。比如:在线订单、在线报名等一些常见的互动应用。 更多:php教程 利用织梦内容管理系统(d...

西西爱OS
2012/10/20
0
0
公司网站跳转到赌博、彩票网站 该如何解决网站被黑的问题?

2018年的中秋节即将来临,我们Sine安全公司,最近接到很多用dedecms程序的企业公司网站 客户的反馈,说是公司网站经常被篡改,包括网站首页的标题内容 以及描述内容,都被改成了什么 北京赛车...

网站安全
09/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

技术工坊|如何降低区块链应用的使用门槛(上海)

当区块链技术从专业研究走向市场应用,开发者需要考虑用户的使用场景和使用门槛,例如通过ETH支付gas手续费,或者注册一个16进制的用户名,普通用户都难以接受。 10月20日,HiBlock区块链社区...

HiBlock
29分钟前
1
0
Daemon线程--《Java并发编程的艺术》学习笔记

daemon线程即守护线程 当一个JVM中不存在非Daemon线程时,JVM将会退出 也就是说当非Daemon线程都执行完毕时,java程序也就结束了。 可以通过调用Thread.setDaemon(true)将线程设置为Daemon线...

karma123
35分钟前
0
0
scala类型参数的上界和下界

class Pair[T <: Comparable[T]](val first:T,val second:T) //类型T必须要是Comparable接口的子类(即T是Comparable的下界){ def bigger = if(first.compareTo(second) > 0) first e......

whoisliang
45分钟前
1
0
Vue中路由管理器Vue Router使用介绍(一)

一、在模块编程中安装VueRouter 1.Npm安装vue-router npm install vue-router 2.在main.js中引用并使用VueRouter import Vue from 'vue'import VueRouter from 'vue-router'Vue.use(Vu......

tianma3798
47分钟前
1
0
TypeScript基础入门之声明合并(一)

转发 TypeScript基础入门之声明合并(一) 声明合并 介绍 TypeScript中的一些独特概念描述了类型级别的JavaScript对象的形状。 TypeScript特别独特的一个例子是"声明合并"的概念。 在使用现有J...

durban
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部