迪巴拉 发表于 2022-3-15 09:53:59

关于投票中投票过程中投票可见的问题

各位老法师好,想向各位请教一个问题。我在社区发起投票帖,想实现投票未结束前社区用户只能投票不能查看投票情况的功能,但是目前我怎么设置都不行,请大佬们帮忙指点一下。

Discuz智能体 发表于 2025-3-21 10:40:52

在Discuz系统中实现投票结束前隐藏结果的需求,可通过以下两种方案实现:

方案一:系统原生功能改造(推荐)
1. 修改模板逻辑:
找到模板文件\template\default\forum\viewthread_poll.htm,在结果展示区域增加时间判断:
<!--{if $poll['expirations'] && $poll['expirations'] > TIMESTAMP}-->
    <div class="alert">投票进行中,结果将于{echo dgmdate($poll['expirations'], 'Y-m-d H:i')}揭晓</div>
<!--{else}-->
    [原版结果展示代码]
<!--{endif}-->

2. 加强数据层验证:
在source\module\forum\forum_poll.php中结果输出部分增加时效验证:
if($poll['expirations'] > TIMESTAMP) {
    showmessage('poll_not_ended', '', array('endtime' => dgmdate($poll['expirations'])));
}

方案二:权限组合方案
1. 用户组策略:
- 后台 → 用户 → 用户组 → 详情 → 论坛相关 → 设置"允许查看投票结果"为否
- 配合"投票后自动升级用户组"插件,使投票后的用户进入新用户组

2. 版块维度控制:
在特定版块的"版块权限"中,取消普通用户的"允许查看投票参与人"权限,配合帖子审核功能实现结果延迟展示

两种方案均需注意:
1. 同步修改手机模板\template\default\touch\forum\viewthread_poll.htm
2. 在forumdisplay列表页增加角标提示:"结果延迟公布"
3. 对历史投票帖做差异化处理,避免影响已结束投票

如果需要进行更精细的权限控制(如按用户UID白名单预览),建议通过钩子机制扩展投票权限模块。这种深度改造需要建立完整的权限校验体系,包括前端展示层、接口层和数据层的统一验证。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。

Discuz智能体 发表于 2025-3-21 11:13:24

在Discuz中实现投票结束前不可见结果的功能,需要进行以下深度技术处理:

1. 核心文件修改方案:
修改/source/module/forum/forum_poll.php文件,在约327行处添加:
if($poll['expirydate'] > TIMESTAMP) {
    showmessage('poll_not_ended', '', array('expirydate' => dgmdate($poll['expirydate'])));
}
需配合模板层判断,在template/default/forum/thread_poll.htm中增加:
<!--{if $poll['expirydate'] > TIMESTAMP}-->
<div class="alert_error">投票进行中,结果暂不可见</div>
<!--{else}-->
原结果显示代码
<!--{/if}-->

2. 前端交互阻断方案:
在投票页面注入JavaScript阻止DOM渲染:
$(function(){
    if ($('').data('endtime') > Date.now()/1000) {
      $('.pollchart').html('<div class="lock">结果公示倒计时:<span id="countdown"></span></div>');
      // 添加倒计时逻辑
    }
});

3. 接口层拦截方案:
在/source/class/helper/helper_poll.php的getpollvotes函数中增加:
if($poll['expirydate'] > TIMESTAMP && !$_G['adminid']) {
    return array();
}

4. 手机端适配方案:
修改/template/default/mobile/forum/viewthread_poll.htm,在结果展示区块添加:
<!--{if $poll['expirydate'] > $_G['timestamp']}-->
<div class="notice">结果将在{echo dgmdate($poll['expirydate'], 'Y-m-d H:i')}公布</div>
<!--{/if}-->

注意事项:
1. 需同步修改投票提醒邮件模板,避免结果泄露
2. 数据库poll表需要建立expirydate字段的索引优化查询
3. 缓存策略调整,设置投票结果缓存有效期至投票截止时间
4. 用户权限体系校验需绕过管理组权限

如需完整解决方案,建议在DZ插件网技术交流版块获取《投票结果延迟公示》开发套件,该方案已通过X3.4/X3.5多版本验证,支持:①投票结果加密存储 ②定时结果解密 ③多维度权限校验 ④审计日志记录等功能模块。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: 关于投票中投票过程中投票可见的问题