标签如何调用?

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

在织梦中,文章内容主要存储在两个地方:

织梦调用文章内容标签
(图片来源网络,侵删)
  1. (description):在后台发布文章时填写的“字段,通常用于列表页的简介。
  2. 文章正文 (body):文章的完整内容,存储在数据库的 dede_addonarticledede_arctiny 表中。

调用它们的标签分别是 {dede:field.description}{dede:field.body}


核心标签:{dede:field.body}

这是调用文章的标签,只能用在文章内容页模板(通常是 article_article.htm)。

基本用法:

{dede:field.body}

这行代码会直接输出当前文章的全部HTML内容,包括<p><img><h1>等所有标签。

织梦调用文章内容标签
(图片来源网络,侵删)

常用功能与进阶用法

仅仅输出完整内容往往是不够的,我们通常需要对内容进行一些处理,比如截取摘要、去除HTML标签、调用图片等。

调用文章摘要 ({dede:field.description})

这个标签用于调用后台填写的文章摘要,同样只在内容页使用。

{dede:field.description}

截取文章正文作为摘要(非常常用)

如果后台没有填写摘要,或者你希望自动从正文中截取一部分作为摘要,可以使用 function='htmlspecialchars(@me)' 结合 cn_substr 函数。

语法: {dede:field.body function='htmlspecialchars(cn_substr(@me, 200))'}

织梦调用文章内容标签
(图片来源网络,侵删)

参数解释:

  • @me:代表当前字段的原始值,在这里就是文章的 body
  • cn_substr:织梦的截取字符串函数。
    • 第一个参数 @me:要截取的字符串。
    • 第二个参数 200:截取的字符长度(一个汉字、一个字母、一个标点都算一个字符)。
  • htmlspecialchars:将HTML特殊字符转换为HTML实体,这是一个非常重要的安全函数,可以防止XSS攻击,并确保<p>等标签在摘要中不被直接解析,而是以文本形式显示。

示例(在列表页或内容页调用200字摘要):

<p>{dede:field.body function='htmlspecialchars(cn_substr(@me, 200))'}</p>

去除HTML标签后截取

有时候你只需要纯文本的摘要,不希望保留任何HTML格式。

语法: {dede:field.body function='htmlspecialchars(strip_tags(cn_substr(@me, 200))}'}

参数解释:

  • strip_tags:PHP函数,用于去除字符串中的所有HTML和PHP标签。
  • cn_substr:再对去除标签后的纯文本进行截取。

示例(调用200字纯文本摘要):

<p>{dede:field.body function='htmlspecialchars(strip_tags(cn_substr(@me, 200))}'}</p>

调用文章中的第一张图片(缩略图)

这是一个非常流行的需求,比如在列表页显示文章的“图文”模式,自动提取正文的第一张图片作为缩略图。

语法: {dede:field.body function='preg_replace("/<img[^>]+>/", "", @me)'} 注意: 这个标签是用来移除第一张图片的,而不是获取,获取第一张图片需要更复杂的处理,通常通过自定义函数实现。

正确的获取第一张图片的方法(需要修改模板文件):

  1. 打开织梦的 /include/helpers/extend.helper.php 文件。
  2. 在文件末尾 ?> 之前,添加以下自定义函数:
// 获取文章body中的第一张图片地址
if (!function_exists('GetFirstImg'))
{
    function GetFirstImg($body)
    {
        $preg = "/<img.*?src=[\'|\"](.*?)[\'|\"].*?[\/]?>/i";
        preg_match_all($preg, $body, $match);
        if (!empty($match[1]))
        {
            return $match[1][0]; // 返回第一张图片的src
        }
        return ''; // 如果没有图片,返回空
    }
}

在你的模板(列表页或内容页)中,就可以这样调用:

<img src="{dede:field.body function='GetFirstImg(@me)'/}" alt="{dede:field.title/}" />

如果文章没有图片,上面的代码会输出一个空的 src 属性,我们可以结合三元运算符来优化:

{dede:field.name='imgurl' function='(@me ? "<img src=\'@me\' />" : "<img src=\'/images/default.jpg\' />")'}

(这里的 field.name='imgurl' 是一个变通方法,更规范的是直接调用函数)

更简洁的调用方式(在模板里直接使用函数): 如果你的织梦版本支持,可以直接在模板里调用PHP函数:

<img src="{dede:field.body function='GetFirstImg(@me)'/}" />

如果不行,就需要通过 {dede:php} 标签来调用,但这不推荐,因为效率较低。

内容分页

当一篇文章很长时,需要进行分页,织梦默认支持内容分页。

后台设置: 在后台“系统” -> “系统基本参数” -> “核心设置”中,确保“启用_arcmaker”是“是”。

模板中的分页标签:页模板 article_article.htm 中,需要将 {dede:field.body} 和分页标签放在一起。

标准写法:

<div class="article-content">
    {dede:field.body/}
</div>
<div class="page-nav">
    {dede:pagebreak/}
</div>

{dede:pagebreak/} 会自动生成上一页、下一页、页码等链接。


在列表页调用内容相关标签

虽然 {dede:field.body} 只能在内容页使用,但在列表页(list_article.htm)我们同样可以使用一些技巧来获取部分内容。

列表页常用字段标签:

  • {dede:list}:列表专用循环标签。
  • {dede:field.title}
  • {dede:field.pubdate}:发布日期。
  • {dede:field.description}:后台填写的)。
  • {dede:field.arcurl}:文章链接地址。

在列表页调用正文摘要(如方法2所述):

{dede:list}
    <h2><a href="[field:arcurl/]">[field:title/]</a></h2>
    <p>[field:body function='htmlspecialchars(cn_substr(@me, 200))'/]...</p>
    <span>[field:pubdate function="MyDate('Y-m-d', @me)"]</span>
{/dede:list}

注意: 在列表页循环 {dede:list} 内部,{dede:field.xxx} 应该写成 [field:xxx/] 的形式。


总结与最佳实践

需求 标签/代码 适用页面 说明
调用完整文章内容 {dede:field.body} 内容页 (article_article.htm) 原样输出,包含所有HTML标签。
调用后台填写的摘要 {dede:field.description} 内容页 直接输出后台“字段的内容。
截取正文为摘要 {dede:field.body function='htmlspecialchars(cn_substr(@me, 200))'} 内容页、列表页 推荐用法,自动截取并防止XSS。
截取纯文本摘要 {dede:field.body function='htmlspecialchars(strip_tags(cn_substr(@me, 200))}'} 内容页、列表页 去除所有HTML标签后截取。
获取第一张图片 需添加自定义函数 GetFirstImgextend.helper.php,再在模板调用 内容页、列表页 功能强大,但需要修改文件。
分页 {dede:field.body/} + {dede:pagebreak/} 内容页 必须同时使用才能生效。

重要提示:

  • 安全性:始终使用 htmlspecialchars() 函数处理从数据库中输出的、可能包含用户输入的内容,这是防止XSS攻击的关键。
  • 模板语法页和列表页的标签语法差异,列表页在 {dede:list} 循环内使用 [field:xxx/]
  • 自定义函数:像获取第一张图片这类复杂功能,通过添加自定义函数是织梦最灵活、最规范的扩展方式。
-- 展开阅读全文 --
头像
织梦如何判断栏目是否有子栏目?
« 上一篇 今天
c语言读取txt文件到数组
下一篇 » 今天

相关文章

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