主题和回复的添加主要的入口页面就是post.php。
Post.php里面根据不同的action操作分别加入到不同的程序中。
Action类型有三种:new(发表主题)、reply(回复)、modify(编辑主题或回复)
当action为new时,程序会require 文件require/postnew.php,以执行添加主题的相关操作。
当action为reply时,程序会require 文件require/postreply.php,以执行回复的相关操作。
当action为modify时,程序会require 文件require/postmodify.php,以执行编辑主题和回复的相关操作。
这边主要来介绍下发帖的流程,回帖和编辑跟发帖类似。
1、当程序对post.php发送请求
//获取各个参数的值
S::gp(array('action','article','pid','page'));
S::gp(array('special','modelid','pcid', 'cyid','actmid'),GP,2);
这里加载post时用到的两个基础的类
//加载论坛操作类 文件地址在 lib/forum/forum.class.php
L::loadClass('forum', 'forum', false);
//加载发表帖子操作类 文件地址在 lib/forum/post.class.php
L::loadClass('post', 'forum', false);
2、程序这边会根据用户的请求参数,来判断用户所要进行的操作,当action为new时,程序会require 文件require/postnew.php ,执行添加主题的相关验证和插入数据库等操作。就是post.php页面的下面这段代码。
if ($action == "new") {
require_once(R_P.'require/postnew.php');
} elseif ($action == "reply" || $action == "quote") {
require_once(R_P.'require/postreply.php');
} elseif ($action == "modify") {
require_once(R_P.'require/postmodify.php');
} else {
Showmsg('undefined_action');
}
3、进入require/postnew.php 里面之后,程序会根据传入的step参数的值来判断是打开发帖页还是提交数据。
在这里会加载主题发表的类
L::loadClass('topicpost', 'forum', false);
在插入数据,和数据组装操作的时候都要用这里面的方法的。
4、在require/postnew.php页面。 当step的值为2时,会执行插入数据的操作,这时候会开始验证传入的其他数据是否符合要求,并且组装插入到数据库的数组。
下面这个是接收参数
S::gp(array('atc_title','atc_content'), 'P', 0);
S::gp(array('replayorder','atc_anonymous','atc_newrp','atc_tags','atc_hideatt','magicid','magicname','atc_enhidetype','atc_credittype','flashatt','buildIfcheck','robstarttime','robendtime','robendbuild','robawardbuilds','_usernames', 'replyrewardcredit'),'P');
S::gp(array('atc_iconid','atc_email','digest','topped','atc_hide','atc_requireenhide','atc_rvrc','atc_requiresell','atc_money', 'atc_usesign', 'atc_html', 'p_type', 'p_sub_type', 'atc_convert', 'atc_autourl', 'replyreward'), 'P', 2);
S::gp(array('iscontinue'),'P');//ajax提交时有敏感词时显示是否继续
下面是组装数据,下面的这些方法在lib/forum/post.class.php和lib/forum/topicpost.class.php里面都能找到。需要一些底层的定制修改的话,可以改到这个里面
$postdata = new topicPostData($pwpost);
$replayorder = ( $replayorder
== 1 || $replayorder
== 2 ) ? $replayorder
: 0 ;
$postdata->setStatus('3',decbin($replayorder));
$postdata->setWtype($p_type, $p_sub_type, $t_per, $t_db, $db_forcetype);
$postdata->setTitle($atc_title);
!$postdata->setContent($atc_content) && Showmsg('post_price_limit');
$postdata->setConvert($atc_convert, $atc_autourl);
$postdata->setTags($atc_tags);
$postdata->setAnonymous($atc_anonymous);
$postdata->setHideatt($atc_hideatt);
$postdata->setIfmail($atc_email,$atc_newrp);
$postdata->setDigest($digest);
$postdata->setTopped($topped);
$postdata->setIconid($atc_iconid);
$postdata->setIfsign($atc_usesign, $atc_html);
$postdata->setMagic($magicid,$magicname);
$postdata->setHide($atc_hide);
$postdata->setEnhide($atc_requireenhide, $atc_rvrc, $atc_enhidetype);
$postdata->setSell($atc_requiresell, $atc_money, $atc_credittype);
//$newpost->checkdata();
//@
$postdata->setAtUsers($_usernames);
$postdata->setReplyReward($replyrewardcredit, $replyreward);
$postdata->conentCheck();
这后面就会执行保存数据的操作
$topicpost->execute($postdata);
$tid = $topicpost->getNewId();
例,制作一个简单的发布主题的例子。回帖的功能跟这个类似。
<?php
//包含公共global.php
require_once('global.php');
//获取参数
S::gp(array('action','fid'));
S::gp(array('atc_title','atc_content'));
if ($action == 'new'){
//加载论坛操作类 文件地址在 lib/forum/forum.class.php
L::loadClass('forum', 'forum', false);
//加载发表帖子操作类 文件地址在 lib/forum/post.class.php
L::loadClass('post', 'forum', false);
//包含发帖相关的缓存文件
pwCache::getData(D_P.'data/bbscache/cache_post.php');
//实例化论坛操作类
$pwforum = new PwForum($fid);
//实例化发表帖子操作类
$pwpost = new PwPost($pwforum);
L::loadClass('topicpost', 'forum', false);
$topicpost = new topicPost($pwpost);
$postdata = new topicPostData($pwpost);
$postdata->setTitle($atc_title);
!$postdata->setContent($atc_content) && Showmsg('post_price_limit');
$postdata->setConvert($atc_convert, $atc_autourl);
//插入数据库
$topicpost->execute($postdata);
$tid = $topicpost->getNewId();
//发表成功,跳转
refreshto("read.php?tid=$tid", '发布成功');
}
?>
<html>
<head>
</head>
<body>
<form
action="test.php?fid=2" name="FORM" id="mainForm"
method="post">
标题:<input
value=""
id="atc_title" name="atc_title"> <br/>
内容:<textarea tabindex="200" name="atc_content"
id="textarea" style="height: 300px; width: 300px; "></textarea> <br/>
<button name="Submit" type="submit"> 发 布 </button>
<input type="hidden" name="action" value="new">
<input type="hidden" name="fid" value="2">
</form>
</body>
</html>