目次
php无限级分类实战——评论及回复功能
ホームページ php教程 php手册 php无限级分类实战评论及回复功能

php无限级分类实战评论及回复功能

Jun 13, 2016 am 09:04 AM
関数 実戦

php无限级分类实战——评论及回复功能

经常在各大论坛或新闻板块详情页面下边看到评论功能,当然不单单是直接发表评论内容那么简单,可以对别人的评论进行回复,别人又可以对你的回复再次评论或回复,如此反复,理论上可以说是没有休止,从技术角度分析很容易想到运用无限级分类技术存储数据,运用递归获取评论层级结构数据,运用ajax实现评论页面交互,这里用thinkphp框架做个简单的demo练练手,为了简化流程这里第三级评论不再提供回复功能,当然只要在这个基础上稍作修改就可以实现无限回复功能,主要是view层样式修改较麻烦,需花些时间。

一、效果需求分析:

在头部可以直接发布一级评论,最新发表的评论显示在最上面,如下效果图

对发表的评论可以回复,回复显示在上级评论下边,形成层级关系,如下效果图

页面操作细节:点击某个评论的回复按钮时,显示回复文本输入框,同时其他评论的回复文本输入框消失,当再次点击该回复按钮时,该文本框消失

在最后一级评论(这里设置是第三级)关闭回复功能

即时显示评论总数

二、实现思路及细节

1.数据表设计

2.controller层关键函数:

(1). 递归获取评论列表

<code class="hljs" php="">/**
*递归获取评论列表
   */
   protected function getCommlist($parent_id = 0,&$result = array()){       
    $arr = M(&#39;comment&#39;)->where(parent_id = &#39;.$parent_id.&#39;)->order(create_time desc)->select();   
    if(empty($arr)){
        return array();
    }
    foreach ($arr as $cm) {  
        $thisArr=&$result[];
        $cm[children] = $this->getCommlist($cm[id],$thisArr);    
        $thisArr = $cm;                                    
    }
    return $result;
   }</code>
ログイン後にコピー

(2). 展示评论页面的action

<code class="hljs" lasso="">public function index(){  
    $num =  M(&#39;comment&#39;)->count(); //获取评论总数
    $this->assign(&#39;num&#39;,$num);
      $data=array();
    $data=$this->getCommlist();//获取评论列表
    $this->assign(commlist,$data);
      $this->display(&#39;index&#39;);
  }</code>
ログイン後にコピー

(3).评论页面ajax访问添加评论的action

<code class="hljs" php="">/**
*添加评论
   */
   public function addComment(){            
    $data=array();
    if((isset($_POST[comment]))&&(!empty($_POST[comment]))){
        $cm = json_decode($_POST[comment],true);//通过第二个参数true,将json字符串转化为键值对数组
        $cm[&#39;create_time&#39;]=date(&#39;Y-m-d H:i:s&#39;,time());
        $newcm = M(&#39;comment&#39;);
        $id = $newcm->add($cm);

        $cm[id] = $id;
        $data = $cm;

        $num =  M(&#39;comment&#39;)->count();//统计评论总数
        $data[&#39;num&#39;]= $num;

    }else{
        $data[error] = 0;
    }


    echo json_encode($data);
   }</code>
ログイン後にコピー

3.view层实现

(1). 展示页面的整体结构设计


实际效果:

页面html代码:

<code class="hljs" xml="">
</code>
ログイン後にコピー

<!--发表评论区begin-->

<span>{$num}条评论</span>

<textarea class="txt-commit" replyid="0"></textarea>

<span >发表评论</span>

<!--发表评论区end--><!--评论列表显示区begin--><!-- {$commentlist} -->

<span>全部评论</span>

<!--一级评论列表begin-->

    • <span>{$data.nickname}</span> <span>{$data.create_time}</span>

      {$data.content}

      <!--二级评论begin-->
        • <span>{$child.nickname}</span> <span>{$child.create_time}</span>

          {$child.content}

          <!--三级评论begin-->
            • <span>{$grandson.nickname}</span> <span>{$grandson.create_time}</span>

              {$grandson.content}

          <!--三级评论end-->
      <!--二级评论end-->
<!--一级评论列表end-->

<!--评论列表显示区end-->

(2). 单个评论信息div结构代码

ログイン後にコピー

<span>{$data.nickname}</span> <span>{$data.create_time}</span>

{$data.content}

对应的效果图:

对应的css代码:

<code class="hljs" css="">.head-pic{
    width:40px;
    height:40px;    
}

.cm{
    position:relative;
    top:0px;
    left:40px;
    top:-40px;
    width:600px;
}

.cm-header{
    padding-left:5px;
}

.cm-content{
    padding-left:5px;
}

.cm-footer{
    padding-bottom:15px;
    text-align:right;
    border-bottom: 1px dotted #CCC;
}

.comment-reply{
    text-decoration:none;
    color:gray;
    font-size: 14px;
}</code>
ログイン後にコピー

4. JS代码

(1). 提交评论:提交评论的a标签按钮引用了样式comment-submit,在其点击事件中进行ajax操作

<code class="hljs" xml="">$(&#39;body&#39;).delegate(&#39;.comment-submit&#39;,&#39;click&#39;,function(){   
        var content = $.trim($(this).parent().prev().children(textarea).val());//根据布局结构获取当前评论内容
        $(this).parent().prev().children(textarea).val();//获取完内容后清空输入框
        if(==content){
            alert(评论内容不能为空!);     
        }else{
            var cmdata = new Object();
            cmdata.parent_id = $(this).attr(parent_id);//上级评论id
            cmdata.content = content;
            cmdata.nickname = 游客;//测试用数据
            cmdata.head_pic = /Public/images/default.jpg;//测试用数据              
            var replyswitch = $(this).attr(replyswitch);//获取回复开关锁属性
            $.ajax({
                type:POST,
                url:/index.php/home/index/addComment,
                data:{
                    comment:JSON.stringify(cmdata)              
                },
                dataType:json,            
                success:function(data){
                    if(typeof(data.error)==undefined){
                        $(.comment-reply).next().remove();//删除已存在的所有回复div    
                        //更新评论总数                        
                        $(.comment-num).children(span).html(data.num+条评论);
                        //显示新增评论
                        var newli = ;                     
                        if(cmdata.parent_id == 0){
                         //发表的是一级评论时,添加到一级ul列表中                      
                         newli = </code>
ログイン後にコピー
  • <span>+data.nickname+</span><span>+data.create_time+</span>

    +data.content+

  • ; $(.comment-ul).prepend(newli); }else{ //否则添加到对应的孩子ul列表中 if(&#39;off&#39;==replyswitch){//检验出回复关闭锁存在,即三级评论不再提供回复功能 newli =
    • <span>+data.nickname+</span><span>+data.create_time+</span>

      +data.content+

    • ; }else{//二级评论的回复按钮要添加回复关闭锁属性 newli =
      • <span>+data.nickname+</span><span>+data.create_time+</span>

        +data.content+

      • ; } $(li[comment_id=&#39;+data.parent_id+&#39;]).children(ul).prepend(newli); } }else{ //有错误信息 alert(data.error); } } }); } });

        (2).回复评论:回复评论的a标签按钮引用了样式comment-reply,在其点击事件中进行显示或隐藏评论输入框的操作

        <code class="hljs" scilab="">//点击回复按钮显示或隐藏回复输入框
            $(body).delegate(.comment-reply,click,function(){
                if($(this).next().length>0){//判断出回复div已经存在,去除掉
                    $(this).next().remove();
                 }else{//添加回复div
                    $(.comment-reply).next().remove();//删除已存在的所有回复div    
                    //添加当前回复div
                    var parent_id = $(this).attr(comment_id);//要回复的评论id
        
                    var divhtml = ;
                    if(&#39;off&#39;==$(this).attr(replyswitch)){//二级评论回复后三级评论不再提供回复功能,将关闭属性附加到提交回复按钮
                        divhtml = </code>
        ログイン後にコピー

        <textarea class="txt-reply" replyid="2" style="width: 100%; height: 60px;"></textarea>

        提交回复

        ; }else{ divhtml =

        <textarea class="txt-reply" replyid="2" style="width: 100%; height: 60px;"></textarea>

        提交回复

        ; } $(this).after(divhtml); } });

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Doubaoアプリにはどのような機能がありますか? Doubaoアプリにはどのような機能がありますか? Mar 01, 2024 pm 10:04 PM

DoubaoアプリにはAI作成機能がたくさんあると思いますが、Doubaoアプリにはどのような機能があるのでしょうか?ユーザーはこのソフトウェアを使用して、絵画を作成したり、AI とチャットしたり、ユーザー向けの記事を生成したり、全員が曲を検索できるようにしたりすることができます。今回のDoubaoアプリの機能紹介では、具体的な操作方法をお伝えすることができますので、具体的な内容は以下の通りですので、ぜひご覧ください! Doubao アプリにはどのような機能がありますか? 回答: 絵を描いたり、チャットしたり、記事を書いたり、曲を検索したりできます。機能紹介: 1. 質問クエリ: AI を使用して質問に対する回答をより迅速に見つけることができ、あらゆる種類の質問をすることができます。 2. 画像生成: AI を使用して、一般的な要件を全員に伝えるだけで、全員に異なる画像を作成できます。 3. AIチャット:ユーザーのためにチャットできるAIを作成できます。

vivox100sとx100の違い:性能比較と機能分析 vivox100sとx100の違い:性能比較と機能分析 Mar 23, 2024 pm 10:27 PM

vivox100s と x100 携帯電話はどちらも vivo の携帯電話製品ラインの代表的なモデルであり、それぞれ異なる時代における vivo のハイエンド技術レベルを代表するものであるため、2 つの携帯電話にはデザイン、性能、機能に一定の違いがあります。この記事では、消費者が自分に合った携帯電話をより適切に選択できるように、これら 2 つの携帯電話を性能比較と機能分析の観点から詳しく比較します。まずはvivox100sとx100の性能比較を見てみましょう。 vivox100s には最新の機能が搭載されています。

セルフメディアとは一体何でしょうか?その主な特徴と機能は何ですか? セルフメディアとは一体何でしょうか?その主な特徴と機能は何ですか? Mar 21, 2024 pm 08:21 PM

インターネットの急速な発展に伴い、セルフメディアという概念が人々の心に深く根付いてきました。では、セルフメディアとは一体何でしょうか?その主な特徴と機能は何ですか?次に、これらの問題を 1 つずつ検討していきます。 1. セルフメディアとは何ですか? We-media は、その名前が示すように、あなたがメディアであることを意味します。これは、個人またはチームがインターネット プラットフォームを通じてコン​​テンツを独自に作成、編集、公開、配布できる情報媒体を指します。新聞、テレビ、ラジオなどの従来のメディアとは異なり、セルフメディアはよりインタラクティブでパーソナライズされており、誰もが情報の制作者および発信者になることができます。 2. セルフメディアの主な特徴と機能は何ですか? 1. 敷居が低い: セルフメディアの台頭により、メディア業界への参入の敷居が低くなり、煩わしい機材や専門チームは必要なくなりました。

小紅書アカウント管理ソフトウェアの機能は何ですか?小紅書アカウントを操作するにはどうすればよいですか? 小紅書アカウント管理ソフトウェアの機能は何ですか?小紅書アカウントを操作するにはどうすればよいですか? Mar 21, 2024 pm 04:16 PM

小紅書が若者の間で人気になるにつれ、ますます多くの人がこのプラットフォームを使用して、自分の経験や人生の洞察のさまざまな側面を共有し始めています。複数の小紅書アカウントを効果的に管理する方法が重要な問題となっています。この記事では、Xiaohongshu アカウント管理ソフトウェアの機能のいくつかについて説明し、Xiaohongshu アカウントをより適切に管理する方法を探ります。ソーシャルメディアが成長するにつれて、多くの人が複数のソーシャルアカウントを管理する必要があることに気づきます。これは小紅書ユーザーにとっても課題です。小紅書アカウント管理ソフトウェアの中には、コンテンツの自動公開、スケジュールされた公開、データ分析、その他の機能など、ユーザーが複数のアカウントをより簡単に管理できるようにするものがあります。これらのツールを通じて、ユーザーはアカウントをより効率的に管理し、アカウントの露出と注目を高めることができます。さらに、Xiaohongshu アカウント管理ソフトウェアには、

ディスカスとは何ですか? Discuzの定義と機能紹介 ディスカスとは何ですか? Discuzの定義と機能紹介 Mar 03, 2024 am 10:33 AM

「Discuz の探索: 定義、機能、およびコード例」 インターネットの急速な発展に伴い、コミュニティ フォーラムは人々が情報を取得し、意見を交換するための重要なプラットフォームになりました。多くのコミュニティ フォーラム システムの中でも、Discuz は中国でよく知られたオープン ソース フォーラム ソフトウェアとして、大多数の Web サイト開発者や管理者に好まれています。それで、ディスカスとは何ですか?どのような機能があり、Web サイトにどのように役立つのでしょうか?この記事では、Discuz について詳しく紹介し、読者がDiscuz についてさらに学ぶのに役立つ具体的なコード例を添付します。

PHP のヒント: 前のページに戻る関数をすばやく実装する PHP のヒント: 前のページに戻る関数をすばやく実装する Mar 09, 2024 am 08:21 AM

PHP のヒント: 前のページに戻る機能をすばやく実装する Web 開発では、前のページに戻る機能を実装する必要があることがよくあります。このような操作により、ユーザー エクスペリエンスが向上し、Web ページ間の移動が容易になります。 PHP では、いくつかの簡単なコードを通じてこの機能を実現できます。この記事では、前のページに戻る機能を素早く実装する方法と、具体的な PHP コード例を紹介します。 PHP では、$_SERVER['HTTP_REFERER'] を使用して前のページの URL を取得できます。

PHP 実践: フィボナッチ数列をすばやく実装するコード例 PHP 実践: フィボナッチ数列をすばやく実装するコード例 Mar 20, 2024 pm 02:24 PM

PHP の実践: フィボナッチ数列をすばやく実装するためのコード例 フィボナッチ数列は、数学では非常に興味深い一般的な数列です。次のように定義されています: 最初と 2 番目の数値は 0 と 1、3 番目からは数値で始まり、それぞれの数値前の 2 つの数値の合計です。フィボナッチ数列の最初のいくつかの数値は、0、1、1.2、3、5、8、13、21 などです。 PHP では、再帰と反復を通じてフィボナッチ数列を生成できます。以下ではこの2つを紹介していきます

LinuxにおけるGDMの機能と機能を詳しく解説 LinuxにおけるGDMの機能と機能を詳しく解説 Mar 01, 2024 pm 04:18 PM

Linux での GDM の機能と機能の詳細な説明 Linux オペレーティング システムでは、GDM (GNOMEDisplayManager) は、ユーザーがシステムにログインおよびログアウトするためのインターフェイスを提供するグラフィカル ログイン マネージャーです。 GDM は通常、GNOME デスクトップ環境の一部ですが、他のデスクトップ環境でも使用できます。 GDM の役割は、ログイン インターフェイスを提供するだけでなく、ユーザー セッション管理、スクリーン セーバー、自動ログイン、その他の機能も含まれます。 GDM の機能には主に次の側面が含まれます。

See all articles