TA的每日心情 | 喜歡 半小時前 |
---|
簽到天數: 933 天 [LV.10]昇任副理
管理員
  
- 積分
- 4527
  
|

樓主 |
發表於 2025-8-26 00:07:15
|
顯示全部樓層
若你要在 Discuz! 中實作「簽到滿 1000 次即可獲得某一個勳章」的自訂任務(或功能),可以透過「自訂任務 + 勳章發放」的結合方式實作。
✅ 功能需求整理:
檢查使用者簽到次數是否 ≥ 1000 次
若符合條件,標記任務為完成
完成任務時自動發放某個指定勳章(medal)
技術實作概要:
任務類別放在 /source/class/task/task_checkin1000.php
利用 check_completion() 判斷使用者是否簽到達 1000 次
在 reward() 方法中發放勳章
任務 PHP 實作範例:
1. 檔案位置:
/source/class/task/task_checkin1000.php
2. 任務腳本內容:
<?php
if (!defined('IN_DISCUZ')) {
exit('Access Denied');
}
class task_checkin1000 extends task_base {
// 任務描述(可用語言包)
function view() {
return '簽到滿 1000 次,即可獲得專屬勳章。';
}
// 檢查任務是否完成
function check_completion($task = array()) {
global $_G;
// 假設簽到次數存在 common_member_count.checkin 字段(這需要配合插件或自定欄位)
$checkin_count = DB::result_first("SELECT checkin FROM ".DB::table('common_member_count')." WHERE uid='$_G[uid]'");
return $checkin_count >= 1000;
}
// 任務完成後發勳章
function reward($task) {
global $_G;
$medalid = 5; // 假設你要發的是 ID 為 5 的勳章
$uid = $_G['uid'];
// 檢查是否已擁有該勳章
$has_medal = DB::result_first("SELECT COUNT(*) FROM ".DB::table('forum_medallog')." WHERE uid='$uid' AND medalid='$medalid'");
if (!$has_medal) {
// 插入勳章記錄(這會讓勳章發放並顯示)
DB::insert('forum_medallog', array(
'uid' => $uid,
'medalid' => $medalid,
'type' => 0,
'dateline' => TIMESTAMP,
'expiration' => 0,
'status' => 1,
'adminid' => 0,
'reason' => '簽到滿 1000 次自動獲得',
));
// 加入勳章到會員
DB::insert('forum_medal', array(
'uid' => $uid,
'medalid' => $medalid,
), false, true);
}
return true;
}
}
勳章設定說明
進入後台 →【用戶】→【勳章】
建立一個新的勳章(例如「簽到之王」),編號假設是 5
選擇 允許用戶申請:否,由任務系統自動發放
任務後台設定方式
後台 →【工具】→【站點任務】
新增任務:
任務腳本名稱:checkin1000
任務名稱:簽到達 1000 次送勳章
任務描述:系統會自動檢查簽到次數,滿 1000 次自動發放勳章。
其他:時間限制可不設
注意事項
若你沒有一個記錄「簽到總次數」的欄位,你需要使用或撰寫一個「簽到插件」來累積 checkin 欄位(例如《每日簽到插件》會有此欄位)
勳章只會發一次;如要可重複,需要調整邏輯
若使用 Discuz! 原生任務無法滿足需求,也可以透過插件開發處理
|
|