扩展主题(分类信息、活动、团购)

Phpwind的扩展主题主要有三类,分类信息、团购和活动。

他们在论坛前台主要涉及到的类分别是

lib\forum\postcate.class.php                        分类信息

lib\forum\posttopic.class.php                      团购

lib\forum\activityforbbs.class.php                      活动

当用户发帖或者编辑帖子的时候,在post.php里面会根据参数来判断是否为特殊贴,使用了哪种类型的扩展主题,再根据扩展贴的类型在发帖页面加载相应的模板。下面截取其中的一部分代码进行讲解。

 

if ($action == 'new') {

 

    $theSpecialFlag = false;//是否是特殊帖子(分类、团购、活动)

    if ($modelid > 0) {/*主题分类*/

       //加载主题分类使用到的类

       L::loadClass('posttopic', 'forum', false);

       //实例化

       $postTopic = new postTopic($pwpost);

       //判断用户是否有权限发这个类型的帖子

       if (!$_G['allowmodelid']) {

           Showmsg('post_allowpost');

       }

       //判断这个版块能能否发这个类型的贴子

       if (strpos(",".$pwforum->foruminfo['modelid'].",",",".$modelid.",") === false) {

           Showmsg('forum_model_undefined');

       }

       //判断这个主题分类是否已经开启允许发送了

       if (!$postTopic->topiccatedb[$postTopic->topicmodeldb[$modelid]['cateid']]['ifable']) {

           Showmsg('topic_cate_unable');

       }

       !$postTopic->topicmodeldb[$modelid]['ifable'] && Showmsg('topic_model_unable');

      

       $special = $pcid = $actmid = 0;

       //如果上面的判断都没问题 ,那么设置这个帖子为特殊贴

       $theSpecialFlag = true;

      

      

    } elseif ($pcid > 0) {/*团购*/

       ...

    } elseif ($actmid > 0) {/*活动分类*/

       ...

    } elseif (!($pwforum->foruminfo['allowtype'] & pow(2,$special))) {

       ...

    }

}

 

在帖子详情页read.php  会判断帖子是否为扩展贴,进行特殊处理

下面这段就是根据不同的扩展类型加载不同的方法

if ($read['modelid'] || $foruminfo['modelid']) {

    L::loadClass('posttopic', 'forum', false);

    $postTopic = new postTopic($read);

}

if ($read['special'] > 20 || $foruminfo['pcid']) {

    L::loadClass('postcate', 'forum', false);

    $postCate = new postCate($read);

}

if ($read['special'] == 8 || $foruminfo['actmids']) {

    L::loadClass('ActivityForBbs', 'activity', false);

    $postActForBbs = new PW_ActivityForBbs($data);

}

 

下面的方法就是获取前台展示的html用的

 

//获取前台展示的html

$topicvalue = $postTopic->getTopicvalue($read['modelid']);

 

模板页面直接做如下的输出就好了

if($read['lou'] == 0 && $topicvalue && (!$read['ifshield'] || $groupid==3) &&!($read['groupid'] == 6 && $db_shield )){print<<<EOT

-->

                     <div class="c"></div>$topicvalue

<!--

EOT;

}

 

lib\forum\postcate.class.phplib\forum\posttopic.class.phplib\forum\activityforbbs.class.php 三个类里面的代码结构都差不多,只是所针对的类型不一样。由于里面方法比较多,不好一一在这里解释,但是方法里面都有相关的注释了。这些类使用很简单,类似下面这样用就可以了。

L::loadClass('posttopic', 'forum', false);

//实例化

$postTopic = new postTopic($pwpost);

$postTopic->topicmodeldb[$modelid]['ifable']