逆雪寒 PHPCMS 整站源代码分析讲解

合集下载

phpcms 源码解析

phpcms 源码解析

phpcms 源码解析一、什么是 phpcms?phpcms 是一款基于 PHP 的内容管理系统(CMS),它提供了一套完整的网站建设解决方案。

phpcms 源码解析就是对这个 CMS 的源代码进行深入的探讨和研究。

二、phpcms 的架构phpcms 的架构可以分为前台和后台两部分。

前台是用户访问网站的界面,后台则是管理员进行网站管理的界面。

1. 前台架构前台架构主要由以下几个模块组成:•模板引擎:phpcms 使用了自己开发的模板引擎,用于将页面模板和数据进行结合,生成最终的网页。

•核心类库:包括数据库操作类、缓存类、文件操作类等,提供了一系列常用的功能和方法。

•控制器:负责接收用户请求,调用相应的模型和视图,最终生成页面返回给用户。

•模型:与数据库进行交互,负责查询、插入、更新等操作。

•视图:根据模板引擎生成的数据,渲染成最终的页面展示给用户。

2. 后台架构后台架构主要由以下几个模块组成:•后台模板:后台界面的模板,包括菜单、页面布局等。

•后台控制器:负责接收管理员的请求,调用相应的模型和视图,最终生成页面返回给管理员。

•后台模型:与数据库进行交互,负责查询、插入、更新等操作。

•后台视图:根据后台模板和数据生成最终的页面展示给管理员。

三、phpcms 的核心功能phpcms 提供了丰富的功能,包括但不限于以下几个方面:1. 内容管理phpcms 提供了内容管理功能,管理员可以通过后台界面进行文章、图片、视频等的管理和发布。

同时,phpcms 也提供了权限管理功能,可以对不同用户进行不同的权限设置。

2. 模板管理phpcms 的模板管理功能非常强大,管理员可以通过后台界面进行模板的选择和编辑。

phpcms 的模板引擎支持模板继承、模板标签等高级功能,使得网站的页面展示更加灵活和美观。

3. 插件扩展phpcms 提供了插件扩展功能,管理员可以通过后台界面安装、卸载和管理插件。

插件可以为网站增加各种功能和特性,如留言板、友情链接等。

PHPCMS代码解读

PHPCMS代码解读

--------------------PHPCMS学习记录------------从index.php开始解读代码:总共3行代码,完成了很多事。

define('PHPCMS_PA TH', dirname(__FILE__).DIRECTORY_SEPARATOR);include PHPCMS_PATH.'/phpcms/base.php';pc_base::creat_app();第一句,定义phpcms站点根目录PHPCMS_PA TH,注意这里定义的目录常量不是服务器根目录,而是phpcms系统的根目录。

_FILE_返回当前文件的绝对路径,dirname(_FILE_)则可以取得当前文件的绝对目录;DIRECTORY_SEPARATOR显示当前系统的分隔符;第二句,引入一个base.php文件,定义了一个pc_base类,从字面意思上可以看出这应该是个基础类,事实亦如此。

根据下文猜想pc应该是phpcms的缩写。

引入文件的时候完成了一些基础常量的定义和公用函数库的加载等基础配置。

第三句,这句代码完成了系统的初始化,非常强大!下面细细道来它的强大之处:先来看这个creat_app()方法,定义如下:public static function creat_app() {return self::load_sys_class('application');}那么又来看load_sys_class()方法:public static function load_sys_class($classname, $path = '', $initialize = 1) {return self::_load_class($classname, $path, $initialize);}接下来是_load_class()方法:private static function _load_class($classname, $path = '', $initialize = 1) {static $classes = array();if (empty($path)) $path = 'libs'.DIRECTORY_SEPARA TOR.'classes';$key = md5($path.$classname);if (isset($classes[$key])) {if (!empty($classes[$key])) {return $classes[$key];} else {return true;}}if (file_exists(PC_PATH.$path.DIRECTORY_SEPARATOR.$classname.'.class.php')) { include PC_PATH.$path.DIRECTORY_SEPARATOR.$classname.'.class.php';$name = $classname;if ($my_path = self::my_path(PC_PATH.$path.DIRECTORY_SEPARATOR.$classname.'.class.php')) {include $my_path;$name = 'MY_'.$classname;}if ($initialize) {$classes[$key] = new $name;} else {$classes[$key] = true;}return $classes[$key];} else {return false;}}颠来倒去的一大堆,实际就是加载类函数并实例化这个类,但是值得赞赏和学习的是这个函数逻辑之严密,由此phpcms框架的成熟性可见一斑。

phpcms 调用描述

phpcms 调用描述

phpcms 调用1. 简介phpcms 是一款基于 PHP 开发的内容管理系统(CMS),它提供了丰富的功能和灵活的扩展性,可以帮助开发者快速构建各种类型的网站。

在使用 phpcms 进行开发时,我们经常需要调用其提供的接口和函数来实现特定的功能。

本文将介绍如何使用 phpcms 进行调用,并提供一些常见操作和示例代码。

2. 调用方式phpcms 提供了多种调用方式,包括直接调用函数、使用模板标签、通过数据库查询等。

下面我们将分别介绍这些调用方式的具体使用方法。

2.1 直接调用函数phpcms 提供了大量的函数来实现各种功能,我们可以直接在代码中使用这些函数进行调用。

例如,要获取某个栏目的信息,可以使用get_category()函数:$category_id = 1;$category = get_category($category_id);2.2 使用模板标签phpcms 的模板标签是一种特殊的语法,可以在模板文件中直接调用。

这样做不仅方便了开发者,还能使代码更加清晰易读。

例如,要显示某个栏目下的文章列表,可以使用以下模板标签:<list action="list" catid="1" num="10"><li><a href="[list.url]">[list.title]</a></li></list>2.3 通过数据库查询如果需要进行一些复杂的操作,如自定义查询、更新等,可以直接通过数据库查询来实现。

phpcms 提供了query()函数来执行 SQL 查询,例如:$sql = "SELECT * FROM `tablename` WHERE `id` = 1";$result = query($sql);3. 常见操作3.1 获取栏目信息要获取某个栏目的信息,可以使用get_category()函数。

PHPCMS整站源代码分析讲解【很不错!】

PHPCMS整站源代码分析讲解【很不错!】
*/
unset($search_arr, $replace_arr);
/**
unset 使用过但以后不需要的变量。这个是很好的习惯。第一不会浪费内存。如果变量存了大量的数据字节,而后你的程序是一直不需要用的。那么
就会很浪费内存。拉底程序性能 . 哈哈。真很书面。反正是好习惯我们都要学习的拉。
这个函数写得实在精妙。 is_array 来判断 $string 是否为数组。如果 是 就 array_map() 函数来递归过滤 $string数组里面的每一个单元. 每个单元是一个字符窜吧?
当递归调用 strip_sql() 以后 is_array()判断 $string 肯定为假了,因为$string已经不是数组而是字符窜。所以 执行 preg_replace()函数。这个函数很好理解了。就是替换了。
}
函数里面定义了这两个变量为 global全局变量。 那么函数里就可以直接使用了。 先讲解下这个函数吧。 顾名思义这个函数是过滤字符窜里面的SQL语句使得关键的SQL语句单词失效。
主要过滤那些SQL语句呢。 主要是这几个关键字: union select update outfile or 等。因为这几个SQL字是极度容易在$_GET传输中给截注.
define('PHPCMS_CACHEDIR', $CONFIG['cachedir']);
/**
$CONFIG['rootpath'] 这个就是全局配置文件 config.inc.php 文件里面数据库信息。等全部配置信息。在这里把他们定义为 常量。 为什么需要定义为常量呢。因为作者感觉这样写爽罗。呵呵。其实因为后面
就用了 extract()函数来实现这么一个技巧。 这个技巧在discuz 论坛上也有应用。

开源CMS赏析

开源CMS赏析

开源CMS赏析国内CMS产品有很多,开源的产品也不少,大概的可分为以下几类:.NET开源产品:We7CMS;PHP开源产品:Dede CMS、PHP CMS和帝国CMS;ASP开源产品:动易SiteFactory和KesionCMS;Java开源的产品目前还没见到,以上产品是个人所了解过的,并且也试用过一段时间的,以上这些CMS产品都是经过多年的风雨洗礼后,依然屹立于市场上的产品。

在国内,如果你遇到了开源的好产品,千万不要放过,国内的市场飘摇不定,能一直坚持下来并持续更新的产品是值得我们学习和尊敬的。

本身笔者也是从事这个行业的人,之前也一直在用上述的产品,中间由于某些原因有一段时间不是很关注他们的消息,最近朋友说起来让推荐个好用的内容管理系统,笔者在推荐的同时又把以上的CMS重新的看了一下,最终推荐了一个比较适合朋友情况的产品。

因为本身就在这个行业内,不时的也会有朋友QQ上问,所以笔者决定做一个简单的分析记录下来,分享出去可以供更多的人参考。

基本的功能这儿就不在提了,相信真正了解过CMS的人也很清楚,基础功能大家都差不多,关键就是看谁的更好用。

当作为用户的时候,使用CMS的目的就是为了建站,建站无非就是栏目、模板和信息发布,剩下的就是一些扩展性的功能和细节的处理。

栏目和信息发布没啥可说的,每家的产品都差不多,笔者就从模板、扩展性和细节上来阐述一下。

1、模板模板这块做的比较好的是We7CMS,用全拖拽的方式来实现模板的建设,包括模板的布局,样式的展示,都是通过拖拽的方式,就像现在的博客一样,当然We7CMS的模板建设比博客拖拽的功能要强大很多,We7模板中的布局和样式是可以任意修改的,基于DIV和CSS,很少会用到切图这个环节了;但是We7系统内部提供的部件并不是很多,仅够做出一个简单的小门户站,大部分的部件还需要到他们的插件商店去下载。

刚开始的时候笔者其实并不理解,但是看到使用过的CMS后,发现就We7的产品安装包最大,差不多有20M左右,再加上.NET本身第一次打开网页的速度就不快,也可以理解人家为啥要提供小部分的部件,大部分的需要下载,减少系统冗余啊。

phpcms 源码解析

phpcms 源码解析

phpcms 源码解析Phpcms是一个流行的内容管理系统,在网站开发领域中使用广泛。

它是一个基于PHP开发的系统,可以快速构建功能强大的网站。

本文将探讨Phpcms的源代码解析。

一、什么是PhpcmsPhpcms是一个使用PHP编写的开源内容管理系统,它提供了一个易于使用的、体积小巧的框架。

Phpcms支持多语言、多种数据库、内容自定义、页面自定义等多种功能,能够轻松创建和管理网站以及博客。

二、Phpcms的结构Phpcms的结构简洁明了,它包含一个核心框架和一系列可插拔的模块。

所有的模块都可以通过插件方式集成到Phpcms框架中,从而使Phpcms系统更加灵活,用于实现各种需求。

Phpcms的核心部分有以下几个文件:1、index.php:Phpcms的入口文件,定义各个常量和全局变量,并调用程序执行。

2、admin.php:用于管理后台入口程序,用于后台的登录验证和后台常规管理。

3、phpcms\base.php:初始化 Phpcms系统的参数。

4、phpcms\licensed.php:Phpcms的授权文件。

Phpcms的核心框架文件在文件系统上按照模块形式存放。

Phpcms 的模块包括:模板解析模块、模板模块、模型模块和数据库模块。

每个模块都需要遵循Phpcms的开发要求,实现一些必须的接口文档。

三、Phpcms的模块1、模板解析模块:Phpcms的核心模块之一。

这个模块主要负责从模板文件生成目标文件,一般而言,目标文件是生成的HTML文件。

2、模板模块:负责管理模板,包括添加、修改、删除、查看模板等功能。

3、模型模块:负责管理模型,包括添加、修改、删除、查看模型等功能。

Phpcms模型模块提供了模型模板的模型驱动,并且支持修改模型的template_file、data_table。

4、数据库模块:Phpcms采用的是Sqlite,封装了一个phpcms\data\db_sqlite.php,用于操作数据库。

phpcmsv9代码分析(三)

phpcmsv9代码分析(三)

phpcmsv9代码分析(三)这篇讲讲模型。

1. phpcms/libs/classes/model.class.php这是所有模型类的父类,其他模型类继承它,设置表名,表前缀。

1 2 3 4 5 6 7 8pc_base::load_sys_class('db_factory', '', 0); class model { protected $db_config = ''; //数据库配置 protected $db = ''; //数据库连接 //调用数据库的配置protected $db_setting = 'default';项9 protected $table_name = ''; 1 0 public 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 { $this->db_setting = 'default'; } $this->table_name = $this->db_config[$this->db_setting]['tablepre'].$this>table_nam e; $this->db_tablepre = $this->db_config[$this->db_setting]['tablepre']; $this->db = db_factory::get_instance($this->db_config)->get_database($this->db_setting); } ............ } public function __construct() { if (!isset($this->db_config[$this->db_setting])) $db_tablepre = ''; //表前缀 //数据表名该类还定义了通用的数据库操作函数。

phpcms模板中用php语句

phpcms模板中用php语句

一、phpcms模板的概述它是一款开源的内容管理系统,以其灵活、轻便和快速的特点受到了众多全球信息站开发者的欢迎。

在phpcms模板中使用php语句可以实现动态的页面渲染,提升用户体验和数据展示的灵活性。

二、php语句在phpcms模板中的作用1. 动态数据展示在phpcms模板中使用php语句,可以通过数据库查询、循环、条件判断等实现动态数据的展示,实现页面内容的定制化展示。

这种方式可以满足不同页面不同数据需求的情况,使全球信息站展示更加灵活多样化。

2. 动态页面渲染使用php语句可以在页面加载时根据用户的请求和条件参数来渲染页面内容,实现页面的动态调整。

比如根据用户登入状态展示不同的内容,或根据访问页面的不同参数来加载不同的数据展示。

3. 模板引用在phpcms模板中,可以使用php语句来引用其他模板文件,实现模块化和组件化的页面开发,提高页面重用性和维护性。

三、php语句的应用场景1. 数据查询与展示在phpcms模板中,使用php语句可以轻松地查询数据库,并将查询结果展示在页面上。

比如通过循环语句展示新闻列表、文章列表等动态数据。

2. 条件判断与动态渲染根据用户的不同行为或条件参数,使用php语句可以实现页面内容的动态调整和渲染。

比如根据用户登入状态展示不同的导航条、或根据页面参数展示不同的产品详情页。

3. 模板引用与组件化开发在phpcms模板中,使用php语句可以将页面的不同部分提取为单独的模板文件,并在需要的地方引用,实现页面模块化和组件化开发。

四、php语句的使用技巧1. 合理的php语句嵌入位置在phpcms模板中,php语句的嵌入位置应该符合页面逻辑结构,避免过多的php语句嵌入导致页面代码难以维护。

2. 安全性考虑在使用php语句时,应该考虑安全性问题,避免SQL注入、XSS 攻击等安全问题的发生,保护全球信息站和用户的信息安全。

3. 代码风格统一在使用php语句时,应该遵循统一的代码风格和规范,提高代码的可读性和维护性。

dedecms代码详解很全面

dedecms代码详解很全面

dedecms代码详解很全面dedecms代码研究(1)开篇dedecms 相信大家一定都知道这个cms 系统,功能比较强大,有比较完善的内容发布,还有内容静态化系统,还有就是它有自己独特的标签系统和模板系统。

而模板系统也是其他cms系统比较难模仿的的东西,这个东西还是需要一点开发功力和技巧的。

本系列文章就研究一下dedecms的这套系统,挖掘一下看看里面有什么好东西。

建议大家先了解一下dedecms的功能。

自己先动手用一下,对系统功能有个大概了解。

本文先带领大家了解一下dedecms的代码和功能架构。

其实,dedecms在架构上没什么应用架构模式可言,就是最简单的PHP 应用而已。

访问不同的PHP 文件,管理不同的系统功能。

看目录大家都能猜出来各个目录干什么用的。

include目录放系统的一些公用函数和类,plus目录放插件,templates目录放模板,dede 目录是管理后台目录。

我们打开include 目录,看看里面都有什么好东西。

calendar 一个选时间的jscaptcha 一个验证码,还是开源组件code 没啥意思,翻页的文字data 里面是一些系统用到的资源,比如声音,分词库,字体,图片等dialog 里面估计是一些AJAX弹出窗口的内容部分。

以后碰到了再说inc 里面一些单独的功能类函数,以后研究一下为什么要单独放payment 支付接口taglib 好东西,是dedecms的标签存放的地方,打开看看,里面一堆文件,貌似就是dedecms的模板标签啦tpllib 模板库?暂时搞不明白,希望随着研究深入,能弄明白其他include 目录下的文件估计都是一些最基本的功能文件啦,比如常用函数,模板系统之类的东西了。

用到再说吧打开dede目录(就是dedecms的管理目录)看看,哟嗬,里面的东西还挺多,看名字就知道了,都是各种功能管理文件,一个功能一个文件。

最原始的网站开发模式做出来的。

phpcmsv9二次开发模板制作常用代码

phpcmsv9二次开发模板制作常用代码

phpcmsv9二次开发模板制作常用代码phpcms v9二次开发模板制作常用代码001:调用最新文章,带所在版块{pc:get sql="SELECT a.title, a.catid, b.catid, b.catname, a.url as turl ,b.url as curl,a.id FROM `v9_news` a, `v9_category` b WHERE a.catid =b.catid ORDER BY `a`.`id` DESC "num="15" cache="300"}{loop $data $r}<h6><font class="cate"><a href="{$r[curl]}">[{$r[catname]}]</a></font><aclass="gray" href="{$r[turl]}" title="{$r[title]}"> {str_cut($r['title'],26)}</a></h6>{/loop}{/pc}====<font class="cate"><a href="{$r[curl]}">[{$r[catname]}]</a></font>所在版块的调用1.截取调用标题长度{str_cut($v[title],36,'')}{str_cut($v['title'],34)} 超出用 ... 代替{str_cut($v['title'],34, '')}超出用代替{str_cut($v['title'],34,'')}超出不用任何字符代替2.格式化时间调用格式化时间 2011-05-06 11:22:33{date('Y-m-d H:i:s',$r[inputtime])}<span class="rt">{date('m-d',$v['inputtime'])}</span>3.多栏目调用&多推荐位调用调用需求:文章范围为59 60 61三个栏目,并且推送到了27 和28两个推荐位;从第三条开始,连续调用7篇文章。

PHPCMS整站源码分析

PHPCMS整站源码分析

/**代码分析版权所有:逆雪寒*/require'./include/common.inc.php';/**看 common.inc.php 核心启动文件我们已经讲解完了。

应该都明白了吧*/if($PHPCMS['ishtml']==1&&file_exists(PHPCMS_ROOT.'/'.$PHPCMS['index'].'.'.$PHPCMS[ 'fileext'])){header('location:'.$PHPCMS['index'].'.'.$PHPCMS['fileext' ]);exit;}/**phpcms 允许在后台生静态和使用静态,这里就是先判断$PHPCMS['ishtml'](从文本缓存弄过来的。

应该知道了吧)是否为1 就是开启了。

和这个静态的html文件是否存在。

*/$channels=array();$channels['article']=$channels['down']=$channels['picture']=$channels['info']=array();foreach($CHANNEL as$v){$module=$v['module'];if($v['islink']==0&&$MODULE[$module]['iscopy']==1) $channels[$module][$v['channelid']]=$v;}//获取频道模块的信息。

都是从缓存中取的$head['title']=$PHPCMS['seo_title'];$head['keywords']=$PHPCMS['seo_keywords'];$head['description']=$PHPCMS['seo_description'];// 这个是网页的SEO (title,keywords,description)信息。

最详尽的PHP整站代码解析

最详尽的PHP整站代码解析

用到这两个变量多。所以干脆定义为常量。方便使用。再多说一个技巧: 定
$CONFIG[rootpath] 但是最好不要这样。为什么呢。因为PHP引擎会先判断 rootpath 是不是常量。如果不是才会认 $CONFIG[rootpath] 是数组。 这样性能上就差了一点点了。 再多说一个技巧: 为什么程序多数都用 引号呢而不用 "" 双引号呢。因为这样效率好, "" 双引号。 php 引擎还会先检查里面是否有变量,如果有就解释。而 '' 单引号不会做这一步的检查。而直接就当成字符窜了。所以效 率上也会有一点点影响哦。 */ $CONFIG['enablephplog'] ? set_error_handler('phpcms_error') : error_reporting(E_ERROR | E_WARNING | E_PARSE); /** $CONFIG['enablephplog'] 是否开启错误日志设置。这个设置在全局配置文件里面.config.inc.php 。 这里使用了 算符 偶最喜欢用了。一些简短的逻辑判断。可以使用 ?: ; 来实现比较简洁 三目运
PHPCMS 整站代码分析讲解(一)
首先我对 PHPCMS 的 头程序文件开始讲解 : include/common.inc.php
这个文件是程序启动的核心文件. [Copy to clip<?php /** 代码讲解分析: 逆雪寒. 2007 - 12 - 20 */ $mtime = explode(' ', microtime()); $phpcms_starttime = $mtime[1] + $mtime[0]; /** 计算脚本开始运行的时间。很常见的写法。最后结算还在程序运行的终点位置。讲到了在给各位说。 */ unset($LANG, $_REQUEST, $HTTP_ENV_VARS, $HTTP_POST_VARS, $HTTP_GET_VARS, $HTTP_POST_FILES, $HTTP_COOKIE_VARS); /** 把 $HTTP_ENV_VARS $HTTP_POST_VARS 全局变量设置为 NULL 因为 php4.1.0 以上默认以 $_POST 来替代。unset 后 防止程序运行在低版本会出现安全等问题。比如变量注入 */ set_magic_quotes_runtime(0); //地球人都知道。关了字符窜入库自动转意 比如 my name is on'x 们关掉吧~哈哈 define('IN_PHPCMS', TRUE); /** 程序入口标记。为什么需要这个东西呢。就好比你进一个小区,保安大哥哥肯定要你签字或是挂个鸟牌证明你是从正门进来 的。防止你翻墙进入去偷东西搞破坏。这个入口标记也有这个功能。 在这里定义了一个常量 IN_PHPCMS 为 TRUE ,然 后我在其他程序文件里面检查这个标记。如果不存在或不为真, 那么就基本可以肯定你这个家伙是个小偷来的。 人可能翻墙进入。但程序怎么翻墙呢。只要在 php.ini 文件里面激活 allow_url_fopen 选项,include() 就可以包含 URL 地址了。你想下如果你有个 放密码的 PHP 文件。如果给人家 include 了 以后。你怕不怕。 */ define('PHPCMS_ROOT', str_replace("\\", '/', substr(dirname(__FILE__), 0, -8))); /** 为了程序产品的跨平台。自动获取程序的安装目录路径 ,定义为 PHPCMS_ROOT 常量。方便以后程序使用。建议大家都这 样做哦 */ require PHPCMS_ROOT.'/include/global.func.php'; /** 包含 全局函数 global.func.php 文件。里面放了些程序全局都有需要用的函数.大家看到了吧。 常量 PHPCMS_ROOT 已 经发挥作用。 这样程序给人家发布到了 二级目录下。也不需要人家手动改整站根目录路径了。 自己好好理解下。。。。。 */ $search_arr = array("/ union /i","/ select /i","/ update /i","/ outfile /i","/ or /i"); 1 转成 my name is on \'x 为了最大的程序性能所以我

phpcms v9模板代码解析-首页

phpcms v9模板代码解析-首页

phpcms v9模板解析
首先来到content模块下面的header.html
1.首页顶部推荐位
对于content下面的position
参数名是否必须默认值说明
posid 是null 推荐位ID
catid 否null 调用栏目ID
thumb 否0 是否仅必须缩略图
order 否null 排序类型
num 是null 数据调用数量
相关查询
Posid 后台-内容-推荐位管理
Catid 后台-内容-栏目管理
2.在分类下面进行查询
这里是取缓存文件里面的东西,具体这个怎么生成的缓存,和专题,研究中?
3.下面是首页导航的代码
对于category
参数名是否必须默认值说明
catid 否0 调用该栏目下的所有栏目,默认0,调用一级栏目$siteid 否 1 默认调用系统站点
order 否null 排序方式、一般按照listorder ASC排序,即栏目的添加顺序如果要使用下级标签,使用get标签调用数据库调出
4.首页左侧头条推荐推荐信息
对应源代码
这个解释和position 一样这里就不多说了
5.首页焦点图推荐
6.下面看到争议这一块
首先找到他的标签
7.首页图片新闻推荐
8.首页顶级栏目循环
这里的代码为
这里的含义是显示一条图文浏览的,显示5条依次下来的信息其中subcat为系统主函数下面的
这里面主要是找缓存文件,其实后台更新栏目后也随即更新了缓存文件9.公告
10.订阅
11.专题页面
这里的elite为是否为推荐
12热点、评论、关注
13.调查问卷,这是后台调用的js文件
14.友情链接。

PHPMPS代码说明

PHPMPS代码说明

变量: $seo['title']属于: 每个页说明: 网站seo title模板写法: {$seo['title']}变量: $seo['keywords']属于: 每个页说明: 网站seo keywords模板写法: {$seo['keywords']}变量: $seo['description']属于: 每个页说明: 网站seo description模板写法: {$seo['description']}变量:$cats属于: index.htm说明:分类列表模板写法:<!--{loop $cats $cat}--><font style='font-WEIGHT: bold; font-SIZE: 12px' color=#014ccc><a class=u333333 href={$cat[caturl]}>{$cat[catname]}</a></font><br><!--{if !empty($cat[children])}-->{php $i=1 }<!--{loop $cat[children] $child}--><!--{if is_int($i/3)}--><a class=u333333 href={$child[url]}>{$child[name]}(<font color=red>{$child[num]}</font>)</a><br>";<!--{else}--><a class=u333333 href={$child[url]}>{$child[name]}(<font color=red>{$child[num]}</font>)</a>&nbsp;&nbsp;&nbsp;&nbsp;<!--{/if}-->{php $i++ }<!--{/loop}--><!--{if !is_int(count($cat[children])/3)}--><br><!--{/if}--><!--{/if}--><!--{/loop}-->变量:$flash属于: index.htm说明:首页焦点图显示模板写法:<!--{if !empty($flash)}--><div id=flash aligh=center><script type=text/javascript><!--var focus_width=355var focus_height=200var text_height=0var swf_height = focus_height+text_heightvar pics='{$flash['image']}'var links='{$flash['url']}'var texts='||||'document.write('<objectclassid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"codebase="/pub/shockwave/cabs/flash/s wflash.cab#version=6,0,0,0" width="'+ focus_width +'" height="'+swf_height +'">');document.write('<param name="allowScriptAccess"value="sameDomain"><param name="movie"value="images/flashplay.swf"><param name="quality" value="high"><param name="bgcolor" value="#ffffff">');document.write('<param name="menu" value="false"><paramname="wmode" value="opaque">');document.write('<param name="FlashVars"value="pics='+pics+'&links='+links+'&texts='+texts+'&borderwidth='+fo cus_width+'&borderheight='+focus_height+'&textheight='+text_height+'" >');document.write('<embed src="images/flashplay.swf" wmode="opaque" FlashVars="pics='+pics+'&links='+links+'&texts='+texts+'&borderwidth= '+focus_width+'&borderheight='+focus_height+'&textheight='+text_heigh t+'" menu="false" bgcolor="#ffffff" quality="high" width="'+focus_width +'" height="'+ focus_height +'"allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="/go/getflashplayer" />');document.write('</object>');//--></script></div><br /><!--{/if}-->变量: $fac属于: index.htm说明:首页便民电话显示模板写法:<!--{loop $fac $fac}--><li>{$fac['title']}:{$fac['phone']}</li><!--{/loop}-->变量: $new_info属于: index.htm说明:首页最新信息显示模板写法:<!--{loop $new_info $val}--><br><img src="templates/{$CFG[tplname]}/images/li.gif" align=absMiddle vspace=5><A class=u0000cc href="{$val['url']}"target=_blank>{$val['title']}</A>&nbsp;[<font color=#666666size=1>{$val['catname']}</font>]&nbsp;[<font color=#666666size=1>{$val[areaname]}</font>]&nbsp;<font color=#808080 size=1>({$val['postdate']})</font><!--{/loop}-->变量: $pro_info属于: index.htm说明:首页推荐信息显示模板写法:<!--{loop $pro_info $val}--><br><img src="templates/{$CFG[tplname]}/images/li.gif" align=absMiddle vspace=5><A class=ured href="{$val['url']}" target=_blank>{$val['title']}</A>&nbsp;[<font color=#666666size=1>{$val['catname']}</font>]&nbsp;[<font color=#666666size=1>{$val[areaname]}</font>]&nbsp;<font color=#808080 size=1>({$val['postdate']})</font><!--{/loop}-->变量: $hot_info属于: index.htm说明:首页热门信息显示模板写法:<!--{loop $hot_info $val}--><br><img src="templates/{$CFG[tplname]}/images/li.gif" align=absMiddle vspace=5><A class=u0000cc href="{$val['url']}"target=_blank>{$val['title']}</A>&nbsp;[<font color=#666666size=1>{$val['catname']}</font>]&nbsp;[<font color=#666666size=1>{$val[areaname]}</font>]&nbsp;<font color=#808080 size=1>({$val['postdate']}</font><!--{/loop}-->变量: $image_link、$txt_link属于: index.htm说明: 图片友情链接、文字友情链接模板写法:<!--{if !empty($txt_link)}--><!--{loop $txt_link $link}--><A href="{$link['url']}" target=_blanktitle="{$link['webname']}">{$link['webname']}</A>&nbsp;&nbsp;<!--{/loop}--><br /><br /><!--{/if}--><!--{if !empty($image_link)}--><!--{loop $image_link $link}--><A href="{$link['url']}" target=_blank ><img src="{$link['logo']}"alt="{$link['web_name']}" width="88" height="31" border="0"title="{$link['webname']}"></A>&nbsp;&nbsp;<!--{/loop}--><!--{/if}-->变量: $area_option属于: header.htm说明: 地区下拉菜单模板写法: {$area_option}变量: $cat_option属于: header.htm说明: 分类下拉菜单模板写法: {$cat_option }变量: $nav属于: header.htm说明: 网站导航数组模板写法:<!--{if !empty($nav)}--><!--{loop $nav $nav}--><a href={$nav[url]}target={$nav[target]}>{$nav[navname]}</a>&nbsp;&nbsp;<!--{/loop}--><!--{/if}-->变量: $change_area属于: header.htm说明: 切换地区模板写法:<!--{loop $change_area $val}--><li><a href={$val[url]}>{$val[areaname]}</a>:&nbsp;&nbsp;<!--{if !empty($val[children])}--><!--{loop $val[children] $chi}--><a href={$chi[url]}>{$chi[name]}</a>&nbsp;&nbsp;<!--{/loop}--><!--{/if}--></li><!--{/loop}-->变量: $CFG[annouce]属于: header.htm说明: 网站公告模板写法:<!--{if !empty($CFG[annouce])}--><div id=annouce><marquee onmouseover=this.stop() onmouseout=this.start() behavior="alternate" scrollamount=3 loop="-1" scrolldelay="100" id=webjx height='200'>{$CFG['annouce']}</marquee></div><!--{/if}-->变量: $s_cat属于: category.htm说明: 选择分类模板写法:<!--{if !is_int($s_cat) && !empty($s_cat)}--><tr><td>分类:</td><td><select name="id" id="id"><option value="0">选择分类</option>{$s_cat}</select></td></tr><!--{else}--><input type=hidden name=id value={$s_cat}>";<!--{/if}-->变量: $s_area属于: category.htm说明: 选择地区模板写法:<!--{if !is_int($s_area) && !empty($s_area)}--><tr><td>地区:</td><td><select name="area" id="area"><option value="0">选择地区</option>{$s_area}</select> </td></tr><!--{else}--><input type=hidden name=area value={$s_area} >";<!--{/if}-->变量: $pager属于: category.htm说明: 信息标题分页显示:例:共3记录当前1/1页 20/页第一页上一页下一页最后页模板写法: <!--{template page}-->变量: $articles属于: category.htm说明: 信息列表显示信息的: 标题、地区、过期时间、发布时间模板写法:<!--{loop $articles $article}--><div id=listmain onMouseOver="this.style.background='#FBF9F9'" onmouseout="this.style.background='#ffffff'"><div class=listt1><img src="templates/{$CFG[tplname]}/images/li.gif" align=absMiddle><A class=u0000cc href="{$article['url']}"target=_blank>{$article['title']}</A></div><div class=listt2>{$article['areaname']}</div><div class=listt2>{$article['lastdate']}</div><div class=listt3>{$article[postdate]}</div></div><!--{/loop}-->变量: $here属于: category.htm说明: 当前位置.例:分类首页-->分类标题(地区标题)模板写法:<!--{loop $here $val}-->--&gt;&nbsp;<A href={$val[url]}>{$val[name]}</A>&nbsp;<!--{/loop}-->变量: $cat_pro属于: category.htm说明: 你所选分类下的推荐信息模板写法:<!--{if $cat_pro}--><div class=listrinfo><div>【热门信息】</div><!--{loop $cat_pro $new}--><img src="templates/{$CFG[tplname]}/images/li.gif" align=absMiddle vspace=5><A class=u0000cc style="font-SIZE: 9pt" href="{$new['url']}" target=_blank>{$new['title']}</A><br><!--{/loop}--></div><!--{/if}-->变量: $cat_hot属于: category.htm说明: 你所选分类下的热门信息模板写法:<!--{if $cat_hot}--><div class=listrinfo><div>【推荐信息】</div><!--{loop $cat_hot $hot}--><img src="templates/{$CFG[tplname]}/images/li.gif" align=absMiddle vspace=5><A class=u0000cc style="font-SIZE: 9pt" href="{$hot['url']}" target=_blank>{$hot['title']}</A><br><!--{/loop}--></div><!--{/if}-->变量: $cat_custom属于: category.htm说明: 可用于搜索的附加属性.当且你搜索的分类有附加属性时出现模板写法:<!--{loop $cat_custom $item}--><!--{if $item[type]==0 && $item[search]==1}--><tr><td >{$item[cusname]}:</td><td><input name="custom[{$item[id]}]" type="text" size="15" maxlength="120" /></td></tr><!--{/if}--><!--{if $item[type]==0 && $item[search]==2}--><tr><td>{$item[cusname]}:</td><td><input name=custom[{$item[id]}][from] value=''type=text size=5 maxlength=5 > 至 <input name=custom[{$item[id]}][to] type=text value='' size=5 maxlength=5 ></td></tr>";<!--{/if}--><!--{if $item[type]==1 && $item[search]==1}--><tr><td>{$item[cusname]}:</td><td><select name=custom[{$item[id]}]><option value=0>分类</option>";<!--{if $item[options]}--><!--{loop $item[options] $opt}--><option value=$opt>{$opt}</option><!--{/loop}--><!--{/if}--></select></td></tr><!--{/if}--><!--{/loop}-->变量: $ip属于: post.htm说明: 该变量为发信息人的IP地址模板写法: {$ip}变量: $ip属于: post.htm说明: 该变量为发信息人的IP地址模板写法: {$ip}变量: $catinfo[catname]属于: post.htm说明: $catinfo[catname]为post.php页中$catinfo数组的变量,为分类名称模板写法: {$catinfo[catname]}变量: $custom属于: post.htm说明: 选择的发布信息的分类下的附加属性模板写法: {$custom}变量: $content属于: post.htm说明: 发布信息时的内容项,该变量的信息由FCKediter的编择组成模板写法: {$content}变量: $mappoint属于: post.htm说明: 后台是否设制的“地图设置”。

CMS系统自动生成CGI程序代码结构分析

CMS系统自动生成CGI程序代码结构分析

CMS系统自动生成CGI程序代码结构分析目录CMS系统自动生成CGI程序代码结构分析 (1)目录 (1)说明:红色表示的是系统自动生成的代码,绿色是CMS组件代码,蓝色是自己配置和写的代码,黑色为注释 (4)一、自己写的静态页面转换成动态CGI程序分析 (4)1. 变量的定义: (4)2. COOKIE分解形成COOKIE数组 (4)3. FORM表单处理函数,这里一般获取d_id和page (4)4. 数据库连接 (6)5. 动态配置部分代码,在这块我们可以追加权限控制在动态显示使能配置框中添加 (6)6. 对数据库的操作 (7)7. 产生模板代码、外部CGI程序代码和url的perl代码 (12)二、动态采集程序前台显示代码分析 (18)说明:该程序和上面的程序结构基本上是一样的,不同的地方我会用红色标注出来,然后作些解释 (18)1. 代码部分 (18)三、CMS自动生成的动态采集程序分析 (36)说明:该代码均为系统自动生成,有一些和上面的代码很相近的,就不在过多的解释,只对不同的地方作解释. (36)1.代码部分 (36)动态程序自动产生框架iLogic视浏览器端程序主要由以下部分组成,各部分均可依赖内置iPerl自动产生:[程序头][权控包引入][获取程序所在路径][获取COOKIE数组][表单FORM获取][MainPTD初始化赋值][获取统一用户信息][通用数据库连接函数][动态配置部分代码开始][动态配置部分代码结束][全局登陆访问控制][HTML头函数引用]##################从哈希数组中提取相关模板组件的字段值存放到哈希变量中#################[校正变量通讯录列表的值开始]sql:select onlineid ,mymail ,mobile ,sp_f69 from bycommunicationlimit:1000head:<TABLE>tail:</TABLE>varlist:${'sql_onlineid'},${'sql_mymail'},${'sql_mobile'},${'sql_sp_f69'}code:$aaa=qq|xxx|;html:<TR><TD>${'sql_sp_f69'}</TD><TD>${'sql_mobile'}</TD><TD>${'sql_mymail'}</TD> <TD>${'sql_onlineid'}</TD></TR>[校正变量通讯录列表的值结束]##################产生模板代码、外部CGI程序代码和url的perl代码#################[html代码部分开始]<HTML><HEAD><META NAME="GENERATOR" Content="Microsoft DHTML Editing Control"><TITLE></TITLE></HEAD><BODY><MAINPTDparam='p_id=$p_id&p_cname=$p_cname&poly=1&t_id=$t_id&t_name=bycommunication&op= U&audit_level=0&op_flag=0&d_id=$d_id'><P>在线通讯录</P><P><DIV id=ajaxbegin_sp_f438><PAGEVIEW param='p_id=$p_id&p_cname=$p_cname&t_id=$t_id&mdulname=sp_f438&op=U&isPopup=1'> $Table{'通讯录列表'}</PAGEVIEW></DIV><P></P></BODY></HTML>[html代码部分结束][统一显示权控][HTML编码][还原HTML转义代码][输出HTML][日志记录代理程序][释放内存][错误提示函数][HTML头函数][调试函数][程序尾]说明:红色表示的是系统自动生成的代码,绿色是CMS组件代码,蓝色是自己配置和写的代码,黑色为注释一、自己写的静态页面转换成动态CGI程序分析1.变量的定义:#设置CGI环境变量:设置调用脚本文件的CGI程序在服务器上的相对路径;获得主机IP或者主机名以及SERVER_PORT(端口)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

来个免费的O(∩_∩)O~国内著名CMS: PHPCMS 整站源代码分析讲解首先我对 PHPCMS 的头程序文件开始讲解 : include/common.inc.php 这个文件是程序启动的核心文件.[php]<?php/**代码讲解分析:逆雪寒. 2007 - 12 - 20*/$mtime = explode(' ', microtime());$phpcms_starttime = $mtime[1] + $mtime[0];/**计算脚本开始运行的时间。

很常见的写法。

最后结算还在程序运行的终点位置。

讲到了在给各位说。

*/unset($LANG, $_REQUEST, $HTTP_ENV_VARS, $HTTP_POST_VARS, $HTTP_GET_VARS,$HTTP_POST_FILES, $HTTP_COOKIE_VARS);/**把 $HTTP_ENV_VARS $HTTP_POST_VARS 全局变量设置为 NULL 因为php4.1.0以上默认以 $_POST来替代。

unset后防止程序运行在低版本会出现安全等问题。

比如变量注入*/set_magic_quotes_runtime(0);//地球人都知道。

关了字符窜入库自动转意比如 my name is on'x 转成 my name is on \'x 为了最大的程序性能所以我们关掉吧~哈哈define('IN_PHPCMS', TRUE);/**程序入口标记。

为什么需要这个东西呢。

就好比你进一个小区,保安大哥哥肯定要你签字或是挂个鸟牌证明你是从正门进来的。

防止你翻墙进入去偷东西搞破坏。

这个入口标记也有这个功能。

在这里定义了一个常量 IN_PHPCMS 为 TRUE ,然后我在其他程序文件里面检查这个标记。

如果不存在或不为真,那么就基本可以肯定你这个家伙是个小偷来的。

人可能翻墙进入。

但程序怎么翻墙呢。

只要在php.ini文件里面激活 allow_url_fopen选项,include() 就可以包含 URL 地址了。

你想下如果你有个放密码的PHP文件。

如果给人家include 了以后。

你怕不怕。

*/define('PHPCMS_ROOT', str_replace("\\", '/', substr(dirname(__FILE__), 0, -8)));/**为了程序产品的跨平台。

自动获取程序的安装目录路径 ,定义为 PHPCMS_ROOT 常量。

方便以后程序使用。

建议大家都这样做哦*/require PHPCMS_ROOT.'/include/global.func.php';/**包含全局函数 global.func.php 文件。

里面放了些程序全局都有需要用的函数.大家看到了吧。

常量 PHPCMS_ROOT 已经发挥作用。

这样程序给人家发布到了二级目录下。

也不需要人家手动改整站根目录路径了。

自己好好理解下。

*/$search_arr = array("/ union /i","/ select /i","/ update /i","/ outfile /i","/ or /i"); /**("/ union /i") 这个是正则的写法?不懂正则的自己百度找教程来学。

这里不详细说了*/$replace_arr = array(' union ',' select ',' update ',' outfile ',' or ');/**看这个意思很明了。

union :连接两条SQL语句。

outfile : 主要用来导出数据库资料到其他介质上。

干啥字要定义这两个变量呢?在 global.func.php 文件(前面已经加载)里面有个函数strip_sql() 各位可以看下。

function strip_sql($string){global $search_arr,$replace_arr;return is_array($string) ? array_map('strip_sql', $string) : preg_replace($search_arr, $replace_arr, $string);}函数里面定义了这两个变量为 global全局变量。

那么函数里就可以直接使用了。

先讲解下这个函数吧。

顾名思义这个函数是过滤字符窜里面的SQL语句使得关键的SQL语句单词失效。

主要过滤那些SQL语句呢。

主要是这几个关键字: union select update outfile or 等。

因为这几个SQL字是极度容易在$_GET传输中给截注.这个函数写得实在精妙。

is_array 来判断 $string 是否为数组。

如果是就 array_map() 函数来递归过滤 $string数组里面的每一个单元. 每个单元是一个字符窜吧?当递归调用 strip_sql() 以后 is_array()判断 $string 肯定为假了,因为$string已经不是数组而是字符窜。

所以执行 preg_replace()函数。

这个函数很好理解了。

就是替换了。

*/$_POST = strip_sql($_POST);$_GET = strip_sql($_GET);$_COOKIE = strip_sql($_COOKIE);/**使用strip_sql()函数来过滤 $_POST $_GET $_COOKIE;一般不是开源的站。

很少过SQL关键字过滤。

不过这个也是冒很大风险的。

*/unset($search_arr, $replace_arr);/**unset 使用过但以后不需要的变量。

这个是很好的习惯。

第一不会浪费内存。

如果变量存了大量的数据字节,而后你的程序是一直不需要用的。

那么就会很浪费内存。

拉底程序性能 . 哈哈。

真很书面。

反正是好习惯我们都要学习的拉。

*/$magic_quotes_gpc = get_magic_quotes_gpc(); // get_magic_quotes_gpc()检测gpc是否系统自动转意。

gpc 是什么呢? GET POST COOKIE 来来去去就这几个东西罗。

会返回真或假if(!$magic_quotes_gpc){$_POST = new_addslashes($_POST);$_GET = new_addslashes($_GET);}/**判断一下系统是否打开了自动对gpc进行转意这个选择。

如果是的话,就不需要我们自动转意了。

如果不是那么还是要老百姓的手段。

自己动手丰衣足食。

来看下也是在global.func.php 文件里面定义的这个函数:其实是一个封装好的php的addslashes() 函数的函数。

PHP都自己有了为什么还要自己封装成函数呢?理由很简单。

为了以后的扩展更改容易罗。

如果我们一开始就全部用 addslashes() 这个函数来对 ' 进行转意的话。

那么以后随着程序的发展。

我可能想多过滤个 ^ * ( )之类的那如何是好呢?所以为了以后孩子的成长。

我们还是最好封起来吧。

记住:以后有可能会边的东西。

最好都封装成模块。

函数。

类。

这样程序的灵活度就上去了。

function new_addslashes($string){if(!is_array($string)) return addslashes($string);foreach($string as $key => $val) $string[$key] = new_addslashes($val);return $string;}这个函数也是写得贼好。

也是同时考虑过滤字符窜或数组,也是使用了传归。

看下就应该明白了吧。

这个不用说了。

我们要学下这个思路这个方法方式哦。

这样才能进步。

哈哈。

我们要懂模仿。

*/@extract($_POST, EXTR_OVERWRITE);@extract($_GET, EXTR_OVERWRITE);/**嘿。

extract 前面加个 @鸡蛋做什么呢??抑制错误的。

还不懂的话。

自己百度了。

为什么用extract()函数呢. 平时我们程序是不是要常使用 $_POST $_GET来获取传递的变量呀。

是不是感觉贼麻烦呀。

比如 $_POST['xx'] 这样接受是挺好。

但写多了很麻烦是吧。

我是感觉麻烦。

我现在想直接就 $xx 就可以获取传递过来的东西。

那怎么办呢。

就用了 extract()函数来实现这么一个技巧。

这个技巧在discuz 论坛上也有应用。

*/unset($_POST, $_GET);/**unset() 好处不用说了吧。

释放 $_POST $_GET 数组,因为已经不需要他们了。

*/?>明天放假了.今天在写点罗.放假没空写了.要陪老婆,大家看了有什么不明白的.可以跟帖问.我懂的我会回答.谢谢[/php]继续::2007-12-21吃完中午开始分析了点代码.时间不多.[php]/**代码讲解分析:逆雪寒. 2007 - 12 - 21*/require PHPCMS_ROOT.'/config.inc.php';/**加栽整站的配置参数文件。

一般的程序都会有这个文件。

做什么的呢?比如一些数据库连接地址。

用户名,密码等。

需要用到的参数都定义在这个文件里面。

这样以后配置变了。

我们只要改动下这个文件里面的变量值就好。

是不是很方便呢。

呵呵. 在这里说下 require() 这个加载函数。

require 和 include 都是用来加载其他PHP文件用的。

但他们是有区别的。

require 函数:是"预解释"函数。

就是程序一加载,就执行了require函数。

而include 呢。

是个过程加载函数。

我们可以在逻辑里比如:if 里面使用include 来动态的加载其他程序片段。

而require 就不行。

*/require PHPCMS_ROOT.'/languages/'.$CONFIG['language'].'/ng.php';/**顾名思义:这个就是加载语言包了。

PHP的国际化目前做得最多的。

就是直接用PHP文件来实现。

在 ng.php 文件里面定义程序中要用到的中文信息。

然后在程序一开始就加载。

相关文档
最新文档