コメント投稿時間
|
|
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 に配置することも非常に簡単です。しかし、この構造は非常に乱雑で無秩序です。コメントモジュールをコメントのように完成させたい場合は、特別な方法を使用する必要があります。
次に、コメントの構造を詳しく見る必要があります。
コメント構造
上記のデータテーブル構造と組み合わせると、データテーブルから取り出して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数据:
JSON数据
上传后有点模糊,各位同学可以借助火狐或者谷歌浏览器上面的插件观察JSON数据。
重点观察compiled_content
字段,可以推断它是将@某某某
データから答えが得られました。コメントの json データを参照してください:
JSON データアップロード後は少しぼやけています。Firefox または Google Chrome のプラグインを使用して JSON データを観察できます。
compiled_content
フィールドに注目すると、@XXXX
がデータベースに直接保存されていることが推測できます。このようにして、問題は解決されます。同時に、json データを観察することで、上で述べた構造が正しいことも確認できます。 具体的な実装 構造を分析した後、Infinitus の返信を完了する方法について話しましょう。最初のステップは、第 1 レベルのコメントを作成することです。これは簡単です。コメントを直接保存して、返信を投稿するときに必ずコメントの内容と組み合わせてバックグラウンドに送信します。
第 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);
ログイン後にコピー
次に、データベース内のパフォーマンスは次のとおりです。
データ テーブルの内容
次に、分類に子孫ツリーを使用するという重要なポイントがあります。関数 は次のとおりです: /**
* @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 foreach($tree as $key=>$val) ?>
<p class="comm_list" >
<h2><?php echo $val['user_name'];?></h2>
<p><?php echo $val['comm_cont'] ?></p>
<!-- 其他信息 -->
<p class="comm_reply">
<?php if(!empty($val['child'])) { ?>
<?php foreach($val['child'] as $k=>$v) ?>
<p class="reply_list" >
<h2><?php echo $v['user_name'];?></h2>
<p><?php echo $v['comm_cont'] ?></p>
<!-- 其他信息 -->
</p>
<?php }}?>
</p>
</p>
<?php } ?>
ログイン後にコピー
。 同時に、返信スタイルは次のとおりです:
snipaste20170105_204906.png
同様のコメント構造を持つ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['lev']?>">
……
</p>
<?php } ?>
// js中
$('p.comm_list').css('margin-left' , 20 * lev);
ログイン後にコピー