Heim >Backend-Entwicklung >PHP-Tutorial >PHP: Erstellen Sie ein Infinitus-Kommentarmodul

PHP: Erstellen Sie ein Infinitus-Kommentarmodul

PHPz
PHPzOriginal
2017-04-04 15:18:594223Durchsuche

Das Kommentarmodul meiner Abschlussarbeit wurde ursprünglich mit dem Duoshuo-Plug-in fertiggestellt, aber jetzt hoffe ich, den Kommentarinhalt selbst verwalten zu können, also habe ich angefangen, das Kommentarmodul selbst zu schreiben. Die spezifische Vorbereitung besteht darin, eine ähnliche Struktur wie der nächste Kommentar anzunehmen, d. h. die Kommentare der ersten Ebene werden direkt unter dem Artikel angezeigt, während die Kommentare der zweiten und dritten Ebene unter den Kommentaren der ersten Ebene angezeigt werden, wie in gezeigt die folgende Abbildung:

PHP: Erstellen Sie ein Infinitus-Kommentarmodul

Kommentarstruktur

Ich denke, dass dies eine Anwendung mit unendlicher Klassifizierung ist die Anwendung des Nachkommenbaums, Schleife Geben Sie den Inhalt aus und bilden Sie einen Kommentar (Freunde, die die Infinitus-Klassifizierung nicht verstehen, können meinen Artikel „Prinzipien und Implementierung der Infinitus-Klassifizierung“ lesen).

Natürlich gibt es noch weitere wichtige Punkte, um die Funktion von Infinitus, auf Kommentare zu antworten, wirklich zu vervollständigen.

Datenbankdesign

Zuallererst ist es das Design der Datentabelle. Wenn es sich um ein Forensystem handelt, können die Kommentardaten in zwei Tabellen unterteilt werden. Eine Tabelle speichert die Kommentarinformationen, einschließlich der Benutzer-ID des Beitrags oder der Benutzer-ID der Antwort, des Beitrags ID der Antwort, Zeitpunkt der Antwort usw.; eine weitere Tabelle speichert den Inhalt von Kommentaren, einschließlich des Themas des Beitrags und des Inhalts der Antwort.

Was ich fertiggestellt habe, ist das Kommentarmodul des Artikels. Es ist nicht in zwei Tabellen unterteilt. Ich habe den Inhalt und die Informationen des Kommentars wie folgt zusammengestellt:

UNSIGNED NOT NULL DEFAULT 0Kommentarinhalt
Spaltenname Spaltentyp SpalteAttribut
列名 列类型 属性 说明
comm_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT 主键
user_id INT UNSIGNED NOT NULL DEFAULT 0 用户id
parent_id INT UNSIGNED NOT NULL DEFAULT 0 评论的父级
artcile_id INT UNSIGNED NOT NULL DEFAULT 0 评论的文章id
comm_cont TEXT
评论的内容
comm_time INT UNSIGNED NOT NULL DEFAULT 0 评论发布的时间
Beschreibung
comm_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT Primärschlüssel
user_id INT UNSIGNED NOT NULL DEFAULT 0 userid
parent_id INTÜbergeordnetes Element des Kommentars
artcile_id INT UNSIGNED NOT NULL STANDARD 0 Kommentierte Artikel-ID
comm_cont TEXT
comm_Zeit INT UNSIGNED NOT NULL DEFAULT 0 Der Zeitpunkt, zu dem der Kommentar gepostet wurde

SQL-Anweisung:

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 ;

Diese Struktur ist die Grundlage für die Vervollständigung der Infinitus-Antwort. Es ist auch deutlich zu erkennen, dass die abgerufenen Daten von Infinitus gut klassifiziert werden können.

Strukturanalyse von Kommentaren

Es ist sehr einfach, einen Kommentar in die Datenbank einzufügen, ihn dann abzurufen und in HTML zu platzieren. Allerdings ist diese Struktur sehr chaotisch und ungeordnet. Wenn Sie ein Kommentarmodul wie einen Kommentar vervollständigen möchten, müssen Sie eine spezielle Methode verwenden.

Dann müssen wir uns die Struktur der Kommentare genauer ansehen.

PHP: Erstellen Sie ein Infinitus-Kommentarmodul

Kommentarstruktur

In Kombination mit der obigen Datentabellenstruktur kann gefolgert werden, dass die Daten aus der Datentabelle entnommen und nach klassifiziert werden Infinitus, seine Struktur sollte so sein:

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

Warum sagen Sie das? Sie können deutlich erkennen, dass die Kommentare der zweiten und dritten Ebene in die Kommentare der ersten Ebene eingeschlossen sind und die Kommentare der zweiten und dritten Ebene parallele Beziehungen sind. Daher sind die Kommentare der zweiten und dritten Ebene die Nachkommenknoten von Die Kommentare der ersten Ebene sowie die Kommentare der zweiten und dritten Ebene sind parallele Knoten, und es besteht keine Eltern-Kind-Beziehung.

Daraus kann geschlossen werden, dass die klassifizierten Daten nur einen Nachkommenknoten haben. Unabhängig davon, ob ein mehrstufiger Kommentar eine Antwort auf einen Kommentar der ersten Ebene ist oder nicht, solange er innerhalb des Gültigkeitsbereichs liegt eines Kommentars der ersten Ebene, dann dessen übergeordneter Knoten. Es muss sich um eine Rezension der ersten Ebene handeln.

Wie wird also das @某某某 in den Antworten der zweiten und dritten Ebene implementiert? Eigentlich hatte ich hier schon lange Probleme. Ich hatte erwartet, zur Vervollständigung einen Self-Join mit der Tabelle zu verwenden, aber das funktioniert nicht und zerstört die oben beschriebene Struktur. Schließlich habe ich die Antwort aus den angeforderten json-Daten erhalten, siehe bitte die kommentierten JSON-Daten:

PHP: Erstellen Sie ein Infinitus-Kommentarmodul

JSON-Daten

ist nach dem Hochladen etwas verschwommen . Schüler können das Plug-in in Firefox oder Google Chrome verwenden, um die JSON-Daten zu beobachten.

Konzentrieren Sie sich auf das Feld compiled_content und Sie können daraus schließen, dass es @某某某 direkt in der Datenbank speichert. Auf diese Weise wird das Problem gelöst. Durch Beobachtung der JSON-Daten kann auch überprüft werden, ob die oben erwähnte Struktur korrekt ist.

Spezifische Implementierung

Nachdem wir die Struktur analysiert haben, sprechen wir darüber, wie die Infinitus-Antwort vervollständigt wird. Der erste Schritt besteht darin, einen Kommentar der ersten Ebene zu erstellen. Dies ist einfach: Speichern Sie den Kommentar direkt Wenn Sie mit js auf einen Kommentar klicken, rufen Sie den Benutzernamen des Kommentars der ersten Ebene ab und speichern Sie ihn. Achten Sie beim Posten einer Antwort darauf, ihn mit dem Inhalt des Kommentars zu kombinieren der Hintergrund:

PHP: Erstellen Sie ein Infinitus-Kommentarmodul

Kommentare der Stufe 2

Dann ist die Leistung in der Datenbank wie folgt:

PHP: Erstellen Sie ein Infinitus-Kommentarmodul

Inhalt der Datentabelle
// 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);

Der nächste Schritt ist ein wichtiger Punkt. Die Klassifizierungsfunktion

lautet wie folgt:

PHP: Erstellen Sie ein Infinitus-Kommentarmodul
Nach einer solchen Klassifizierung ändert sich die Datenstruktur ungefähr wie folgt:

Klassifizierte Daten

/**
 * @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;
}
Mit dieser Struktur Sie können Kommentare ganz einfach wie folgt vervollständigen

Gleichzeitig wird der Antwortstil wie unten gezeigt gebildet: PHP: Erstellen Sie ein Infinitus-Kommentarmodul

snipaste20170105_204906 .png

<?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 } ?>
Auf diese Weise wird die Infinitus-Antwort mit einer ähnlichen Kommentarstruktur vervollständigt.

PSPHP: Erstellen Sie ein Infinitus-Kommentarmodul

Dies ist nur eine Form des Kommentars. Wenn eine treppenartige Struktur vorliegt, ist diese Implementierung einfacher, wie unten gezeigt:

Treppenhaus-Kommentarstruktur

Diese Struktur ist einfach zu vervollständigen, solange die parent_id in der Speicherdatenbank vollständig mit der comm_id übereinstimmt, auf die Sie geantwortet haben Der Prozess der Infinitus-Klassifizierung kann abgeschlossen werden.

Diese Art der unendlichen Nachkommenbaumklassifizierung unterscheidet sich von der zuvor angegebenen Nachkommenbaumklassifizierung. Nach der Klassifizierung werden die Unterklassen nicht in untergeordnete Klassen eingebunden, sondern bilden eine Hierarchie. Die höchste Ebene ist 0. und sie werden nach unten gehen. PHP: Erstellen Sie ein Infinitus-Kommentarmodul
Zum Beispiel: Wenn der Kommentar der ersten Ebene „comm_id=1“ und „parent_id=0“ hat, dann hat der Kommentar der zweiten Ebene „comm_id=2“, „parent_id=1“, wenn der Kommentar der dritten Ebene „comm_id=3“ hat. parent_id=2;

Die Klassifizierung bildet schließlich die folgende Struktur

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);


Das obige ist der detaillierte Inhalt vonPHP: Erstellen Sie ein Infinitus-Kommentarmodul. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn