织梦列表如何显示多图?

99ANYc3cd6
预计阅读时长 24 分钟
位置: 首页 织梦建站 正文

使用官方推荐的 imglist 字段(最推荐、最规范)

这是织梦官方为了解决多图问题而设计的最佳方案,它要求你在发布文章时,将多图上传到文章的“图片集”字段中。

织梦列表怎么显示多图
(图片来源网络,侵删)

核心思路:

  1. 修改文章模型:为文章增加一个专门的“图片集”字段。
  2. 发布文章时:将多图上传到这个新增的“图片集”字段。
  3. 调用列表:使用 arclist 标签,通过 imglist 属性来调用这个字段里的图片。

详细步骤:

第1步:修改文章模型,添加“图片集”字段

  1. 登录织梦后台,进入 [系统] -> [核心设置] -> [内容模型管理]
  2. 找到并点击你正在使用的文章模型(通常是“文章”),点击 [字段管理]
  3. 在字段管理页面,点击 [添加新字段]
  4. 填写字段信息:
    • 字段名imglist (必须是小写,这是系统约定好的)
    • 字段类型多媒体图片
    • 字段提示图片集 (这个会在后台发布文章时显示)
    • 默认值:留空
    • 其他选项:保持默认即可。
  5. 点击 [保存],现在你的文章模型就有了一个可以上传多图的 imglist 字段了。

第2步:在后台发布文章时上传多图

  1. 进入 [核心] -> [内容发布],或修改一篇文章。
  2. 你会看到新增的“图片集”字段,点击“图片集”旁边的 “上传图片”“选择图片” 按钮。
  3. 在弹出的窗口中,上传你想要显示的多张图片,你可以设置每行显示几张图片,以及图片大小。
  4. 上传并保存图片后,这些图片就会被保存在 imglist 字段里。

第3步:在列表页模板中调用多图

你可以在列表页模板(通常是 list_article.htm)中使用 arclist 标签来调用这些图片。

基本语法:

织梦列表怎么显示多图
(图片来源网络,侵删)
{dede:arclist typeid='栏目ID' row='10' titlelen='30' imgwidth='150' imgheight='150'}
    <li>
        <a href="[field:arcurl/]" title="[field:title/]">
            <!-- 关键在这里:使用 [field:image/] 来调用 imglist 字段中的第一张图 -->
            <img src="[field:image/]" alt="[field:title/]">
        </a>
        <h3><a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a></h3>
    </li>
{/dede:arclist}

[field:image/] 的特殊说明: 当你使用了 imglist 属性后,[field:image/] 不再是调用文章正文的第一张图,而是调用你上传到“图片集”里的第一张图

如何显示多张图?

arclist 标签本身不支持在一个列表项里循环输出多张图,它每个循环(<li>)只处理一篇文章,如果你想在一个列表项里显示该文章的多张图片,需要结合PHP和一些自定义函数来实现。

进阶:在一个列表项里显示多张缩略图

织梦列表怎么显示多图
(图片来源网络,侵删)
  1. 在列表页模板的 arclist 标签里,调用 imglist 字段的内容。

    {dede:arclist typeid='栏目ID' row='10' titlelen='30'}
        <li>
            <a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
            <!-- 调用图片集内容,并用 div 包裹 -->
            <div class="multi-images">
                [field:imglist/]
            </div>
        </li>
    {/dede:arclist}
  2. 打开织梦的 include/common.func.php 文件,在文件末尾 ?> 之前,添加以下自定义函数:

    /**
     * 处理图片集,输出HTML
     * @param string $imglist 图片集内容,格式为 "图片地址1|图片说明1,图片地址2|图片说明2,..."
     * @param int $num 显示图片数量
     * @param int $width 图片宽度
     * @param int $height 图片高度
     * @return string
     */
    function GetImgList($imglist, $num = 3, $width = 80, $height = 80) {
        $dtp = new DedeTagParse();
        $dtp->SetNameSpace('field', '[', ']');
        $dtp->LoadSource($imglist);
        $innertext = '';
        if (is_array($dtp->CTags)) {
            $i = 0;
            foreach($dtp->CTags as $ctag) {
                if ($i >= $num) break; // 只显示指定数量的图片
                $innertext .= '<img src="'.$ctag->Get('imgurl').'" width="'.$width.'" height="'.$height.'" alt="'.$ctag->Get('text').'" />';
                $i++;
            }
        }
        return $innertext;
    }
  3. 修改列表页模板,使用这个新函数:

    {dede:arclist typeid='栏目ID' row='10' titlelen='30'}
        <li>
            <a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
            <div class="multi-images">
                <!-- 调用函数,显示3张,宽高80px -->
                [field:array function='GetImgList(@me, 3, 80, 80)'/]
            </div>
        </li>
    {/dede:arclist}

    CSS 样式参考:

    .multi-images {
        display: flex;
        gap: 5px; /* 图片间距 */
        margin-top: 5px;
    }
    .multi-images img {
        border: 1px solid #eee;
    }

修改织梦源码,调用文章正文中的多图(不推荐,有风险)

如果你不想修改模型,就想直接调用文章内容(body 字段)里的 <img> 标签,可以修改织梦源码。此方法会破坏织梦的封装性,升级时可能会被覆盖,请谨慎使用。

核心思路: 修改 arclist 标签的解析函数,让它能从文章正文中提取多张图片。

详细步骤:

  1. 找到并修改文件: 打开文件 /include/taglib/arclist.lib.php

  2. 定位关键代码: 在文件中找到大约第 375 行左右的 InnerText 函数(不同版本行号可能不同),找到这行代码:

    $GLOBALS['EnvList']['typeid'] = $typeid;

    在这行代码的后面,添加以下PHP代码:

    //---------- 调用文章正文多图 开始 ----------
    if ($CrossID == '' && $type == 'all') {
        $row['body'] = GetMkHTML($row['aid'], $row['typeid'], $row['body'], $row['description'], $row['keywords'], $row['templet'], $row['userip'], $row['likeid'], $row['arclank'], $row['adminid'], $row['ismake'], $row['channel'], $row['senddate'], $row['arcrank'], $row['click'], $row['money'], $row['lpos'], $row['title'], $row['ismember'], $row['tagid'], $row['totalpage'], $row['pagenum'], $row['maxpage'], $row['pagebreak'], $row['mtype'], $row['ddmaxadd'], $row['mobileurl']);
        $preg = "/<img.*?src=['\"](.*?)[^>]*?>/i";
        preg_match_all($preg, $row['body'], $match);
        if (isset($match[1]) && !empty($match[1])) {
            // 从第二张图开始取,最多取3张
            $images = array_slice($match[1], 1, 3);
            $row['image'] = implode('|', $images); // 将图片路径用 | 连接,存入 image 字段
        }
    }
    //---------- 调用文章正文多图 结束 ----------
  3. 在模板中使用: 修改列表页模板,因为现在 image 字段里存储了多张图片的路径(用 分隔),我们需要用PHP代码来循环输出。

    {dede:arclist typeid='栏目ID' row='10' titlelen='30' imgwidth='150' imgheight='150'}
        <li>
            <a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
            <div class="multi-images">
                [field:array runphp='yes']
                    $images = explode('|', @me);
                    $innertext = '';
                    foreach($images as $img) {
                        if (!empty($img)) {
                            $innertext .= '<img src="'.$img.'" width="80" height="80" alt="" />';
                        }
                    }
                    @me = $innertext;
                [/field:array]
            </div>
        </li>
    {/dede:arclist}

方法二的缺点:

  • 破坏性:修改了核心文件,升级织梦时会被覆盖,需要重新修改。
  • 性能:每次调用列表都会解析文章正文,对服务器有一定压力。
  • 不精确:可能提取到一些无用的图片(如表情、图标等),需要额外过滤。

总结与建议

方法 优点 缺点 适用场景
imglist 字段 官方推荐,规范、安全,不破坏核心文件,升级无忧。 需要修改模型和发布文章时的操作,稍微复杂一点。 强烈推荐,适用于所有需要多图展示的场景,特别是长期维护的网站。
修改源码 无需修改模型,直接调用正文图片,对于旧文章也能处理。 破坏核心文件,有升级风险,性能稍差,可能提取到无用图片。 快速实现,或项目已定型、不考虑升级的临时性需求。

对于绝大多数用户,请选择【方法一】,虽然前期配置多了一步,但从长远来看,这是最稳定、最可靠、最符合织梦设计思路的方案。

-- 展开阅读全文 --
头像
织梦模板集团源码,安全还是隐患?
« 上一篇 03-06
dede如何自动提取关键词?
下一篇 » 03-06

相关文章

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

目录[+]