Heim >Backend-Entwicklung >PHP-Tutorial >PHP: Erstellen Sie ein Infinitus-Kommentarmodul
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:
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.
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:
Spaltenname | Spaltentyp | SpalteAttribut
|
Beschreibung | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
comm_id | INT | UNSIGNED PRIMARY KEY AUTO_INCREMENT | Primärschlüssel | ||||||||||||||||||||||||||||
user_id | INT | UNSIGNED NOT NULL DEFAULT 0 | userid | ||||||||||||||||||||||||||||
parent_id | INT | UNSIGNED NOT NULL DEFAULT 0Übergeordnetes Element des Kommentars | |||||||||||||||||||||||||||||
artcile_id | INT | UNSIGNED NOT NULL STANDARD 0 | Kommentierte Artikel-ID | ||||||||||||||||||||||||||||
comm_cont | TEXT | Kommentarinhalt | |||||||||||||||||||||||||||||
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.
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.
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:
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.
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:
// 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:
Nach einer solchen Klassifizierung ändert sich die Datenstruktur ungefähr wie folgt:
/** * @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:
snipaste20170105_204906 .png
<?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 } ?>Auf diese Weise wird die Infinitus-Antwort mit einer ähnlichen Kommentarstruktur vervollständigt.
PS
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.
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;
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);
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!