主题&回复(CRUD

主题和回复的添加主要的入口页面就是post.php

Post.php里面根据不同的action操作分别加入到不同的程序中。

 

Action类型有三种:new(发表主题)reply(回复)、modify(编辑主题或回复)

actionnew时,程序会require 文件require/postnew.php,以执行添加主题的相关操作。

 

actionreply时,程序会require 文件require/postreply.php,以执行回复的相关操作。

actionmodify时,程序会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、程序这边会根据用户的请求参数,来判断用户所要进行的操作,当actionnew时,程序会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.phplib/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>