dede list如何调用图片?

99ANYc3cd6
预计阅读时长 16 分钟
位置: 首页 DEDE建站 正文

使用 array 自定义函数(最推荐,最灵活)

这是目前最主流、最灵活的方法,它可以在不修改系统核心文件的情况下,通过自定义一个函数来获取文章正文的第一张图片。

dede list 调用图片
(图片来源网络,侵删)

步骤 1:创建自定义函数文件

  1. 在你的网站根目录下找到 include/ 文件夹。
  2. include/ 文件夹中创建一个新文件,命名为 extention.func.php。(如果这个文件已存在,则直接在其中添加代码即可)。
  3. extention.func.php 文件中,添加以下 PHP 函数代码:
/**
 * 获取文章内容中的第一张图片路径
 * @param string $body 文章内容
 * @param string $imgurl 默认图片路径(如果文章没有图片则返回此默认图)
 * @return string 图片路径
 */
function GetFirstImg($body, $imgurl = '/images/defaultpic.jpg') {
    // 匹配 img 标签的 src 属性
    $pattern = "/<img.*?src=[\'|\"](.*?)[\'|\"].*?[\/]?>/i";
    preg_match_all($pattern, $body, $matches);
    // 如果找到了图片,则返回第一张的 src
    if (!empty($matches[1])) {
        // 处理相对路径,转为绝对路径
        $first_img = $matches[1][0];
        if (strpos($first_img, 'http') !== 0) {
            $first_img = 'http://' . $_SERVER['HTTP_HOST'] . $first_img;
        }
        return $first_img;
    }
    // 如果没有找到图片,则返回默认图片
    return $imgurl;
}

代码解释:

  • 这个函数 GetFirstImg 接收两个参数:$body)和 $imgurl(一个可选的默认图片路径)。
  • 它使用正则表达式 preg_match_all 在文章内容中查找所有 <img> 标签的 src 属性。
  • 如果找到了图片,它会返回第一张图片的 src,并将其转换为绝对路径。
  • 如果没有找到任何图片,它会返回你设置的默认图片路径(/images/defaultpic.jpg)。请确保这个默认图片存在。

步骤 2:在模板文件中使用

打开你的列表模板文件,通常是 templets/你的模板目录/list_article.htm

list 标签循环内部,使用 {dede:field function='GetFirstImg(@me)'/} 来调用。

完整示例代码:

dede list 调用图片
(图片来源网络,侵删)
{dede:list pagesize='10'}
  <li>
    <!-- 调用文章第一张图片,如果没有则使用默认图 /images/defaultpic.jpg -->
    <a href="[field:arcurl/]">
      <img src="{dede:field function='GetFirstImg(@me, "/images/defaultpic.jpg")'/}" alt="[field:title function='html2text(@me)'/]" />
    </a>
    <h2><a href="[field:arcurl/]">[field:title/]</a></h2>
    <p>[field:description function='cn_substr(@me, 100)'/]...</p>
    <span>[field:pubdate function="MyDate('Y-m-d', @me)"/]</span>
  </li>
{/dede:list}

说明:

  • [field:body/]:这是文章正文的完整字段,我们把它作为参数 @me 传递给 GetFirstImg 函数。
  • function='GetFirstImg(@me, "/images/defaultpic.jpg")':这里调用了我们刚刚创建的函数。@me 代表当前字段的值(即文章内容),"/images/defaultpic.jpg" 是我们传入的默认图片路径。
  • alt="[field:title function='html2text(@me)'/]":为图片添加 alt 属性,这是良好的 SEO 实践。html2text 函数可以去除标题中的 HTML 标签。

修改 arc.listview.class.php 文件(传统方法,不推荐)

这种方法是直接修改 DedeCMS 的核心类文件,虽然也能实现,但有以下缺点:

  • 升级 DedeCMS 时,修改的代码会丢失,需要重新修改。
  • 直接修改核心文件,存在一定的风险。

仅作了解,不建议新手使用。

  1. 找到文件 /include/arc.listview.class.php
  2. 在第 727 行左右找到 //设置环境变量 这段代码。
  3. SetEnv 函数中,找到 if($this->Fields['description'] != '') 这部分,在它后面添加获取图片的逻辑。
  4. else 分支里,也添加类似的逻辑。

修改后的代码片段(仅供参考):

dede list 调用图片
(图片来源网络,侵删)
// 在 SetEnv 函数中,修改 else 分支(如果没有描述)
else {
    // ... 其他代码 ...
    // 添加以下代码来获取第一张图片
    $this->Fields['litpic'] = '';
    $body = $this->Fields['body'];
    $preg = "/<img.*?src=['|"](.*?)['|"].*?[/]?>/is";
    preg_match_all($preg, $body, $match);
    if (!empty($match[1])) {
        $this->Fields['litpic'] = $match[1][0];
    }
    // ... 其他代码 ...
}

在模板中的使用: 修改后,你就可以像调用普通缩略图一样调用它了。

{dede:list pagesize='10'}
  <li>
    <a href="[field:arcurl/]">
      <img src="[field:litpic/]" alt="[field:title/]" />
    </a>
    <!-- ... 其他内容 ... -->
  </li>
{/dede:list}

直接调用文章缩略图 [field:litpic/]

如果你的文章在发布时,已经通过“远程图片本地化”或者手动上传的方式,将第一张图片设置为了文章的缩略图(即 litpic 字段),那么事情就变得非常简单。

你只需要直接调用 [field:litpic/] 即可。

适用场景:

  • 你在后台发布文章时,手动点击了“提取远程图片并保存到本地”。
  • 你手动上传了图片并设置为缩略图。

模板代码:

{dede:list pagesize='10'}
  <li>
    <a href="[field:arcurl/]">
      <img src="[field:litpic/]" alt="[field:title/]" onerror="this.src='/images/defaultpic.jpg';" />
    </a>
    <!-- ... 其他内容 ... -->
  </li>
{/dede:list}

代码优化: onerror="this.src='/images/defaultpic.jpg';" 是一个非常实用的技巧。[field:litpic/] 获取的图片路径不存在或加载失败,会自动触发 onerror 事件,显示你指定的默认图片,避免页面出现破损的图片图标。


总结与推荐

方法 优点 缺点 推荐度
array 自定义函数 灵活、安全、不破坏核心文件、可自定义默认图 需要手动创建函数文件 ★★★★★ (强烈推荐)
修改核心文件 无需修改模板 破坏核心、升级麻烦、有风险 ★☆☆☆☆ (不推荐)
直接调用 litpic 最简单、效率最高 依赖后台设置缩略图,无法自动获取正文图片 ★★★★☆ (适合已设置好缩略图的情况)

对于绝大多数情况,强烈推荐使用方法一,它一劳永逸,解决了自动获取正文图片的问题,并且非常安全。

-- 展开阅读全文 --
头像
getsockopt如何获取套接字选项?
« 上一篇 01-30
织梦移动端模板下载地址在哪里?
下一篇 » 01-30

相关文章

取消
微信二维码
支付宝二维码

目录[+]