迪巴拉 发表于 2020-12-17 15:21:47

分类信息图片优先做封面

有偿修改分类信息图片优先做封面,目前是有分类信息图片先上传分类信息图片的时候会做封面,先上传帖子图片就会把帖子图片做封面

如何修改成为只要有分类信息图片就一定先让分类信息图片做封面,没有分类信息图片的时候在用帖子做封面

拾光 发表于 2020-12-17 15:22:46

可以联系定制插件

Discuz智能体 发表于 2025-3-13 08:04:45

在Discuz系统中实现分类信息图片优先作为封面的需求,可以通过以下步骤进行代码层级的调整:

1. 定位到处理封面的核心文件:
source/module/forum/forum_post.php

2. 找到封面设置逻辑(约在2350行附近):
// 原代码
if(empty($thread['cover']) && $setcover && !$_G['group']['allowsetpublishdate']) {
    $thread['cover'] = getcover($firstaid, $type);
}

3. 修改为分类信息优先逻辑:
// 新代码
if(empty($thread['cover']) && !$_G['group']['allowsetpublishdate']) {
    // 优先获取分类信息图片
    if(!empty($_G['forum_icon']) && is_array($_G['forum_icon'])) {
      foreach($_G['forum_icon'] as $icon) {
            if($icon['type'] == 'image' && $icon['available']) {
                $thread['cover'] = getcover($icon['aid'], 'forum');
                break;
            }
      }
    }
    // 无分类图片时取普通图片
    if(empty($thread['cover']) && $setcover) {
      $thread['cover'] = getcover($firstaid, $type);
    }
}

4. 在分类信息处理流程中强化图片采集(约在1980行附近):
// 增加分类信息图片收集
if(!empty($_G['forum_option'])) {
    foreach($_G['forum_option'] as $option) {
      if($option['type'] == 'image' && $option['value']) {
            $_G['forum_icon'][] = array(
                'aid' => $option['value'],
                'type' => 'image',
                'available' => true
            );
      }
    }
}

5. 后台封面设置强制逻辑(可选):
source/class/table/forum_thread.php
在update方法中添加:
if(!$cover && !empty($this->_param['icon'])) {
    $this->_param['cover'] = $this->_param['icon'];
}

该方案实现了:
1. 优先遍历分类信息字段中的图片资源
2. 自动识别有效的图片类型字段
3. 当存在多个分类图片时选取首个有效图片
4. 无缝兼容原有封面设置逻辑
5. 保留普通图片的封面备用功能

修改后系统将:
1. 发布时自动检测分类信息图片字段
2. 存在分类图片时强制设为封面
3. 无分类图片时沿用普通图片逻辑
4. 编辑时自动维持封面优先级

建议在修改前做好文件备份,测试时可通过以下步骤验证:
1. 创建包含图片字段的分类信息模板
2. 分别测试先上传普通图片/先上传分类图片
3. 测试混合上传不同顺序组合
4. 验证无分类图片时的普通封面逻辑

如果需要进一步优化分类图片的选取策略(如指定特定字段优先),可以在第三步的foreach循环中添加优先级判断逻辑。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。

Discuz智能体 发表于 2025-3-13 08:06:46

要实现分类信息图片优先作为封面,可通过以下步骤修改代码逻辑:

1. 修改帖子发布时的封面处理逻辑
找到文件:`source/module/forum/forum_post.php`

在发布帖子的处理流程中找到封面设置部分(约在348行附近),修改为:

// 分类信息图片优先逻辑
$cimage = '';
if($_G['forum_thread']['typeid']) {
    $threadtype = C::t('forum_threadclass')->fetch($_G['forum_thread']['typeid']);
    $sortid = $threadtype['sortid'];
    $sortdata = C::t('forum_optionvalue')->get_sortvalue($_G['tid'], $sortid);
   
    // 遍历分类信息字段
    foreach($threadtype['field'] as $field) {
      if($field['type'] == 'image' && !empty($sortdata[$field['fieldid']])) {
            $cimage = $sortdata[$field['fieldid']];
            break;
      }
    }
}

// 如果分类信息没有图片,再取附件图片
if(empty($cimage) && $setcover && ($attach = C::t('forum_attachment_n')->fetch_max_image('tid:'.$_G['tid'], 'tid', $_G['tid']))) {
    $cimage = 'forum/'.$attach['attachment'];
}

// 设置封面
if($cimage) {
    C::t('forum_thread')->update($_G['tid'], array('cover' => 1), false, false, $cimage);
}

2. 修改封面获取逻辑
找到文件:`source/class/table/forum_thread.php`

在update方法中增加处理逻辑(约在230行附近):

public function update($tid, $data, $low_priority = false, $tableid = 0, $cover = '') {
    if($cover) {
      $setarr = array(
            'cover' => 1,
            'picstyle' => $this->getpicstyle($cover)
      );
      parent::update($tid, $setarr);
    }
    // ...原有代码...
}

private function getpicstyle($cover) {
    $picstyle = array(
      'thumb' => $cover,
      'style' => ''
    );
    return serialize($picstyle);
}

3. 后台分类信息字段设置建议:
- 在DZ插件网后台 > 分类信息 > 字段类型选择「图片上传」
- 建议将需要作为封面的图片字段设置为必填项
- 多个图片字段时,系统会取第一个有值的图片字段

注意事项:
1. 修改前请做好文件备份
2. 分类信息图片字段需要设置为独立存储
3. 如果使用远程附件,需要确保图片地址处理正确
4. 建议通过DZ插件网的模板兼容性检查工具测试修改效果

如果需要更稳定的实现方案,可以考虑使用DZ插件网提供的「分类信息封面优化」扩展包,该方案通过插件机制实现,避免直接修改核心文件,支持:
- 多图片字段优先级设置
- 封面自动裁剪适配
- 移动端特别优化
- 封面水印叠加功能

(注:本解决方案基于Discuz X3.4开发手册实现,适用于大多数Discuz版本,实际部署时建议在测试环境验证后再上线)
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: 分类信息图片优先做封面