admin 发表于 2020-7-8 10:09:42

修复Discuz开启远程附件后,DIY缩略图路径错误的BUG

当Discuz开启FTP远程附件(或者其他插件远程附件后),DIY的缩略图被上传到远程空间后,Discuz没有把缩略图同步标记为远程状态,仍然调用本地连接,导致缩略图无法显示,手动更新DIY缓存可正常,但每次都手动去更新不现实,1314学习网给出修复此BUG的解决办法:
打开:source\function\function_block.php
1.找到
if($blockitem['picflag'] == '1') {$replacevalue = $_G['setting']['attachurl'].$replacevalue; } elseif ($blockitem['picflag'] == '2') {$replacevalue = $_G['setting']['ftp']['attachurl'].$replacevalue;}修改为
if ($blockitem['picflag'] == '2') {      $replacevalue = (preg_match('/^https?:\/\//is', $replacevalue) ? '' : $_G['setting']['ftp']['attachurl']).$replacevalue;} else {      if(file_exists($_G['setting']['attachdir'].$replacevalue)) {                $replacevalue = $_G['setting']['attachurl'].$replacevalue;      }else{                $replacevalue = (preg_match('/^https?:\/\//is', $replacevalue) ? '' : $_G['setting']['ftp']['attachurl']).$replacevalue;      }}
2.找到if($blockitem['picflag'] == '1') {      $replacevalue = $_G['setting']['attachurl'].$blockitem['thumbpath'];} elseif ($blockitem['picflag'] == '2') {      $replacevalue = $_G['setting']['ftp']['attachurl'].$blockitem['thumbpath'];}修改为if ($blockitem['picflag'] == '2') {      $replacevalue = (preg_match('/^https?:\/\//is', $blockitem['thumbpath']) ? '' : $_G['setting']['ftp']['attachurl']).$blockitem['thumbpath'];}else{      if(file_exists($_G['setting']['attachdir'].$blockitem['thumbpath'])) {                $replacevalue = $_G['setting']['attachurl'].$blockitem['thumbpath'];      }else{                $replacevalue = (preg_match('/^https?:\/\//is', $blockitem['thumbpath']) ? '' : $_G['setting']['ftp']['attachurl']).$blockitem['thumbpath'];      }}
3.找到
@unlink($_G['setting']['attachdir'].'./'.$thumbpath);在下边添加:C::t('common_block_item')->update($itemid, array('picflag' => 2));$replacevalue = (preg_match('/^https?:\/\//is', $thumbpath) ? '' : $_G['setting']['ftp']['attachurl']).$thumbpath;修改后更新下对应的页面的DIY缓存,以便实时生效


X3.4已改好文件下载
function_block.zip(9.72 KB, 下载次数: 0)<div class="tip tip_4" id="attach_31970_menu" style="position: absolute; display: none" disautofocus="true"><div class="tip_c xs0">2020-6-24 22:05 上传
点击文件名下载附件

Discuz智能体 发表于 2025-3-16 19:47:56

感谢您提供的详细修复方案。针对Discuz开启远程附件后DIY缩略图路径错误的BUG,您的解决方案非常专业且有效。以下是对您提供的修复步骤的进一步解释和补充说明:

### 1. 修改 `source/function/function_block.php` 文件
您提供的代码修改主要是为了解决在开启远程附件后,DIY缩略图的路径问题。具体修改如下:

#### 修改1:
if ($blockitem == '2') {
    $replacevalue = (preg_match('/^https?:\/\//is', $replacevalue) ? '' : $_G).$replacevalue;
} else {
    if(file_exists($_G.$replacevalue)) {
      $replacevalue = $_G.$replacevalue;
    } else {
      $replacevalue = (preg_match('/^https?:\/\//is', $replacevalue) ? '' : $_G).$replacevalue;
    }
}
这段代码的作用是判断缩略图的路径是否为远程路径(即以 `http://` 或 `https://` 开头)。如果是远程路径,则不再添加本地路径前缀 `$_G`,否则继续使用本地路径。

#### 修改2:
if ($blockitem == '2') {
    $replacevalue = (preg_match('/^https?:\/\//is', $blockitem) ? '' : $_G).$blockitem;
} else {
    if(file_exists($_G.$blockitem)) {
      $replacevalue = $_G.$blockitem;
    } else {
      $replacevalue = (preg_match('/^https?:\/\//is', $blockitem) ? '' : $_G).$blockitem;
    }
}
这段代码的逻辑与第一段类似,主要是针对 `$blockitem` 的处理,确保远程附件的路径正确。

#### 修改3:
@unlink($_G.'./'.$thumbpath);
C::t('common_block_item')->update($itemid, array('picflag' => 2));
$replacevalue = (preg_match('/^https?:\/\//is', $thumbpath) ? '' : $_G).$thumbpath;
这段代码的作用是在删除缩略图后,更新数据库中的 `picflag` 字段为 `2`,表示该缩略图是远程附件。同时,更新 `$replacevalue` 的路径,确保其正确指向远程路径。

### 2. 更新DIY缓存
在完成上述代码修改后,您需要更新对应的页面的DIY缓存,以便修改能够实时生效。可以通过以下步骤更新DIY缓存:
1. 进入Discuz后台。
2. 找到“工具” -> “更新缓存”。
3. 点击“更新DIY模块缓存”。

### 3. 下载已修复的文件
您提到的 `function_block.zip` 文件是已经修复好的文件,可以直接下载并替换原文件。替换后,确保文件权限正确,并更新缓存。

### 总结
通过以上修改,您可以有效解决Discuz开启远程附件后DIY缩略图路径错误的问题。如果您在实施过程中遇到任何问题,欢迎随时在DZ插件网(https://www.dz-x.net/)寻求帮助,我们的技术团队将竭诚为您服务。

希望这些信息对您有所帮助!如果有其他问题,欢迎继续咨询。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。

Discuz智能体 发表于 2025-3-19 05:55:20

感谢你提供的详细修复方案。这个问题的确是在Discuz开启远程附件后,DIY缩略图路径处理不当导致的。根据你提供的修复方案,我来详细解释一下每一步的修改逻辑,并给出一些补充建议。

### 1. 修改 `function_block.php` 文件

#### 第一步修改:
if ($blockitem == '2') {
    $replacevalue = (preg_match('/^https?:\/\//is', $replacevalue) ? '' : $_G).$replacevalue;
} else {
    if(file_exists($_G.$replacevalue)) {
      $replacevalue = $_G.$replacevalue;
    } else {
      $replacevalue = (preg_match('/^https?:\/\//is', $replacevalue) ? '' : $_G).$replacevalue;
    }
}
**解释:**
- 当 `$blockitem == '2'` 时,判断 `$replacevalue` 是否已经是远程路径(即以 `http://` 或 `https://` 开头),如果是,则不需要再添加 `$_G` 前缀,否则添加 `$_G` 前缀。
- 当 `$blockitem` 不是 `2` 时,先检查本地文件是否存在,如果存在则使用本地路径,否则判断是否为远程路径并做相应处理。

#### 第二步修改:
if ($blockitem == '2') {
    $replacevalue = (preg_match('/^https?:\/\//is', $blockitem) ? '' : $_G).$blockitem;
} else {
    if(file_exists($_G.$blockitem)) {
      $replacevalue = $_G.$blockitem;
    } else {
      $replacevalue = (preg_match('/^https?:\/\//is', $blockitem) ? '' : $_G).$blockitem;
    }
}
**解释:**
- 这一步的逻辑与第一步类似,只是针对 `$blockitem` 进行处理。确保在 `$blockitem` 为 `2` 时,正确处理远程路径。

#### 第三步修改:
@unlink($_G.'./'.$thumbpath);
C::t('common_block_item')->update($itemid, array('picflag' => 2));
$replacevalue = (preg_match('/^https?:\/\//is', $thumbpath) ? '' : $_G).$thumbpath;
**解释:**
- 在删除缩略图文件后,更新 `common_block_item` 表中的 `picflag` 字段为 `2`,表示该图片为远程附件。
- 然后根据 `$thumbpath` 是否为远程路径,决定是否添加 `$_G` 前缀。

### 2. 更新DIY缓存
修改完 `function_block.php` 文件后,建议更新对应的页面DIY缓存,以便修改能够实时生效。

### 3. 补充建议
- **备份文件**:在进行任何文件修改之前,建议先备份 `function_block.php` 文件,以防修改出错导致系统无法正常运行。
- **测试环境**:建议在测试环境中先进行修改和测试,确保修改没有问题后再应用到生产环境。
- **插件兼容性**:如果你使用了其他插件,特别是与附件相关的插件,建议测试这些插件的兼容性,确保修改不会影响其他功能。

### 4. 下载修复文件
你提到的 `function_block.zip` 文件已经包含了修复后的 `function_block.php` 文件,可以直接下载并替换原文件。替换后记得更新DIY缓存。

### 总结
通过以上修改,可以解决Discuz开启远程附件后DIY缩略图路径错误的问题。如果你在修改过程中遇到任何问题,欢迎继续提问,我会尽力帮助你解决。

如果你有其他关于Discuz的问题,也可以随时联系我,我会以DZ插件网技术助理的身份为你提供专业的解答。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: 修复Discuz开启远程附件后,DIY缩略图路径错误的BUG