PHP:打造一個無限極評論模組

PHPz
發布: 2023-03-07 10:08:01
原創
4173 人瀏覽過

我的畢設專案的評論模組原來是採用多說外掛程式完成的,但是我現在希望能夠自己管理評論內容,所以我自己開始寫評論模組。具體準備採用與下評論類似的結構,即一級評論直接顯示在文章下方,而二三級評論顯示在一級評論的下方,如下圖所示:

PHP:打造一個無限極評論模組

評論結構

我覺得這可以說是無限極分類的一種運用,準確的說是子孫樹的運用,進行子孫樹分類後,循環輸出內容,形成評論(不懂無限極分類的朋友可以去看看我的文章無限極分類原理與實現)。

當然,真正完成無限極回評論的功能還有其他的要點,以下就來說說我是怎麼完成無限極評論的。

資料庫設計

首先,就是資料表的設計。如果是論壇系統,可以將評論的資料分割成兩個表,一個表格儲存評論的訊息,包括發佈貼文的使用者id或回覆的使用者id回覆的貼文id回覆的時間等;另一個表,儲存評論的內容,包括貼文的主題和回覆的內容。

我完成的是文章的評論模組,就沒分成兩個表了,直接將評論的內容與資訊放在一起,如下面結構:

comm_idINTUNSIGNED PRIMARY AUTO_INCREMENT#user_idINTUNSIGNED NOT DEFAULT 0#使用者idparent_id#INTUNSIGNED NOT NULL DEFAULT 0評論的父級artcile_idINT#UNSIGNED NOT NULL DEFAULT 0 comm_cont評論的內容INT
列名 列型別 屬性 #說明
KEY主鍵
NULL

評論的文章id
#TEXT comm_time
####UNSIGNED NOT NULL DEFAULT 0#########評論發布###的時間#############

SQL語句:

CREATE TABLE comment (
    comm_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    user_id INT UNSIGNED NOT NULL DEFAULT 0 ,
    parent_id INT UNSIGNED NOT NULL DEFAULT 0 ,
    article_id INT UNSIGNED NOT NULL DEFAULT 0 ,
    comm_cont TEXT,
    comm_time INT UNSIGNED NOT NULL DEFAULT 0 
) ENGINE=MYISAM CHARSET=UTF8 ;
登入後複製

這種結構是完成無限極回復的基礎,也能夠很明顯的看出取出的資料能很好的進行無限極分類。

評論的結構分析

完成一個評論模組是很容易的,評論放入資料庫,然後取回放置在html中,同樣能完成評論模組。但是,這種結構是很雜亂,而且無序的。要完成如評論一樣的評論模組,就得採用特殊的方式。

那麼,就要好好觀察一下評論的結構了。

PHP:打造一個無限極評論模組

評論結構

結合上面的資料表結構,可以推論一下,從資料表中取出且無限極分類後的數據,它的結構應該是這樣的:

array (
    array(一级评论,
        child=>array(
            二级评论,
            三级评论
            )
        ),
    array (
        一级评论 ,
        child=>array(
            )
    ……
登入後複製

為什麼這麼說?你可以很明顯的看出,二級、三級評論被包裹在一級評論中,而二級、三級評論是平行關係;因此,二級、三級評論是一級評論的子孫節點,而二級、三級評論是平行節點,不存在父子關係。

因此,可以得出,分類後的數據有且只有一個子孫節點,多級評論無論是不是對一級評論進行回复,只要是處於一級評論的範圍,那麼它的父節點必然是一級評論。

那麼,二級、三級回覆中的@某某某又是怎麼實現的?其實,我在這裡困擾了很久。我期望用對錶的自身連接來完成,但是不行,破壞了上面所述的結構。最後,我從請求的json資料中得到了答案,請看評論的json資料:

PHP:打造一個無限極評論模組

##JSON資料

上傳後面有點模糊,各位同學可以藉助火狐或谷歌瀏覽器上面的插件觀察JSON資料。

重點觀察

compiled_content字段,可以推斷它是將@某某某直接儲存到資料庫中的。這樣問題就解決了,同時觀察json數據,也能夠驗證我上面所述的結構是正確的。

具體實作

分析完結構就來說說具體怎麼來完成無限極回應。第一步,一級評論形成,這個簡單,直接將評論存儲即可

PHP:打造一個無限極評論模組

#一級評論

#而二級評論要利用到js,點擊評論時,獲取一級評論的用戶名,並保存,在發布回复時注意將其和評論的內容結合在一起發送到後台:

PHP:打造一個無限極評論模組

二級評論

// replyUser 即 被回复的用户名 @xxxx
var content = $('#reply').val.split(replyUser)[1];
var userlink = '<a href="#" class="xxx" target="_blank" >' + replyUser + '</a>';
var comm_cont = encodeURIComponent(userlink+content);
登入後複製
那麼在資料庫中表現如下:

PHP:打造一個無限極評論模組

資料表內容

#之後就是一個關鍵點,利用子孫樹進行分類,分類

函數如下:

/**
 * @param $data array  数据
 * @param $parent  string 父级元素的名称 如 parent_id
 * @param $son     string 子级元素的名称 如 comm_id
 * @param $pid     int    父级元素的id 实际上传递元素的主键
 * @return array 
 */
function getSubTree($data , $parent , $son , $pid = 0) {
    $tmp = array();
    foreach ($data as $key => $value) {
        if($value[$parent] == $pid) {
            $value['child'] =  getSubTree($data , $parent , $son , $value[$son]);
            $tmp[] = $value;            
        }
    }
    return $tmp;
}
登入後複製
如此分類後,資料結構發生變化,大致如下:

PHP:打造一個無限極評論模組

分類後資料

有這個結構就能很好去完成評論了,如下

<?php foreach($tree as $key=>$val) ?>
<p class="comm_list" >
    <h2><?php echo $val[&#39;user_name&#39;];?></h2>
    <p><?php echo $val[&#39;comm_cont&#39;] ?></p>
    <!-- 其他信息 -->
    <p class="comm_reply">
        <?php if(!empty($val[&#39;child&#39;])) { ?>
        <?php foreach($val[&#39;child&#39;] as $k=>$v) ?>
        <p class="reply_list" >
            <h2><?php echo $v[&#39;user_name&#39;];?></h2>
            <p><?php echo $v[&#39;comm_cont&#39;] ?></p>
            <!-- 其他信息 -->
        </p>
        <?php }}?>
    </p>
</p>
<?php } ?>
登入後複製
同時,形成的回應樣式如下所示:

PHP:打造一個無限極評論模組

snipaste20170105_204906.png

這樣類別評論結構的無限極回應就完成了。

PS

這只是評論的一種形式,如還有一種類別樓梯式的結構,這種實作則更為簡單一點,如下圖:

PHP:打造一個無限極評論模組

樓梯式評論結構

這個結構就很容易完成,只要儲存資料庫中的parent_id完全等於你回覆的comm_id,經過如下無限極分類,就能夠完成。

/**
 * 子孙树
 */
function getSubTree($data , $parent , $son , $pid = 0, $lev = 0) {
    $tmp = array();
    foreach ($data as $key => $value) {
        if($value[$parent] == $pid) {
            $value['lev'] = $lev;
            $tmp[] = $value;
            $tmp = array_merge($tmp , getSonTree($data , $parent , $son , $value[$son] , $lev+1));
        }
    }
    return $tmp;
}
登入後複製
這種無限極子孫樹分類和前面給出的子孫樹分類不同,分類後不會將子類包裹在child中,而是形成等級,最高級為0,依次往下。

例如:一級評論的comm_id=1,parent_id=0,那麼二級評論的comm_id=2,parent_id=1;三級評論的comm_id=3,parent_id=2;

#分類最後形成如下結構

array(
array('comm_id'=>1,parent_id=>0,art_id=>1,'lev'=>0) ,
array('comm_id'=>2,parent_id=>1,art_id=>1,'lev'=>1),
array('comm_id'=>3,parent_id=>2,art_id=>1,'lev'=>2),
array('comm_id'=>4,parent_id=>3,art_id=>1,'lev'=>3),
array('comm_id'=>5,parent_id=>2,art_id=>1,'lev'=>2)
);
登入後複製

然后直接循环输出,并将lev作为属性打印在html中,最后利用js读取lev,并根据不同的等级分配不同的margin-left即可,它会随着margin的不同而排列在不同的位置,如下:

// html中
<?php foreach($tree as $key=>$val) {?>
<p class="comm_list" lev="<?php echo $val[&#39;lev&#39;]?>">
……
</p>
<?php } ?>

// js中
$('p.comm_list').css('margin-left' , 20 * lev);
登入後複製


以上是PHP:打造一個無限極評論模組的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!