评论后可见功能如何保障内容安全与用户体验?

99ANYc3cd6
预计阅读时长 28 分钟
位置: 首页 织梦建站 正文

下面我将为您提供两种实现方法,一种是简单直接的,另一种是更完善、推荐的。

织梦文章内容评论后可见
(图片来源网络,侵删)

简单直接法(修改PHP和模板)

这种方法的核心思路是:页的模板中,判断当前用户是否已评论过这篇文章,如果评论过就显示全部内容,否则只显示部分内容。

步骤 1:修改文章内容模板 (article_article.htm)

  1. 找到你的文章内容模板文件,通常位于 /templets/default/article_article.htm
  2. 找到显示文章正文内容的地方,通常是一个 {dede:field.body/}
  3. {dede:php} 标签将其包裹起来,并添加判断逻辑。

修改前的代码可能类似这样:

<div class="article-content">
    {dede:field.body/}
</div>

修改后的代码如下:

<div class="article-content">
    {dede:php}
        // 获取当前文章ID
        $aid = $arcID;
        // 获取当前用户ID,如果是游客则为0
        $uid = $cfg_ml->M_ID; // 需要在模板头部引入 {dede:include filename='head.htm'/} 以便加载会员类
        // 查询数据库,检查该用户是否评论过此文章
        $dsql->SetQuery("SELECT * FROM `dede_feedback` WHERE `aid` = $aid AND `uid` = $uid AND `ischeck` = 1");
        $dsql->Execute();
        $hasCommented = $dsql->GetRows() > 0;
        if ($hasCommented) {
            // 如果评论过,则显示全部内容
            echo $fields['body'];
        } else {
            // 如果没评论过,则只显示前200个字符作为示例
            // 注意:这里直接截取 $fields['body'] 可能会破坏HTML结构,更安全的方法是使用正则表达式或专门的截取函数。
            // 这里为了简单,直接使用 mb_substr,并假设内容是安全的。
            $shortContent = mb_substr(strip_tags($fields['body']), 0, 200, 'utf-8');
            echo $shortContent . '...<br/><br/>';
            // 显示提示信息和评论表单
            echo '<div style="border:1px dashed #ccc; padding:10px; background:#f9f9f9; text-align:center; color:#666;">';
            echo '评论本文后即可查看完整内容!';
            // 这里可以手动嵌入评论表单,或者引导用户到评论区
            echo '<a href="#comment" style="color:#0066cc;">前往评论</a>';
            echo '</div>';
        }
    {/dede:php}
</div>
<!-- 原有的评论表单保持不变 -->
<div id="comment">
    <!-- 你的评论表单代码... -->
</div>

代码解释:

织梦文章内容评论后可见
(图片来源网络,侵删)
  • $aid = $arcID;: 获取当前文章的ID。
  • $uid = $cfg_ml->M_ID;: 获取当前登录用户的ID,如果用户未登录,$cfg_ml->M_ID 的值会是 0注意: 这行代码依赖于 {dede:include filename='head.htm'/} 加载的会员环境。
  • dsql->SetQuery(...): 查询 dede_feedback (评论) 表,检查是否存在指定用户 (uid) 对指定文章 (aid) 且已审核 (ischeck=1) 的评论。
  • $hasCommented = $dsql->GetRows() > 0;: 如果查询结果大于0条记录,说明用户评论过。
  • echo $fields['body'];: 如果评论过,输出完整文章内容。
  • mb_substr(strip_tags($fields['body']), 0, 200, 'utf-8'): 如果没评论过,先去除HTML标签,然后截取前200个字符作为摘要。
  • 显示一个提示信息,并引导用户去评论。

更完善、推荐的方法(使用自定义模型字段)

这种方法更灵活,也更容易管理,它不直接修改模板逻辑,而是通过一个“开关”字段来控制内容是否可见。

步骤 1:修改数据库表结构

  1. 登录你的phpMyAdmin,找到织梦数据库。

  2. 找到文章内容主表,通常是 dede_archives

  3. dede_archives 表添加一个新的字段,need_comment

    织梦文章内容评论后可见
    (图片来源网络,侵删)
    ALTER TABLE `dede_archives` ADD `need_comment` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '是否需要评论后可见,0=否,1=是';

步骤 2:修改后台发布文章界面

  1. 找到织梦后台的文件管理器,进入 /dede/ 目录。

  2. 找到并编辑文章编辑模板,通常是 article_edit.htm

  3. 在你希望显示“评论后可见”选项的地方(比如在文章摘要、来源等字段的后面),添加以下代码:

    <tr>
        <td height="24" colspan="2" style="background:#f5f5f5;">
            <b>评论后可见设置:</b>
        </td>
    </tr>
    <tr>
        <td class="bline" width="120">开启评论后可见:</td>
        <td class="bline">
            <input type="radio" name="need_comment" value="0" checked="checked" /> 否
            <input type="radio" name="need_comment" value="1" /> 是
        </td>
    </tr>
  4. 修改文章内容保存脚本 article_edit.php,让它接收并保存这个新字段。 在文件中找到 //更新附加表 的部分(通常在第600行左右),在 $upquery = "UPDATEdede_archivesSET..." 这句SQL语句中,添加 need_comment 字段:

    // 找到类似这样的代码
    $upquery = "UPDATE `dede_archives` SET 
                `typeid`='$typeid',
                `title`='$title',
                `ismake`='$ismake',
                `litpic`='$litpic',
                `pubdate`='$pubdate',
                `sortrank`='$sortrank',
                `mid`='$mid',
                `click`='$click',
                `money`='$money',
                `description`='$description',
                `keywords`='$keywords',
                `templet`='$templet',
                `senddate`='$senddate'
                WHERE id='$id'";
    // 修改为
    $need_comment = isset($need_comment) && $need_comment == '1' ? 1 : 0;
    $upquery = "UPDATE `dede_archives` SET 
                `typeid`='$typeid',
                `title`='$title',
                `ismake`='$ismake',
                `litpic`='$litpic',
                `pubdate`='$pubdate',
                `sortrank`='$sortrank',
                `mid`='$mid',
                `click`='$click',
                `money`='$money',
                `description`='$description',
                `keywords`='$keywords',
                `templet`='$templet',
                `senddate`='$senddate',
                `need_comment`='$need_comment'  // 添加这一行
                WHERE id='$id'";

步骤 3:修改文章内容模板 (article_article.htm)

模板的逻辑就变得非常清晰了。

<div class="article-content">
    {dede:php}
        // 获取当前文章ID
        $aid = $arcID;
        // 获取当前用户ID,如果是游客则为0
        $uid = $cfg_ml->M_ID;
        // 1. 首先检查文章是否设置了“评论后可见”
        $dsql->SetQuery("SELECT `need_comment` FROM `dede_archives` WHERE `id` = $aid");
        $dsql->Execute('need_comment');
        $row = $dsql->GetArray('need_comment');
        $needComment = $row['need_comment'];
        if ($needComment == 1) {
            // 2. 如果设置了,再检查用户是否评论过
            $dsql->SetQuery("SELECT * FROM `dede_feedback` WHERE `aid` = $aid AND `uid` = $uid AND `ischeck` = 1");
            $dsql->Execute();
            $hasCommented = $dsql->GetRows() > 0;
            if ($hasCommented) {
                // 评论过,显示全文
                echo $fields['body'];
            } else {
                // 没评论过,显示摘要
                $shortContent = mb_substr(strip_tags($fields['body']), 0, 200, 'utf-8');
                echo $shortContent . '...<br/><br/>';
                echo '<div style="border:1px dashed #ccc; padding:10px; background:#f9f9f9; text-align:center; color:#666;">';
                echo '本文开启了“评论后可见”,评论本文后即可查看完整内容!';
                echo '<a href="#comment" style="color:#0066cc;">前往评论</a>';
                echo '</div>';
            }
        } else {
            // 3. 如果文章没设置,直接显示全文
            echo $fields['body'];
        }
    {/dede:php}
</div>
<!-- 原有的评论表单保持不变 -->
<div id="comment">
    <!-- 你的评论表单代码... -->
</div>

总结与建议

特性 方法一 (简单直接) 方法二 (自定义字段)
实现难度 简单 中等,需要修改数据库和后台
灵活性 低,所有文章都使用同一套规则 高,可以为每篇文章单独设置
可维护性 差,逻辑写在模板里,不易修改 好,逻辑清晰,后台可配置
推荐度 ⭐⭐ (适合临时或少量文章) ⭐⭐⭐⭐⭐ (强烈推荐,专业做法)

强烈建议您使用方法二,虽然前期步骤多一些,但它为你的网站提供了极大的灵活性和可扩展性,管理员可以在后台自由决定哪些文章需要评论后可见,哪些不需要,而无需修改任何代码。

重要提示:

  • 修改文件前务必备份! 无论是模板文件还是PHP文件,修改前都请做好备份,以防出错。
  • 测试: 修改完成后,务必在不同场景下进行测试,包括:已登录用户评论、已登录用户未评论、游客评论、游客未评论、以及未开启“评论后可见”的文章。
  • HTML标签问题: 方法一中的 strip_tagsmb_substr 简单粗暴,可能会破坏HTML结构,如果文章内容包含复杂的标签(如<table>),截断后可能导致页面错乱,更安全的做法是使用专门处理HTML截取的函数,但这会增加代码复杂度,对于大多数纯文本或简单格式的文章,方法一已经足够。
-- 展开阅读全文 --
头像
织梦CMS有微信支付吗
« 上一篇 01-09
织梦企业产品详情页模板如何适配多终端?
下一篇 » 01-09

相关文章

取消
微信二维码
支付宝二维码