首页 > 开源系统应用 > Phpcms > PHPCMS V9二次开发教程,一个健康测试模块
网站建设、切图、企业建站、微信开发 联系QQ:404658186 tel:18716186715
2015
06-14

PHPCMS V9二次开发教程,一个健康测试模块

文章目录 [收起]

PHPCMS V9采用mvc结构开发,条理清晰,易维护,易扩展,二次开发容易。因为某此项目中需要使用PHPCMS V9开发一个健康测试模块,参考了下官方文档,开发起来还是很简单,下面就分享出来。

先来看看后台效果图

Phpcms v9 二次开发后台效果图

由于此测试模块比较简单,只涉及到选择题,所以开发起来相对容易许多

通过上图先分析开发一个健康测试模块需要准备些什么。

  1. 测试问题(可增删)。
  2. 问题答案选项(可增删)。
  3. 测试答案(分数,可增删)。
  4. 结果判断,当测试总结果等于某个答案的分数时(当然这里可以扩展为分数做来判断,如0-60分),返回本答案的结果,如果都没有匹配的结果则返回默认选项结果。

有了初步的认识,下面就来讲具体实现步骤。

第一步,设计数据库

执行下面的sql。

module.sql

INSERT INTO `phpcms_module` VALUES ('tests', '自测模块', '', '0', '1.0', '', ' ', '0', '0', '2011-06-26', '2011-06-26');

tests.sql

CREATE TABLE `phpcms_tests` (
 `Id` int(11) NOT NULL auto_increment,
 `title` varchar(255),
 `question` mediumtext,
 `answer` mediumtext,
 PRIMARY KEY (`Id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

第二步,创建模块

创建模块

install 安装包
templates 模板文件夹
     templates/tests_add.tpl.php  新增模板
     templates/tests_edit.tpl.php  修改模板
     templates/tests_list.tpl.php  列表模板
     templates/tests_select.tpl.php  后台选择模板
index.php 后台处理文件

index.php 主要用于增删改数据,其中含有拼合数据等操作,这个需要读者自己理解,有疑问,下方留言咨询。

<?php
defined('IN_PHPCMS') or exit('No permission resources.');
pc_base::load_app_class('admin', 'admin', 0);
class index extends admin {
 private $db;
 public function __construct() {
 $this->db = pc_base::load_model('tests_model');
 }
 /*** 显示列表***/
 public function init() {
 $list = $this->db->listinfo('','id desc',$_GET['page']); 
 $pages = $this->db->pages;
 include $this->admin_tpl('tests_list'); 
 
 } 

 //用于文章后台调用
 public function select() {
 if(isset($_POST['dosubmit'])){ 
 <script type='text/javascripg'>window.top.art.dialog({id:'select'}).close()</script>; 
 }else{
 $list = $this->db->listinfo('','id desc',$_GET['page']); 
 $pages = $this->db->pages;
 include $this->admin_tpl('tests_select'); 
 }
 
 } 
 //创建数据
 public function add(){
 if(isset($_POST['dosubmit'])){ 
 $question='array('; //问题
 $answer=''; //答案
 $qname=$_POST["qname"];//有几个问题 
 /******************构造问题字段内容**************************/
 for($i=0;$i<count($qname);$i++){
 $questionno=$qname[$i]; 
 $qno=(string)$i;
 $question.=$qno."=>";//问题一
 $question.="array (";//问题数组
 //当前编号的问题数组
 $curquestion=$_POST["question".$questionno]; 
 $question.="'question'=>'".$curquestion[0]."',";//问题标题
 $question.="'questionitem'=>";//选项数组
 $question.="array(";//选项数组
 $qitem="qitem".$questionno;
 $qscore="qitemscore".$questionno;
 $curitem=$_POST[$qitem];
 $curitemscore=$_POST[$qscore];
 for($j=0;$j<count($curitem);$j++){
 $question.=$j."=>";//选项一
 $question.="array(";
 $question.="'qitemname'=>'".$curitem[$j]."',";//选项一内容
 $question.="'qitemscore'=>'".$curitemscore[$j]."'";//选项一分数
 //选项结束
 if($j!=(count($curitem)-1)){
 $question.= '),';
 }else{
 $question.= ')';
 }
 }
 $question.=")";//选项数组结束
 //问题一结束
 if($i!=(count($qname)-1)){
 $question.="),";
 }else{
 $question.=")";
 }
 }
 $question.= ")"; 
 
 
 /******************构造回答字段内容**************************/
 $answerstr=$_POST["answer"];
 $answerscore=$_POST["answerscore"];
 $answerdefault=$_POST["isdefault"];
 $answer.="array(";
 for($i=0;$i<count($answerstr);$i++){
 $answer.=$i."=>";
 $answer.="array(";
 $answer.="'answerstr'=>'".$answerstr[$i]."',";
 $answer.="'answerscore'=>'".$answerscore[$i]."',";
 $answer.="'answerdefault'=>'".$answerdefault[$i]."'";
 if($i!=(count($answerstr)-1)){
 $answer.="),";
 }else{
 $answer.=")";
 }
 }
 $answer.=")";
 
 $sql = "INSERT INTO `phpcms_tests` (`title`,`question`,`answer`) VALUES (\"".$_POST['title']."\",\"".$question."\",\"".$answer."\")";
 if($this->db->query($sql)) showmessage('添加成功', HTTP_REFERER, '', 'add');
 }else{
 include $this->admin_tpl('tests_add');
 } 
 }
 //修改数据
 public function edit(){
 $_GET['id'] = intval($_GET['id']);
 if(!$_GET['id']) showmessage(L('illegal_operation'));
 if(isset($_POST['dosubmit'])) {
 $question='array('; //问题
 $answer=''; //答案
 $qname=$_POST["qname"];//有几个问题 
 /******************构造问题字段内容**************************/
 for($i=0;$i<count($qname);$i++){
 $questionno=$qname[$i]; 
 $qno=(string)$i;
 $question.=$qno."=>";//问题一
 $question.="array (";//问题数组
 //当前编号的问题数组
 $curquestion=$_POST["question".$questionno]; 
 $question.="'question'=>'".$curquestion[0]."',";//问题标题
 $question.="'questionitem'=>";//选项数组
 $question.="array(";//选项数组
 $qitem="qitem".$questionno;
 $qscore="qitemscore".$questionno;
 $curitem=$_POST[$qitem];
 $curitemscore=$_POST[$qscore];
 for($j=0;$j<count($curitem);$j++){
 $question.=$j."=>";//选项一
 $question.="array(";
 $question.="'qitemname'=>'".$curitem[$j]."',";//选项一内容
 $question.="'qitemscore'=>'".$curitemscore[$j]."'";//选项一分数
 //选项结束
 if($j!=(count($curitem)-1)){
 $question.= '),';
 }else{
 $question.= ')';
 }
 }
 $question.=")";//选项数组结束
 //问题一结束
 if($i!=(count($qname)-1)){
 $question.="),";
 }else{
 $question.=")";
 }
 }
 $question.= ")"; 
 
 
 /******************构造回答字段内容**************************/
 $answerstr=$_POST["answer"];
 $answerscore=$_POST["answerscore"];
 $answerdefault=$_POST["isdefault"];
 $answer.="array(";
 for($i=0;$i<count($answerstr);$i++){
 $answer.=$i."=>";
 $answer.="array(";
 $answer.="'answerstr'=>'".$answerstr[$i]."',";
 $answer.="'answerscore'=>'".$answerscore[$i]."',";
 $answer.="'answerdefault'=>'".$answerdefault[$i]."'";
 if($i!=(count($answerstr)-1)){
 $answer.="),";
 }else{
 $answer.=")";
 }
 }
 $answer.=")";
 
 
 $sql = "update `phpcms_tests` set title='".$_POST['title']."',question=\"".$question."\",answer=\"".$answer."\" where id=$_GET[id]";
 if($this->db->query($sql)) showmessage('编辑成功', HTTP_REFERER, '', 'edit');
 } else {
 $where = array('id' => $_GET['id']);
 $test_info = $this->db->get_one($where);
 pc_base::load_sys_class('form', '', 0);
 //获取站点模板信息
 pc_base::load_app_func('global', 'admin');
 $template_list = template_list($this->siteid, 0);
 foreach ($template_list as $k=>$v) {
 $template_list[$v['dirname']] = $v['name'] ? $v['name'] : $v['dirname'];
 unset($template_list[$k]);
 }
 $show_header = $show_validator = $show_scroll = 1;
 include $this->admin_tpl('tests_edit'); 
 }
 }
 //删除数据
 public function delete(){
 if($_GET['id']){
 if(is_array($_GET['id'])){
 $_GET['id'] = implode(',', $_GET['id']);
 $this->db->query("DELETE FROM `phpcms_tests` WHERE `id` in ($_GET[id])");
 }else{
 $this->db->query("DELETE FROM `phpcms_tests` WHERE `id` in ($_GET[id])");
 }
 showmessage('操作成功', '?m=tests&c=index&a=init');
 }else{
 showmessage('参数不正确', '?m=tests&c=tags&a=init');
 }

 }

} ?>

 

第三步 创建数据库模型类

数据模型文件的命名规则建议为 数据表名称+’_model.class.php’,如本例数据表tests,所以命名为tests_model.class.php

创建数据库模型类

tests_model.class.php

<?php
defined('IN_PHPCMS') or exit('No permission resources.');
pc_base::load_sys_class('model', '', 0);
class tests_model extends model {
 function __construct() {
 $this->db_config = pc_base::load_config('database');
 $this->db_setting = 'default'; //为数据库配置文件中配置数据库链接池名称,默认为default,一般情况下不需要修改。
 $this->table_name = 'tests'; //为数据表名称
 parent::__construct();
 }
}
?>

第四步 添加万能字段调用测试

我是把测试模块插入文章里的,如同投票模块一样。

这需要在文章模型里新建一个,我把它定义为testid,如下图。

添加万能字段

参数内容

<input type='hidden' name='info[testid]' id='testid' value='{FIELD_VALUE}' size='3'> 
<input type='text' id='testtitle' value='{FUNC(GetTestTitle~~{FIELD_VALUE})}'> 
<input type='button' value="选择已有测试" onclick="omnipotent('testid','?m=tests&c=index&a=select&from_api=1','选择已有测试')" class="button">
<input type='button' value="新增测试" onclick="omnipotent('add','?m=tests&c=index&a=add&from_api=1','新增测试',0)" class="button">

万能字段添加后,添加文章的时候就多一个选项“添加测试”,我们可以从测试库里添加一个测试来关联到文章里。

添加测试 添加测试

第五步 添加扩展函数

上面代码中有一个{FUNC(GetTestTitle~~{FIELD_VALUE})},这是是一个扩展函数,通过testid,获取测试标题。

在phpcms/libs/functions/extention.func.php里添加以下代码

function GetTestTitle($testid)
{ 
 if(isset($testid)&& $testid!='')
 {
 $db=pc_base::load_model('content_model'); 
 $title='';
 $list = $db->query("select * from phpcms_tests where id=$testid");
 while ($row = mysql_fetch_array($list) ) 
 { 
 $title=$row["title"];
 }
 return $title; 
 }
 else
 {
 return "";
 }
}

 

 

第六步 修改模板文件

后台工作做好后,还需要做前台工作,通过AJAX提交数据,通过程序判断返回结果,请确定你的网站引用了jquery。

修改phpcms/templates/default/content/show.html 在{$content}下添加如下代码

<!-- 内容关联测试 -->
 {if $testid}
 <div class="testcomplate"></div> 
 <?php 
 $list = $this->db->query("select * from phpcms_tests where id=$testid");
 while ($row = mysql_fetch_array($list) ) { 
 $q=$row['question'];
 eval("\$q = $q;");
 $qitem=$q[0]['questionitem']; 
 ?>
 <div id="divtest">
 <input type="hidden" value="0" id="testres" />
 <p><span>问题1:</span><?php echo $q[0]["question"];?></p>
 <?php
 for($i=0;$i<count($qitem);$i++)
 {
 ?> 
 <div onclick="dotest({$testid},0,0,<?php echo $qitem[$i]["qitemscore"];?>)"><input type="radio" name="test" /><?php echo $qitem[$i]["qitemname"];?></div> 
 <?php }?>
 </div>
 <?php 
 } 
 ?> 
 
 <script type="text/javascript">
 $(document).ready(function(){ 
 $('#divtest div').live('mouseover', function() {
 $(this).addClass("cur");
 });
 $('#divtest div').live('mouseout', function() {
 $(this).removeClass("cur");
 }); 
 });
 function showRes(){
 $(".testcomplate").css("display","block");
 }
 $.ajaxSetup({ 
 cache: false 
 }); 
 /*测试id,问题id,选项id,得分*/ 
 function dotest(testid,qid,itemid,s){
 $.ajax({
 type: "GET",
 url: "{APP_PATH}test/testform.php",
 dataType: "html",
 data: "testid=" + testid+"&qid="+qid+"&itemid="+itemid+"&s="+s+"&res="+$("#testres").val(),
 beforeSend: function (XMLHttpRequest) {
 },
 success: function (msg) {
 if (msg != "") {
 $("#divtest").html(''); 
 $("#divtest").append(msg);
 } else {
 $("#divtest").html('');
 }
 },
 complete: function (XMLHttpRequest, textStatus) {
 //隐藏正在查询图片 
 
 },
 error: function () {
 //错误处理 
 }
 });
 }
 </script>
 {/if}

添加css

/*添加的测试css*/
.testcomplate{width:663px; height:100px; background:url(../images/testcomplete.gif) center top no-repeat; display:none;}
#divtest{border: 1px #ffd7b7 solid;background: #fffbf4;padding:10px 20px;margin-top:20px;}
#divtest p{ line-height:32px;font-weight:bold; margin:0px 0px 10px 0px; }
#divtest span{width:88px; height:32px; line-height:30px; text-indent:10px; background:url(../images/testitembg.png) no-repeat; display:block; font-size:14px; color:#fff; float:left;}
#divtest div{margin:5px 0px;padding:10px 0px; width:100%; cursor:pointer;border:solid 1px #fffbf4;} 
#divtest .cur{border:solid 1px #fee7d4;background:#fff;}

第七步 添加文件testform.php

/test/testform.php

<?php 

define('PHPCMS_PATH', dirname(dirname(__FILE__)).DIRECTORY_SEPARATOR);
include PHPCMS_PATH.'/phpcms/base.php'; 
$db = pc_base::load_model('tests_model');
 
$testid=$_GET["testid"];//测试id
$qid=$_GET["qid"];//问题id
$itemid=$_GET["itemid"];//选项id
$s=$_GET["s"];//选项得分
$res=$_GET["res"];//目前总分 
$list = $db->query("select * from phpcms_tests where id=$testid");
while ($row = mysql_fetch_array($list) ) 
{ 
 $q=$row['question'];
 eval("\$q = $q;");
 $qcount=count($q); 
 $str.='<input type="hidden" value="'.(string)((int)$res+(int)$s).'" id="testres" />';
 $str.='<p><span>问题'.(string)((int)$qid+2).':</span>'.$q[(int)$qid+1]["question"].'</span>';
 $qitem=$q[(int)$qid+1]['questionitem'];
 for($i=0;$i<count($qitem);$i++)
 {
 $str.='<div id="test0" onclick="dotest('.$testid.','.(string)((int)$qid+1).','.(string)((int)$itemid+1).','.$qitem[$i]["qitemscore"].')"><input type="radio" name="test"/>'.$qitem[$i]["qitemname"].'</div>'; 
 } 
 if((int)$qid+1==$qcount)
 {
 $str=''; 
 $a=$row["answer"];
 eval("\$a=$a;"); 
 for($j=0;$j<count($a);$j++)
 {
 if($a[$j]['answerdefault']=='on')
 {
 $str=$a[$j]['answerstr'];
 }
 $curscore=$a[$j]['answerscore'];
 if(strpos($curscore,'-',0)){
 $scorearr=explode("-", $curscore);
 if(((int)$res+(int)$s) >=$scorearr[0] && ((int)$res+(int)$s) <=$scorearr[1]){
 $str= $a[$j]['answerstr'];
 }
 }else{
 if($curscore==((int)$res+(int)$s))
 {
 $str= $a[$j]['answerstr'];
 } 
 } 
 }
 } 
 echo $str;
} 
?>

现在使用PHPCMS V9二次开发的一个测试模块就做好了,来看看具体效果。

后台test选项

后台效果

前台实现效果

测试效果图

 

 

选择答案后,弹出结果

测试效果图

上面就是整个制作过程,下面分享出下载源码,如有疑问请留言咨询。

下载

最后编辑:
作者:码农一号
这个作者貌似有点懒,什么都没有留下。
捐 赠如果您觉得这篇文章有用处,请支持作者!鼓励作者写出更好更多的文章!

PHPCMS V9二次开发教程,一个健康测试模块》有 3 条评论

  1. 7pakinek 说:

    非常感谢,收藏了这个页面,好好研究研究!!

  2. 映子 说:

    新手 下载下来之后无法访问 页面提示 No permission resources.

留下一个回复

你的email不会被公开。

*