【php精品源码栏目提醒】:网学会员--在 php精品源码编辑为广大网友搜集整理了:PHPCMS V9 二次开发实例–留言本 - 其它资料绩等信息,祝愿广大网友取得需要的信息,参考学习。
下面我们将通讲解一个留言本实例,来帮助你更好的掌握 PHPCMS V9 的二次开发流程。
并在开发过程中体验 PHPCMS V9。
在此我们只做基本功能的演示,更多的功能开发,期待你的继续挖掘。
4.1 需求分析 本实例用 PHPCMS V9 基础功能开发设计一个留言本管理系统,要求如下: 后台: 可管理、回复、删除留言信息 可控制留言是否前台显示 可对留言系统配置设置选项,例如是否起用验证码,默认是否显示、是否允许游客留言等配置。
模块配置信息可多站点存储。
可批量管理所有未回复留言 后台管理演示效果如下图所示: 前台: 根据后台模块配置选项,控制是否显示在线留言填写表单。
在线提交留言,根据后台配置选项,是否显示验证码,是否需管理员审核显示。
留言列表页,需根据后台配置每页条数进行分页。
前台演示效果如下图所示:4.2 数据库和数据表的设计 这里使用 Mysql 数据库来存储信息。
首先构建一个留言信息表 guestbook , 它有 12 个字段,即消息编号gid,站点 IDsiteid,标题title,内容content,回复内容reply,回复状态reply_status,会员 IDuid,会员姓名username,审核状态passed ,留言时间inputtime,回复人replyer,回复时间replytime。
下面是创建该表的 SQL 代码: CREATETABLEphpcms_guestbook gidsmallint5NOTNULLauto_increment titlechar80NOTNULL contenttextNOTNULL replytextNOTNULL useridmediumint8unsignedNOTNULLdefault0 usernamechar20NOTNULL gendertinyint1unsignedNOTNULLdefault0 headtinyint3unsignedNOTNULLdefault0 emailchar40NOTNULL qqchar15NOTNULL homepagechar25NOTNULL hiddentinyint1unsignedNOTNULLdefault0 passedtinyint1unsignedNOTNULLdefault0 ipchar15NOTNULL addtimeint10unsignedNOTNULLdefault0 replyerchar20NOTNULL replytimeint10unsignedNOTNULLdefault0 PRIMARYKEY gid KEYhiddenhiddengid4.3 创建模块目录 PHPCMS v9 框架中的模块,位于 phpcms/modules 目录中 每一个目录称之为一个模块,如果要创建一个模块,只要在 phpcms/modules 目录下创建文件夹并放入你的控制器类就可以了。
当前我们要开发一个叫做 guestbook 的留言本模块,那么首先在 phpcms/modules 目录下创建文件夹,并将其命名为 guestbook。
如下图所示: guestbook 模块的标准结构通常是这样的,如下图所示: 其中 classes 为模块类库包 functions 为模块函数库包 templates 为模块模板包 这里通常放置含有权限控制的控制器模板,也就是后台模板。
如果您的模块有单独的前台模版,你需要在 phpcms/templates/default 下 “default”为你的风格包名称,我创建一个您的模块同名目录来放置前台模板,们默认适用 default。
4.4 创建数据模型类文件 建好数据表,创建完模块文件夹以后,接下来进行留言本数据模型的创建。
数据库模型位于:phpcms/model/ 目录下。
数据模型文件的命名规则建议为数据表名称_model.class.
php 如果在我们的创建的模块中我要使用一个数据表“test”,首先需要建立一个数据库模型文件,文件名称为test_model.class.
php,程序结构如下图: ltphp definedIN_PHPCMSorexitNopermissionresources. pc_base::load_sys_classmodel0 class test_modelextendsmodel publicfunction__construct this‐gtdb_configpc_base::load_configdatabase this‐gtdb_settingdefault this‐gttable_nametest parent::__construct gt 在实例中,只需要把加粗字换成当前数据表名即可。
在本例中 guestbook_model.class.
php 数据模型文件为留言本信息表数据模型,结构如下: ltphp definedIN_PHPCMSorexitNopermissionresources. pc_base::load_sys_classmodel0 class guestbook_modelextendsmodel function__construct this‐gtdb_configpc_base::load_configdatabase this‐gtdb_settingdefault this‐gttable_nameguestbook parent::__construct 说明:任何自定义模块的数据模型类,均继承于 model.class.
php 数据模型基类。
在此基类中 PHPCMS 系统已经把最常用的数据库操作方法进行了封装。
二次开发者不必关于如何操作数据库,只需要根据需要用到的,已定义操作方法的要求,传递参数即可。
系统会自动对数据进行处理,并返回定义结果。
4.5 开发模块控制器和函数 在上面的创建模块中我们已经创建好了一个名为“guestbook”的留言本模块,接下来我们继续为这个模块添加两个控制器类。
PHPCMS V9 的控制器就是模块的类文件,位于 phpcms/modules/模块/目录下面。
类名也就是文件名.
php,例如一个名为 guestbook 的控制器,那么他的命名为 guestbook.
php 即可。
控制器类默认继承系统的函数库,可以直接使用。
需要注意的是:控制器类的类名称与控制器文件名必须相同。
本留言本模块有以下二个控制器 控制器名称 默认调用控制函数 说明 index.
php init 前台页面控制器 guestbook.
php init 后台管理控制器 下面将对二个控制做分别一个详细介绍。
4.5.1 前台 index.
php 控制器开发 前台控制器主要涉及前台留言显示、在线留言的提交处理等功能函数,以下为全部源代码,接下来我们将对每个功能块,做个详细介绍,代码如下图所示: ltphp definedIN_PHPCMSorexitNopermissionresources. classindex function__construct this‐gtguestbook_dbpc_base::load_modelguestbook_model this‐gt_usernameparam::get_cookie_username this‐gt_useridparam::get_cookie_userid //定义站点 ID 常量,选择模版使用 siteidisset_GETsiteidintval_GETsiteid:this‐gtget_siteid definequotSITEIDquotsiteid //读取配置,设置分页条数 settingnew_html_special_charsgetcacheguestbookcommons this‐gtsetsettingSITEID publicfunctioninit //读取配置,设置分页条数 settingnew_html_special_charsgetcacheguestbookcommons setsettingSITEID pagesizesettingSITEIDpagesize wherearraypassedgt1siteidgtSITEID pageisset_GETpageampampintval_GETpageintval_GETpage:1 infosthis‐gtguestbook_db‐gtlistinfowheregidDESCpagepagespagesize infosnew_html_special_charsinfos pagesthis‐gtguestbook_db‐gtpages pc_base::load_sys_classform0 includetemplateguestbookindex / 在线留言 / publicfunctionly ifisset_POSTdosubmit ifisset_POSTcode codeisset_POSTcodeampamptrim_POSTcode trim_POSTcode:showmessageLinput_codeHTTP_REFERER if_SESSIONcodestrtolowercode showmessageLcode_errorHTTP_REFERER setthis‐gtset link_dbpc_base::load_modelguestbook_model _POSTlyaddtimeSYS_TIME _POSTlyuseridthis‐gt_userid _POSTlyusernamethis‐gt_username _POSTlysiteidSITEID _POSTlypassedsetcheck_pass link_db‐gtinsert_POSTly showmessageLadd_successquotmguestbookampcindexampsiteidsiteidquot else echositeid.adsfexit settinggetcacheguestbookcommons pc_base::load_sys_classform0 SEOseoSITEIDLapplication_links includetemplateguestbookly gt 接下来将对本控制程序的每一段代码后对其进行分析和解释。
definedIN_PHPCMSorexitNopermissionresources. 这段程序的作用是用来判断本段程序是否处于 PHPCMS 的运行范围内,如果不是,则页面提示 No permission resources 并终止,这在一定程度上避免了脚本包含调用错误引起的被入侵。
其他文件中的相同代码段作用与此相同。
classindex ……….. 接下来就是对控制器类的定义了,在前面也讲过控制器中类的定义,类名必须要和本控制器名称相同,本控制器为 index.
php,所以控制器类名也为 index。
function__construct this‐gtguestbook_dbpc_base::load_modelguestbook_model this‐gt_usernameparam::get_cookie_username this‐gt_useridparam::get_cookie_userid //定义站点 ID 常量,选择模版使用 siteidisset_GETsiteidintval_GETsiteid:this‐gtget_siteid definequotSITEIDquotsiteid //读取配置,设置分页条数 settingnew_html_special_charsgetcacheguestbookcommons this‐gtsetsettingSITEID 上面这段代码是本类的构造函数的定义。
在此函数中this-gtguestbook_db pc_base::load_modelguestbook_model 为加载留言本的数据模型。
this‐gt_usernameparam::get_cookie_username this‐gt_useridparam::get_cookie_userid 这段代码为取得当前登录会员的会员名username和会员 IDuserid,以便在下面留言提交处理程序中使用。
用于记录存储留言者的信息。
//定义站点 ID 常量,选择模版使用 siteidisset_GETsiteidintval_GETsiteid:this‐gtget_siteid definequotSITEIDquotsiteid 这段代码判断是否有站点 IDsiteid传递,如果存在则获取并转化为整型,没有获取到站点 ID,则利用全局函数 get_siteid函数来获取 siteid 值。
此函数定义于 global.func.
php 文件中。
最后把 siteid 值定义为一个常量,以便接下来的程序使用。
//读取配置,设置分页条数 settingnew_html_special_charsgetcacheguestbookcommons this‐gtsetsettingSITEID 接下来上面这段代码,通过 getcache‘guestbook’,’commons’函数来读取留言本配置的缓存文件。
因为此配置文件分多站点存储配置信息,以站点ID 为下标存储的二维数组,所以利用当前站点的 siteid,来获取当前站点的配置信息并赋值一个全局变量。
在下面的函数中就可以直接调用当前站点留言本的配置信息。
publicfunctioninit //读取配置,设置分页条数 pagesizethis‐gtset‘pagesize’ wherearraypassedgt1siteidgtSITEID pageisset_GETpageampampintval_GETpageintval_GETpage:1 infosthis‐gtguestbook_db‐gtlistinfowheregidDESCpagepagespagesize infosnew_html_special_charsinfos pagesthis‐gtguestbook_db‐gtpages pc_base::load_sys_classform0 includetemplateguestbookindex 上面这段代码,是 index 控制器默认执行的功能函数.前面已经有过介绍,如果用户访问时没有指定事件名字,也就是 URL 参数中 a 的值,那么默认 a 将调用 init功能函数。
此段代码的功能为获取留言数据,并根据配置选项进行显示。
在此段代码中,首先从获取的当前配置文件中,设置前台分页的条数。
pagesizethis‐gtset‘pagesize’ this-gtset 为__construct构造函数中,已经定义获取的当前站点配置数组。
如果你不太清楚此配置数组都有那些字段和值,可以打印出来查看一下。
接着定义了一个查询条件语句,并取得当前页数。
wherearraypassedgt1siteidgtSITEID pageisset_GETpageampampintval_GETpageintval_GETpage:1 where 条件语句以数组方式进行定义,PHPCMS V9 会自动对其进行转化。
当然也可以定义为普通条件语句。
例如where ’ siteid 1 ’。
where 条件为数组的格式如下: wherearray条件字段 1gt值条件字段 2gt值 需要注意的是数组条件语句定义,只适用于字段定值查询。
并不适用于字段区间范围值查询,如果 where 语句需要对查询字段值进行区间查询,则只能普通where 查询语句定义。
看如下例子: wherequotmessage_timegtstartANDmessage_timeltendquot 获取当前页数就比较简单了,如果获取到当前页数,并且是常量。
则直接获取,反之默认赋值为 1。
infos this‐gtguestbook_db‐gtlistinfowhereorder gid DESCpage pages pagesize f h l l h f 上面这段代码,this-gtguestbook_db 为 guestbook 数据模型类的实例,guestbook 数据模型类继承于 model 数据模型基类,listinfo为 model 数据模型基类定义的公有方法,故继承的子类 guestbook 可直接调用此函数。
此函数的功能为查询多条数据并分页,详细的程序定义、参数传递请查阅 model 类中此函数的定义。
接着对返回的数据利用 new_html_special_chars函数,进行一下转换处理。
pagesthis‐gtguestbook_db‐gtpages pc_base::load_sys_classform0 includetemplateguestbookindex 此段代码加载系统 form 类,以便于在前台模块文件中生成验证码输入法时使用。
最后 include 模块文件进行数据显示。
以上这一段章节,介绍了前台显示事件 init函数的定义。
里面介绍了如何定义 where 查询语句、获取配置信息、以及如何调用数据模型基类函数listinfo进行数据读取。
中间涉及的一些相关函数的详细定义,以及参数的设置,请读者根据提示,进行查询相关类中的定义。
接下来这段代码是关于提交留言的处理事件函数:ly的定义,其中涉及验证码的判断,提交数据如何存入数据库,下面将做个详细介绍: 首先先看一下完整代码,代码如下: publicfunctionly ifisset_POSTdosubmit ifisset_POSTcode session_storagesession_.pc_base::load_configsystemsession_storage pc_base::load_sys_classsession_storage ifisset_SESSION session_start code isset_POSTcode ampamp trim_POSTcode trim_POSTcode : showmessageLinput_codeHTTP_REFERER if_SESSIONcodestrtolowercode showmessageLcode_errorHTTP_REFERER setthis‐gtset _POSTlyaddtimeSYS_TIME _POSTlyuseridthis‐gt_userid _POSTlyusernamethis‐gt_username _POSTlysiteidSITEID _POSTlypassedsetcheck_pass this‐gtguestbook_db‐gtinsert_POSTly showmessageLadd_successquotmguestbookampcindexampsiteidquot.SITEID else echo ‘请通过正常的方式提交留言,谢谢’ 代码最开始,首先 isset_POSTdosubmit判断是否是提交,如果没有提交,而直接调用此事件,则返回” 请通过正常的方式提交留言,谢谢”的提示语句。
接下来 isset_POST‘code’,判断提交过来的变量是否存在 code 这个字段。
如果存在,则说明前台起用了验证码,那么接下来就需要进行验证码的判断了,如果没有这个字段,则跳过此段,直接继续向下执行,不在对验证码进行判断处理。
下面介绍此段代码,代码如下: ifisset_POSTcode session_storagesession_.pc_base::load_configsystemsession_storage pc_base::load_sys_classsession_storage ifisset_SESSION session_start code isset_POSTcode ampamp trim_POSTcode trim_POSTcode : showmessageLinput_codeHTTP_REFERER if_SESSIONcodestrtolowercode showmessageLcode_errorHTTP_REFERER 因为 V9 验证码的数值是通过 SESSION 传递,故在这段代码中,首先加载配置文件,取出当前系统配置中 SESSION 的存储方式。
然后根据 SESSION 的存储方式,来加载对应的系统类库。
接下来判断如果 SESSION 不存在,则触发session_start。
接下就是获取提交过来的验证码值,并与 session 中的验证码的值相对比,如果提交的验证码不存在,或者为空,则提示“请输入验证码”。
如果验证码存在,但并不等于 session 里面 code 的值,“则提示验证码不正确!”。
setthis‐gtset _POSTlyaddtimeSYS_TIME _POSTlyuseridthis‐gt_userid _POSTlyusernamethis‐gt_username _POSTlysiteidSITEID _POSTlypassedsetcheck_pass this‐gtguestbook_db‐gtinsert_POSTly 接下来上面这段代码为提交过来的数组添加一些新的元素,并赋值,SYS_TIME 为当前系统时间,this-gt_userid 为当前登录用户的账号,this-gt_username 为用户名,SITEID 常量为当前站点的 ID,可能大家会想为什么要存储这个值呢,这是因为 V9 是一个支持站群的系统,一个模块可以应用到多个站点。
所以提交过来的信息为了区分开来,那么就要存储一个 siteid 来记录。
setcheck_pass为当站点配置中是否审核的配置,在后台管理中,可以在 where 语句中通过对这个字段的定义来查询数据库,显示是否通过审核。
this‐gtguestbook_db‐gtinsert_POSTly 最后调用 model 数据模型基类中的 insert函数,把提交表单的数据存入数据库。
此时_POST‘ly’为数组,元素为字段名,键词为字段值。
Insert函数会自动进行处理,把对应数值存入 guestbook 对应数据表里,关于 Insert函数的定义,请查看 model.class.
php 文件的详细定义。
前台显示模版和前台控制器的定义是紧密相连的,介绍完前台控制器 index的定义,接下我们介绍一下前台模块的情况,首先看一下,init事件中调用的index 模版,此前台模版的关键代码,代码如下:ifsetguestbook_statusltdivclassquotboxboxsbgcboxsquotgtlth5gt我要留言 lt/h5gtltdivclassquottag_aquotgtltformactionquotAPP_PATHindex.phpmguestbookampcindexampalyampsiteidSITEIDquotmethodquotpostquotnamequotmyformquotidquotmyformquotgtlttablecellspacingquot1quotcellpaddingquot0quotclassquottable_formquotgtlttbodygtlttrgtltthgt标题lt/thgtlttdgtltinputtypequottextquotvaluequotquotidquottitlequotnamequotly.
上一篇:
嵌入式网页流媒体视频点播系统
下一篇:
竞赛中运动员的心理障碍与心理训练分析