>백엔드 개발 >PHP 튜토리얼 >PHP: Infinitus 주석 모듈 만들기

PHP: Infinitus 주석 모듈 만들기

PHPz
PHPz원래의
2017-04-04 15:18:594224검색

졸업 프로젝트의 댓글 모듈은 원래 Duoshuo 플러그인을 사용하여 완성했는데 이제는 댓글 내용을 직접 관리할 수 있기를 바라서 댓글 모듈을 직접 작성하기 시작했습니다. 구체적인 준비는 다음 댓글과 유사한 구조를 채택하는 것입니다. 즉, 1단계 댓글은 기사 바로 아래에 표시되고, 2단계 및 3단계 댓글은 1단계 댓글 아래에 표시됩니다. 다음 그림은

PHP: Infinitus 주석 모듈 만들기

댓글구조

정확하게는 무한분류의 적용이라고 할 수 있겠네요. 후손 트리 적용. 후손 트리를 분류한 후 loop 내용을 출력하고 댓글을 작성합니다. (인피니투스 분류를 이해하지 못하는 친구는 내 기사 인피니투스 분류의 원리 및 구현을 참조하세요.)

물론 인피니투스의 댓글 답글 기능을 제대로 완성하기 위한 핵심 포인트는 또 있습니다.

데이터베이스 디자인

우선 데이터 테이블의 디자인이다. 포럼 시스템이라면 댓글 데이터를 두 개의 테이블로 나눌 수 있습니다. 하나의 테이블에는 게시물의 사용자 ID 또는 댓글의 사용자 ID, 포스트의 댓글 정보가 저장됩니다. 답글 ID, 답글 시간 등 다른 테이블에는 게시물 주제와 답글 내용을 포함한 댓글 내용이 저장됩니다.

제가 완성한 것은 기사의 댓글 모듈입니다. 두 개의 테이블로 나누어지지 않고, 댓글의 내용과 정보를 다음과 같이 직접 정리했습니다.

열 이름 열 유형 열속성 설명 comm_id INT 서명되지 않은 기본 KEY
列名 列类型 属性 说明
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 评论发布的时间
AUTO_INCREMENT 기본 키 user_id INT 서명되지 않음 NULL DEFAULT 0 사용자 ID parent_id INT UNSIGNED NOT NULL 기본값 0 댓글의 상위 artcile_id INT UNSIGNED NOT NULL 기본값 0 댓글이 달린 기사 ID comm_cont TEXT 댓글 내용 comm_시간 INT 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 ;

이 구조는 Infinitus 응답을 완성하는 기초가 되며 검색된 데이터가 Infinitus에 의해 잘 분류될 수 있음을 명확하게 알 수 있습니다.

댓글 구조 분석

댓글 모듈을 완성하는 것은 매우 쉽습니다. 댓글을 데이터베이스에 넣은 다음 이를 검색하여 HTML에 배치할 수도 있습니다. 그러나 이 구조는 매우 지저분하고 무질서하다. 댓글과 같은 댓글 모듈을 완성하려면 특별한 방법을 사용해야 합니다.

그럼 댓글 구조를 좀 더 자세히 살펴보겠습니다.

PHP: Infinitus 주석 모듈 만들기

댓글 구조

위의 데이터 테이블 구조와 합쳐보면, 데이터 테이블에서 데이터를 꺼내어 다음과 같이 분류한 것으로 유추할 수 있다. 인피니투스, 구조는 이렇습니다:

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

왜 그런 말을 하는 걸까요? 두 번째 및 세 번째 수준 주석이 첫 번째 수준 주석에 포함되어 있고 두 번째 및 세 번째 수준 주석이 병렬 관계이므로 두 번째 및 세 번째 수준 주석은 하위 노드임을 분명히 알 수 있습니다. 1차 댓글, 2차 댓글과 3차 댓글은 병렬 노드로 상위-하위 관계가 없습니다.

따라서 분류된 데이터는 범위 내에 있는 한, 다단계 댓글이 1단계 댓글에 대한 답변인지 아닌지에 대한 하위 노드가 하나만 있다고 결론을 내릴 수 있습니다. 첫 번째 수준 주석의 상위 노드는 첫 번째 수준 주석이어야 합니다.

그럼 2차, 3차 답글의 @某某某은 어떻게 구현되나요? 사실 저는 여기서 오랫동안 고민을 했어요. 테이블에 자체 조인을 사용하여 완료할 것으로 예상했지만 이것이 작동하지 않아 위에서 설명한 구조가 손상되었습니다. 마지막으로 요청한 json 데이터에서 답변을 얻었습니다. 주석이 달린 json 데이터를 참조하세요:

PHP: Infinitus 주석 모듈 만들기

JSON 데이터

을 업로드한 후 약간 흐려집니다. 학생들은 Firefox 또는 Google Chrome에서 플러그인을 사용하여 JSON 데이터를 관찰할 수 있습니다.

compiled_content 필드에 초점을 맞추면 @某某某이 데이터베이스에 직접 저장된다는 것을 추론할 수 있습니다. 이런 식으로 문제는 해결됨과 동시에 json 데이터를 관찰하면 위에서 언급한 구조가 올바른지 확인할 수도 있습니다.

구체적인 구현

구조를 분석한 후 인피니투스 응답을 완성하는 방법에 대해 이야기해보겠습니다. 첫 번째 단계는 1차 댓글을 작성하는 것입니다.

PHP: Infinitus 주석 모듈 만들기

1차 댓글

을 직접 저장하면 됩니다. js를 사용하면 댓글을 클릭하면 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

이렇게 하면 비슷한 댓글 구조의 인피니투스 답글이 완성됩니다.

PS

계단형 구조가 있는 경우 다음과 같이 구현이 더 간단합니다.

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인 계층 구조를 형성합니다. 차례대로 내려갑니다.

예: 첫 번째 수준 댓글의 경우 comm_id=1, parent_id=0, 두 번째 수준 댓글의 경우 comm_id=2, parent_id=1, 세 번째 수준 댓글의 경우 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: Infinitus 주석 모듈 만들기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.