PHPCMS V9 二次开发实例–留言本.docx

上传人:小飞机 文档编号:3163772 上传时间:2023-03-11 格式:DOCX 页数:35 大小:50.98KB
返回 下载 相关 举报
PHPCMS V9 二次开发实例–留言本.docx_第1页
第1页 / 共35页
PHPCMS V9 二次开发实例–留言本.docx_第2页
第2页 / 共35页
PHPCMS V9 二次开发实例–留言本.docx_第3页
第3页 / 共35页
PHPCMS V9 二次开发实例–留言本.docx_第4页
第4页 / 共35页
PHPCMS V9 二次开发实例–留言本.docx_第5页
第5页 / 共35页
亲,该文档总共35页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《PHPCMS V9 二次开发实例–留言本.docx》由会员分享,可在线阅读,更多相关《PHPCMS V9 二次开发实例–留言本.docx(35页珍藏版)》请在三一办公上搜索。

1、PHPCMS V9 二次开发实例留言本下面我们将通讲解一个留言本实例,来帮助你更好的掌握PHPCMS V9的二次开发流程。并在开发过程中体验PHPCMS V9。 在此我们只做基本功能的演示,更多的功能开发,期待你的继续挖掘。 4.1需求分析 本实例用PHPCMS V9基础功能开发设计一个留言本管理系统,要求如下: 后台: 可管理、回复、删除留言信息 可控制留言是否前台显示 可对留言系统配置设置选项,例如是否起用验证码,默认是否显示、是否允许游客留言等配置。模块配置信息可多站点存储。 可批量管理所有未回复留言 后台管理演示效果如下图所示: 前台: 根据后台模块配置选项,控制是否显示在线留言填写表

2、单。 在线提交留言,根据后台配置选项,是否显示验证码,是否需管理员审核显示。 留言列表页,需根据后台配置每页条数进行分页。 前台演示效果如下图所示:4.2数据库和数据表的设计 这里使用Mysql数据库来存储信息。 首先构建一个留言信息表 guestbook , 它有12个字段,即消息编号(gid),站点ID(siteid),标题(title),内容(content),回复内容(reply),回复状态(reply_status),会员ID(uid),会员姓名(username),审核状态(passed) ,留言时间(inputtime),回复人(replyer),回复时间(replytime)。

3、下面是创建该表的SQL代码: CREATE TABLE phpcms_guestbook ( gid smallint(5) NOT NULL auto_increment, title char(80) NOT NULL, content text NOT NULL, reply text NOT NULL, userid mediumint(8) unsigned NOT NULL default 0, username char(20) NOT NULL, gender tinyint(1) unsigned NOT NULL default 0, head tinyint(3) uns

4、igned NOT NULL default 0, email char(40) NOT NULL, qq char(15) NOT NULL, homepage char(25) NOT NULL, hidden tinyint(1) unsigned NOT NULL default 0, passed tinyint(1) unsigned NOT NULL default 0, ip char(15) NOT NULL, addtime int(10) unsigned NOT NULL default 0, replyer char(20) NOT NULL, replytime i

5、nt(10) unsigned NOT NULL default 0, PRIMARY KEY (gid), KEY hidden (hidden,gid); 4.3创建模块目录 PHPCMS v9框架中的模块,位于phpcms/modules目录中 每一个目录称之为一个模块,如果要创建一个模块,只要在 phpcms/modules 目录下创建文件夹并放入你的控制器类就可以了。 当前我们要开发一个叫做guestbook的留言本模块,那么首先在 phpcms/modules 目录下创建文件夹,并将其命名为guestbook。 如下图所示: guestbook 模块的标准结构通常是这样的,如下图所

6、示: 其中 classes 为模块类库包 functions 为模块函数库包 templates 为模块模板包 这里通常放置含有权限控制的控制器模板,也就是后台模板。 如果您的模块有单独的前台模版,你需要在phpcms/templates/default下创建一个您的模块同名目录来放置前台模板,“default”为你的风格包名称,我们默认适用default。 4.4创建数据模型类文件 建好数据表,创建完模块文件夹以后,接下来进行留言本数据模型的创建。 数据库模型位于:phpcms/model/ 目录下。 数据模型文件的命名规则建议为数据表名称+_model.class.php 如果在我们的创建

7、的模块中我要使用一个数据表“test”,首先需要建立一个数据库模型文件,文件名称为test_model.class.php,程序结构如下图: db_config = pc_base:load_config(database); $this-db_setting = default; $this-table_name = test; parent:_construct; ? 在实例中,只需要把加粗字换成当前数据表名即可。 在本例中guestbook_model.class.php数据模型文件为留言本信息表数据模型,结构如下: db_config = pc_base:load_config(dat

8、abase); $this-db_setting = default; $this-table_name = guestbook; parent:_construct; 说明:任何自定义模块的数据模型类,均继承于model.class.php 数据模型基类。在此基类中PHPCMS 系统已经把最常用的数据库操作方法进行了封装。 二次开发者不必关于如何操作数据库,只需要根据需要用到的,已定义操作方法的要求,传递参数即可。系统会自动对数据进行处理,并返回定义结果。 4.5开发模块控制器和函数 在上面的创建模块中我们已经创建好了一个名为“guestbook”的留言本模块,接下来我们继续为这个模块添加两

9、个控制器类。 PHPCMS V9的控制器就是模块的类文件,位于phpcms/modules/模块/目录下面。类名也就是文件名+.php,例如一个名为guestbook的控制器,那么他的命名为guestbook.php即可。控制器类默认继承系统的函数库,可以直接使用。需要注意的是:控制器类的类名称与控制器文件名必须相同。 本留言本模块有以下二个控制器 控制器名称 index.php guestbook.php 默认调用控制函数 init init 说明 前台页面控制器 后台管理控制器 下面将对二个控制做分别一个详细介绍。 4.5.1前台index.php控制器开发 前台控制器主要涉及前台留言显示

10、、在线留言的提交处理等功能函数,以下为全部源代码,接下来我们将对每个功能块,做个详细介绍,代码如下图所示: guestbook_db = pc_base:load_model(guestbook_model); $this-_username = param:get_cookie(_username); $this-_userid = param:get_cookie(_userid); /定义站点ID常量,选择模版使用 $siteid = isset($_GETsiteid) ? intval($_GETsiteid) : $this-get_siteid; define(SITEID,$s

11、iteid); /读取配置,设置分页条数 $setting = new_html_special_chars(getcache(guestbook, commons); $this-set = $settingSITEID; public function init /读取配置,设置分页条数 $setting = new_html_special_chars(getcache(guestbook, commons); $set = $settingSITEID; $pagesize = $settingSITEIDpagesize; $where = array(passed=1,siteid

12、=SITEID); $page = isset($_GETpage) & intval($_GETpage) ? intval($_GETpage) : 1; $infos = $this-guestbook_db-listinfo($where, gid DESC,$page, $pages = $pagesize); $infos = new_html_special_chars($infos); $pages = $this-guestbook_db-pages; pc_base:load_sys_class(form, , 0); include template(guestbook,

13、 index); /* * 在线留言 */ public function ly if(isset($_POSTdosubmit) if(isset($_POSTcode) $code = isset($_POSTcode) & trim($_POSTcode) ? trim($_POSTcode) : showmessage(L(input_code), HTTP_REFERER); if ($_SESSIONcode != strtolower($code) showmessage(L(code_error), HTTP_REFERER); $set = $this-set; $link_

14、db = pc_base:load_model(guestbook_model); $_POSTlyaddtime = SYS_TIME; $_POSTlyuserid = $this-_userid; $_POSTlyusername = $this-_username; $_POSTlysiteid = SITEID; $_POSTlypassed = $setcheck_pass; $link_db-insert($_POSTly); showmessage(L(add_success), ?m=guestbook&c=index&siteid=$siteid); else echo $

15、siteid.adsf;exit; $setting = getcache(guestbook, commons); pc_base:load_sys_class(form, , 0); $SEO = seo(SITEID, , L(application_links), , ); include template(guestbook, ly); ? 接下来将对本控制程序的每一段代码后对其进行分析和解释。 defined(IN_PHPCMS) or exit(No permission resources.); 这段程序的作用是用来判断本段程序是否处于PHPCMS的运行范围内,如果不是,则页面

16、提示No permission resources并终止,这在一定程度上避免了脚本包含调用错误引起的被入侵。其他文件中的相同代码段作用与此相同。 class index . 接下来就是对控制器类的定义了,在前面也讲过控制器中类的定义,类名必须要 和本控制器名称相同,本控制器为index.php,所以控制器类名也为index。 function _construct $this-guestbook_db = pc_base:load_model(guestbook_model); $this-_username = param:get_cookie(_username); $this-_user

17、id = param:get_cookie(_userid); /定义站点ID常量,选择模版使用 $siteid = isset($_GETsiteid) ? intval($_GETsiteid) : $this-get_siteid; define(SITEID,$siteid); /读取配置,设置分页条数 $setting = new_html_special_chars(getcache(guestbook, commons); $this-set = $settingSITEID; 上面这段代码是本类的构造函数的定义。在此函数中$this-guestbook_db = pc_base

18、:load_model(guestbook_model); 为加载留言本的数据模型。 $this-_username = param:get_cookie(_username); $this-_userid = param:get_cookie(_userid); 这段代码为取得当前登录会员的会员名(username)和会员ID(userid),以便在下面留言提交处理程序中使用。用于记录存储留言者的信息。 /定义站点ID常量,选择模版使用 $siteid = isset($_GETsiteid) ? intval($_GETsiteid) : $this-get_siteid; define(

19、SITEID,$siteid); 这段代码判断是否有站点ID(siteid)传递,如果存在则获取并转化为整型,没有获取到站点ID,则利用全局函数get_siteid;函数来获取siteid值。此函数定义于global.func.php 文件中。最后把siteid值定义为一个常量,以便接下来的程序使用。 / 读取配置,设置分页条数 $setting = new_html_special_chars(getcache(guestbook, commons); $this-set = $settingSITEID; 接下来上面这段代码,通过getcache(guestbook,commons)函数来

20、读取留言本配置的缓存文件。因为此配置文件分多站点存储配置信息,以站点ID为下标存储的二维数组,所以利用当前站点的siteid,来获取当前站点的配置信息并赋值一个全局变量。在下面的函数中就可以直接调用当前站点留言本的配置信息。 public function init /读取配置,设置分页条数 $pagesize = $this-setpagesize; $where = array(passed=1,siteid=SITEID); $page = isset($_GETpage) & intval($_GETpage) ? intval($_GETpage) : 1; $infos = $th

21、is-guestbook_db-listinfo($where,gid DESC,$page, $pages = $pagesize); $infos = new_html_special_chars($infos); $pages = $this-guestbook_db-pages; pc_base:load_sys_class(form, , 0); include template(guestbook, index); 上面这段代码,是index控制器默认执行的功能函数.前面已经有过介绍,如果用户访问时没有指定事件名字,也就是URL参数中a的值,那么默认a将调用init功能函数。 此段

22、代码的功能为获取留言数据,并根据配置选项进行显示。 在此段代码中,首先从获取的当前配置文件中,设置前台分页的条数。 $pagesize = $this-setpagesize; $this-set为_construct构造函数中,已经定义获取的当前站点配置数组。如果你不太清楚此配置数组都有那些字段和值,可以打印出来查看一下。 接着定义了一个查询条件语句,并取得当前页数。 $where = array(passed=1,siteid=SITEID); $page = isset($_GETpage) & intval($_GETpage) ? intval($_GETpage) : 1; $wh

23、ere 条件语句以数组方式进行定义,PHPCMS V9会自动对其进行转化。当然也可以定义为普通条件语句。例如$where = siteid =1 。$where 条件为数组的格式如下: $where = array(条件字段1=值,条件字段2=值); 需要注意的是数组条件语句定义,只适用于字段定值查询。并不适用于字段区间范围值查询,如果where语句需要对查询字段值进行区间查询,则只能普通where 查询语句定义。看如下例子: $where = message_time = $start AND message_time guestbook_db-listinfo($where,$order

24、= gid DESC,$page, $pages = $pagesize); $infos = new_html_special_chars($infos); 上面这段代码,$this-guestbook_db为guestbook数据模型类的实例,guestbook数据模型类继承于model 数据模型基类,listinfo为model 数据模型基类定义的公有方法,故继承的子类guestbook可直接调用此函数。 此函数的功能为查询多条数据并分页,详细的程序定义、参数传递请查阅model类中此函数的定义。 接着对返回的数据利用new_html_special_chars函数,进行一下转换处理。

25、$pages = $this-guestbook_db-pages; pc_base:load_sys_class(form, , 0); include template(guestbook, index); 此段代码加载系统form类,以便于在前台模块文件中生成验证码输入法时使用。最后include模块文件进行数据显示。 以上这一段章节,介绍了前台显示事件init函数的定义。 里面介绍了如何定义where 查询语句、获取配置信息、以及如何调用数据模型基类函数listinfo进行数据读取。中间涉及的一些相关函数的详细定义,以及参数的设置,请读者根据提示,进行查询相关类中的定义。 接下来这段代

26、码是关于提交留言的处理事件函数:ly的定义,其中涉及验证码的判断,提交数据如何存入数据库,下面将做个详细介绍: 首先先看一下完整代码,代码如下: public function ly if(isset($_POSTdosubmit) if(isset($_POSTcode) $session_storage = session_.pc_base:load_config(system,session_storage); pc_base:load_sys_class($session_storage); if(!isset($_SESSION) session_start; $code = iss

27、et($_POSTcode) & trim($_POSTcode) ? trim($_POSTcode) : showmessage(L(input_code), HTTP_REFERER); if ($_SESSIONcode != strtolower($code) showmessage(L(code_error), HTTP_REFERER); $set = $this-set; $_POSTlyaddtime = SYS_TIME; $_POSTlyuserid = $this-_userid; $_POSTlyusername = $this-_username; $_POSTly

28、siteid = SITEID; $_POSTlypassed = $setcheck_pass; $this-guestbook_db-insert($_POSTly); showmessage(L(add_success), ?m=guestbook&c=index&siteid= .SITEID); else echo 请通过正常的方式提交留言,谢谢; 代码最开始,首先isset($_POSTdosubmit)判断是否是提交,如果没有提交,而直接调用此事件,则返回” 请通过正常的方式提交留言,谢谢”的提示语句。 接下来 isset($_POSTcode),判断提交过来的变量是否存在cod

29、e这个字段。如果存在,则说明前台起用了验证码,那么接下来就需要进行验证码的判断了,如果没有这个字段,则跳过此段,直接继续向下执行,不在对验证码进行判断处理。 下面介绍此段代码,代码如下: if(isset($_POSTcode) $session_storage = session_.pc_base:load_config(system,session_storage); pc_base:load_sys_class($session_storage); if(!isset($_SESSION) session_start; $code = isset($_POSTcode) & trim($

30、_POSTcode) ? trim($_POSTcode) : if ($_SESSIONcode != strtolower($code) showmessage(L(code_error), HTTP_REFERER); showmessage(L(input_code), HTTP_REFERER); 因为V9验证码的数值是通过SESSION传递,故在这段代码中,首先加载配置文件,取出当前系统配置中SESSION的存储方式。然后根据SESSION的存储方式,来加载对应的系统类库。接下来判断如果SESSION不存在,则触发session_start。 接下就是获取提交过来的验证码值,并与s

31、ession中的验证码的值相对比,如果提交的验证码不存在,或者为空,则提示“请输入验证码”。如果验证码存在,但并不等于session里面code的值,“则提示验证码不正确!”。 $set = $this-set; $_POSTlyaddtime = SYS_TIME; $_POSTlyuserid = $this-_userid; $_POSTlyusername = $this-_username; $_POSTlysiteid = SITEID; $_POSTlypassed = $setcheck_pass; $this-guestbook_db-insert($_POSTly); 接下

32、来上面这段代码为提交过来的数组添加一些新的元素,并赋值,SYS_TIME为当前系统时间,$this-_userid为当前登录用户的账号,$this-_username为用户名,SITEID常量为当前站点的ID,可能大家会想为什么要存储这个值呢,这是因为V9是一个支持站群的系统,一个模块可以应用到多个站点。所以提交过来的信息为了区分开来,那么就要存储一个siteid来记录。$setcheck_pass为当站点配置中是否审核的配置,在后台管理中,可以在where语句中通过对这个字段的定义来查询数据库,显示是否通过审核。 $this-guestbook_db-insert($_POSTly); 最后

33、调用model数据模型基类中的insert函数,把提交表单的数据存入数据库。此时$_POSTly为数组,元素为字段名,键词为字段值。Insert函数会自动进行处理,把对应数值存入guestbook对应数据表里,关于Insert函数的定义,请查看model.class.php文件的详细定义。 前台显示模版和前台控制器的定义是紧密相连的,介绍完前台控制器index的定义,接下我们介绍一下前台模块的情况,首先看一下,init事件中调用的index模版,此前台模版的关键代码,代码如下: if $setguestbook_status 我要留言 标题 内容 if $setenablecheckcode=

34、1 验证码: form:checkcode(code_img,4,14,110,30) /if /if 上面这段代码,首先根据控制器里获取的当前站点配置信息是否开启留言设置,也就是$setguestbook_status的值 ,来判断是否显示提交表单。关于验证码了是如此处理,如果配置数组中$setenablecheckcode=1则显示验证码输入框,反之不显示验证这一项,这也就是后台配置,对前台显示的控制的一种表现。接下来这段代码就是对从数据库查询出来的留言数据进行显示, $infotitle $infocontent if $inforeply回复内容: $inforeply/if 此代码中

35、首先判断index控制器中,init事件获取的$infos 变量是否为数组,如果是数组,则进行foreach循环显示。$infos为根据查询条件而返回的留言信息。 小结: 本章节详细介绍了留言本前台控制器index的定义,其中涉及了V9的数据的存储与调用。条件查询语句的定义,缓存文件的读取,以及验证码的使用。读者可参考源码,根据需求添加更多的功能,例如增加留言提交时间间隔功能等功能,加深对PHPCMS V9控制器开发的理解。 4.5.2后台guestbook.php控制器开发 后台管理控制器含权限控制,只有特定管理员才有权限访问,所以这个控制器需要加载admin 模块下的admin类,并继承该

36、类。 需要注意的是,因为添加的控制器继承了 admin 类,所以添加的控制器的方法名不能和父类具有相同方法名。否则会造成影响,具体请看admin 类中有哪些方法。 以下为该后台管理控制器guestbook.php 的相关定义: 首先,检查系统常量是否存,看是否是经过正规渠道,进入系统。如果系统常量不存在,则返回错误,存在则继续。 defined(IN_PHPCMS) or exit(No permission resources.); 接下来,实例化模块类 admin 类。 pc_base: load_app_class(admin,admin,0); 创建控制器类 guestbook ,类名

37、必须与文件名相同继承于 admin 类 。 构造函数继承于admin 类构造函数,并加入guestbook 模块数据模型。 class guestbook extends admin function _construct parent:_construct;/继承父类构造函数 $this-M = new_html_special_chars(getcache(guestbook, commons);/读取留言本配置缓存文件 $this-guestbook_db = pc_base:load_model(guestbook_model); 在构造函数里,做了以下几个操作: 首先继承父级构造函数

38、。 parent:_construct; 读取guestbook模块配置缓存,后面修改配置时会用到读取的数据。 $this -M= new_html_special_chars(getcache(guestbook, commons); 加载留言本数据模型。 $this -guestbook_db = pc_base:load_model(guestbook_model); 至此已经完成对guestbook 控制器的最基本定义,接下来就可以在这个控制器类里根据需要进行模块函数的定义开发。 1. 默认执行函数 init : 在前面的章节,我们介绍过当访问模块控制器,未指定控制器模块函数名,则默认执行init 函数。 例如:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号