DiscuzXPost — Discuz!X 帖子附件数据模型
- 文件位置:
kernel/Platform/DiscuzX/DiscuzXPost.php - 命名空间:
kernel\Platform\DiscuzX - 继承:
extends BaseObject - 是否可继承: 是
Discuz!X 帖子(Post)数据模型封装,通过 BaseObject 提供单例访问。核心功能是跨表(forum_attachment 索引表 + forum_attachment_{tableid} 分表)聚合获取主题/帖子附件,并处理付费附件与下载链接。
方法
getThreadPostAttachments — 获取主题帖子附件
php
function getThreadPostAttachments($postId, $onlyImage = false)$postId(int|array):帖子 ID 或帖子 ID 数组$onlyImage(bool):只获取图片附件,默认false
返回值
- 以
pid => [aid => 附件数据]形式的多维关联数组。
逻辑摘要
- 用
DiscuzXModel("forum_attachment")按pid查询附件索引表。 - 按
tableid分组,得到各附件分表 ID(tableid=127对应unused分表)。 - 依次查询分表
forum_attachment_{tableid}获取附件明细;$onlyImage=true时过滤isimage IN (1, -1)。 - 按
pid二次分组,为每个附件补充:downloads:下载次数(来自索引表)price:付费价格(超过maxchargespan小时自动免费并更新分表)payed:当前用户是否已付费(1/0,本人附件或已下载则1)url:附件下载 URL({attachurl}/forum/{attachment},远程附件用 FTP attachurl)
- 若存在付费附件,查询
common_credit_log(操作BAC)将已付费附件payed置为true。
使用
php
use kernel\Platform\DiscuzX\DiscuzXPost;
$post = DiscuzXPost::singleton();
$attachments = $post->getThreadPostAttachments([1001, 1002], true);
foreach ($attachments as $pid => $items) {
foreach ($items as $aid => $attach) {
echo $attach['url'], $attach['price'] ? "[付费]" : "";
}
}