ホームページ  >  記事  >  バックエンド開発  >  PHP: Infinitus コメント モジュールを作成する

PHP: Infinitus コメント モジュールを作成する

PHPz
PHPzオリジナル
2017-04-04 15:18:594171ブラウズ

卒業制作のコメントモジュールは当初Duoshuoプラグインを使って完成させていましたが、コメント内容を自分で管理できるようになりたいと思い、コメントモジュールを自分で書き始めました。具体的な計画としては、次のコメントも同様の構造を採用することです。つまり、図に示すように、第 1 レベルのコメントは記事の直下に表示され、第 2 レベルと第 3 レベルのコメントは第 1 レベルのコメントの下に表示されます。以下の図:

PHP: Infinitus コメント モジュールを作成する

コメント構造

これは、Infinitus 分類の応用と言えると思います。正確には、子孫を分類した後、ループを出力します。コメントを作成します (Infinitus 分類を理解していない友人は、私の記事「Infinitus 分類の原理と実装」を読むことができます)。

もちろん、Infinitus のコメントに返信する機能を完全に完了するには、他にも重要なポイントがあります。私が Infinitus のコメントを完成させた方法について話しましょう。

データベース設計

まずはデータテーブルの設計です。フォーラム システムの場合、コメント データは 2 つのテーブルに分割でき、1 つのテーブルには、投稿のユーザー ID または返信のユーザー ID返信の投稿 ID返信時刻など ; 投稿の件名や返信の内容など、コメントの内容を保存する別のテーブル。

私が完成したのは、記事のコメントモジュールです。次のように、コメントの内容と情報を直接結合します。列

属性説明INTUNSIGNED PRIMARY KEY AUTO_INCREMENT主キーuser_id 署名なし デフォルト 0useridparent_idUNSIGNED NOT NULL DEFAULT 0コメントされた親artcile_idINTUNSIGNED NOT NULL DEFAULT 0コメントされた記事ID com m_contTEXTコメントの内容timeINTUNSIGNED 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 ;

この構造は、Infinitus 応答を完成させるための基礎です。また、取得されたデータが Infinitus によって適切に分類できることも明確にわかります。

コメントの構造分析

コメントをデータベースに入力し、それを取得して HTML に配置することも非常に簡単です。しかし、この構造は非常に乱雑で無秩序です。コメントモジュールをコメントのように完成させたい場合は、特別な方法を使用する必要があります。

次に、コメントの構造を詳しく見る必要があります。

PHP: Infinitus コメント モジュールを作成する

コメント構造

上記のデータテーブル構造と組み合わせると、データテーブルから取り出してInfinitusによって分類されたデータの構造は次のようになると推測できます:

array (
    array(一级评论,
        child=>array(
            二级评论,
            三级评论
            )
        ),
    array (
        一级评论 ,
        child=>array(
            )
    ……

なぜそう言えるのか?第 2 レベルと第 3 レベルのコメントが第 1 レベルのコメントにラップされており、第 2 レベルと第 3 レベルのコメントは並列関係であることが明確にわかります。したがって、第 2 レベルと第 3 レベルのコメントは、第 1 レベルのコメント、第 2 レベルと第 3 レベルのコメントは並列ノードであり、親子関係はありません。

したがって、複数レベルのコメントが第 1 レベルのコメントに対する返信であるかどうかに関係なく、それが第 1 レベルのコメントの範囲内にある限り、機密データには 1 つの子孫ノードしか存在しないと結論付けることができます。レベルのコメントの場合、その親ノードは第 1 レベルのコメントである必要があります。

では、第 2 レベルと第 3 レベルの返信の @XXXX はどのように実装されているのでしょうか?実はここで長い間悩んでいたのです。テーブルへの自己結合を使用して完了することを期待していましたが、これは機能せず、上記の構造が破壊されます。最後に、リクエストされた json@某某某又是怎么实现的?其实,我在这里困扰了很长时间。我期望用对表的自身连接来完成,但是不行,破坏了上面所述的结构。最后,我从请求的json数据中得到了答案,请看评论的json数据:

PHP: Infinitus コメント モジュールを作成する

JSON数据

上传后有点模糊,各位同学可以借助火狐或者谷歌浏览器上面的插件观察JSON数据。

重点观察compiled_content字段,可以推断它是将@某某某 データから答えが得られました。コメントの json データを参照してください:

PHP: Infinitus コメント モジュールを作成する

JSON データ

PHP: Infinitus コメント モジュールを作成するアップロード後は少しぼやけています。Firefox または Google Chrome のプラグインを使用して JSON データを観察できます。

compiled_content フィールドに注目すると、@XXXX がデータベースに直接保存されていることが推測できます。このようにして、問題は解決されます。同時に、json データを観察することで、上で述べた構造が正しいことも確認できます。

具体的な実装

構造を分析した後、Infinitus の返信を完了する方法について話しましょう。最初のステップは、第 1 レベルのコメントを作成することです。これは簡単です。コメントを直接保存して、返信を投稿するときに必ずコメントの内容と組み合わせてバックグラウンドに送信します。

PHP: Infinitus コメント モジュールを作成する

第 2 レベルのコメント

// 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: Infinitus コメント モジュールを作成する

データ テーブルの内容

次に、分類に子孫ツリーを使用するという重要なポイントがあります。関数

は次のとおりです:

/**
 * @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: Infinitus コメント モジュールを作成する
分類後のデータ

は次のようにコメントを完成させるのは簡単です

<?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: Infinitus コメント モジュールを作成する
snipaste20170105_204906.png

同様のコメント構造を持つInfinitus返信が完成します。

追記

これは単なるコメントの形式です。階段状の構造がある場合、この実装は以下に示すように簡単になります。

PHP: Infinitus コメント モジュールを作成する
階段コメント構造

この構造は、ストレージ データベースのparent_idが、返信したcomm_idと完全に一致している限り、次のInfinitus分類後に完了できます。

/**
 * 子孙树
 */
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;
}

この種の無限子孫ツリー分類は、前に示した子孫ツリー分類とは異なります。分類後、サブクラスは子にラップされず、最上位のレベルが 0 から順に下位の階層を形成します。 。

例: 第 1 レベルのコメントは comm_id=1、parent_id=0、次に第 2 レベルのコメントは comm_id=2、parent_id=1、第 3 レベルのコメントは 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);


comm_id
INT NULL
INT
comm_
コメント投稿時間

以上がPHP: Infinitus コメント モジュールを作成するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。