dede模板标签如何解析?

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

核心概念:工作流程

在深入标签之前,先理解 DedeCMS 的工作流程:

dede模板标签解析
(图片来源网络,侵删)
  1. 用户请求:用户在浏览器中访问一个页面,http://www.yoursite.com/a/1.html
  2. URL 解析:DedeCMS 的路由系统会解析这个 URL,发现这是一个静态 HTML 文件,于是检查是否存在。
  3. 静态文件处理
    • 如果文件存在:直接读取并输出这个 HTML 文件,速度最快。
    • 如果文件不存在:DedeCMS 会启动“动态解析”模式。
  4. 动态解析
    • 系统根据 URL 信息(如 a/1.html 中的 a1),找到对应的模板文件(default/list_article.htm)。
    • 模板引擎加载这个模板文件。
    • 引擎扫描文件中的所有 Dede 标签。
    • 对于每一个标签,引擎会调用其对应的 PHP 函数(如 GetArcList())去数据库或其他地方获取数据。
    • 将获取到的数据填充到标签的位置。
    • 将最终生成纯 HTML 代码。
    • (可选)将生成的 HTML 保存到 a/1.html 的位置,供下次用户直接访问。
  5. 输出结果:将最终生成的 HTML 代码发送给用户的浏览器。

关键点:模板文件(.htm)是“半成品”,它包含了静态的 HTML 和动态的 Dede 标签,DedeCMS 的引擎在运行时将其“编译”成完整的静态 HTML 页面。


模板文件结构

一个典型的 DedeCMS 模板文件结构如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">{dede:global.cfg_webname/}</title>
    <meta name="description" content="{dede:global.cfg_description/}" />
    <link rel="stylesheet" href="{dede:global.cfg_templets_skin/}/style/css/style.css">
</head>
<body>
    <!-- 头部 -->
    {dede:include filename="head.htm"/}
    <!-- 主体内容区 -->
    <div class="main">
        <!-- 循环输出文章列表 -->
        {dede:arclist titlelen='30' row='10'}
        <div class="list-item">
            <h2><a href="[field:arcurl/]">[field:title/]</a></h2>
            <p>[field:description function='cn_substr(@me, 100)'/]...</p>
            <div class="info">
                <span>作者:[field:writer/]</span>
                <span>时间:[field:pubdate function='MyDate('Y-m-d', @me)'/]</span>
                <span>点击:[field:click/]</span>
            </div>
        </div>
        {/dede:arclist}
    </div>
    <!-- 底部 -->
    {dede:include filename="footer.htm"/}
</body>
</html>

标签分类详解

DedeCMS 的标签主要分为四大类:普通标签、列表标签、内容页标签、条件判断标签

普通标签

用于输出简单的全局变量或单条数据,通常没有起始和结束标签。

dede模板标签解析
(图片来源网络,侵删)

语法{dede:标签名 属性='值' /}

常用标签:

  • {dede:global}:输出系统全局配置变量。

    • {dede:global.cfg_webname/}:网站名称
    • {dede:global.cfg_weburl/}:网站网址
    • {dede:global.cfg_templets_skin/}:当前模板目录
    • {dede:global.cfg_powerby/}:版权信息
  • {dede:field}页(article_article.htm)中,用于输出当前文章的字段。

    dede模板标签解析
    (图片来源网络,侵删)
    • {dede:field.title/}
    • {dede:field.body/}:文章正文
    • {dede:field.pubdate function='MyDate('Y-m-d H:i:s', @me)'/}:发布时间(带格式化)
    • {dede:field.keywords/}:文章关键词
  • {dede:php}:在模板中直接执行一小段 PHP 代码。

    • 注意:有安全风险,非必要不使用。
    • {dede:php}
      echo "Hello, DedeCMS!";
      {/dede:php}

列表标签

用于循环输出一组内容,如文章列表、图集列表等。必须有起始和结束标签

语法

{dede:标签名 属性='值'}
    <!-- 循环体,使用 [field:字段名/] 来获取当前项的数据 -->
{/dede:标签名}

最核心的列表标签:{dede:arclist}

{dede:arclist} 用于在任意页面调用文章列表,功能极其强大。

常用属性:

属性名 说明 示例
typeid 指定栏目ID,调用指定栏目及其子栏目的文章。 typeid='1' (调用ID为1的栏目)
row 获取条数 row='10' (获取10条)
infolen 简介长度 infolen='100' (简介最多100个字符)
orderby 排序方式 orderby='hot' (按点击量排序), orderby='pubdate' (按发布时间排序)
orderway 排序方向 orderway='desc' (降序), orderway='asc' (升序)
channelid 模型ID channelid='1' (调用文章模型), channelid='2' (调用图集模型)
limit 起始位置,条数 limit='0,5' (从第0条开始,取5条)

循环体内的字段:

{dede:arclist}{/dede:arclist} 之间,使用 [field:字段名/] 来获取当前文章的数据。

字段名 说明
[field:title/]
[field:arcurl/] 文章链接 (自动生成静态或动态链接)
[field:pubdate/] 发布时间 (时间戳)
[field:description/] 文章简介
[field:click/] 点击量
[field:writer/] 作者
[field:litpic/] 文章缩略图

示例:调用栏目ID为1的下的5篇热门文章,标题20字,简介80字。

{dede:arclist typeid='1' row='5' titlelen='20' infolen='80' orderby='click'}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <span>[field:description/]...</span>
    </li>
{/dede:arclist}

其他列表标签:

  • {dede:loop}:用于调用任意数据表,比 arclist 更灵活,但需要手动指定SQL。
  • {dede:channelartlist}:用于调用栏目列表,并可以在每个栏目下再调用其文章列表,常用于首页。
  • {dede:myad}:调用广告位。

内容页标签

页(article\_article.htm)或列表页(list\_*.htm)等特定页面生效的标签。

核心标签:{dede:field}{dede:global}

  • {dede:field}:如前所述,用于输出当前文章的字段。

    • {dede:field.title/}
    • {dede:field.body/}
    • {dede:field.pages/}:分页符
    • {dede:field.vote/}:投票功能
    • {dede:field.shownote/}:文章简介(在内容页)
  • {dede:global}页,{dede:global} 也可以用于获取当前文章的特定信息。

    • {dede:global.cfg_webname/}:网站名
    • {dede:global.itemindex/}:当前栏目在首页栏目列表中的索引

分页标签: 页,分页是必不可少的。

<!-- 文章正文 -->
{dede:field.body/}
<!-- 分页导航 -->
<ul class="pagelist">
    <li>{dede:pagelist listitem="info,index,end,pre,next,pageno" listsize="5"/}</li>
</ul>

{dede:pagelist} 的属性可以控制分页显示哪些部分(如首页、上一页、页码、下一页、末尾)。

条件判断标签

根据条件输出不同的内容,类似于 PHP 的 if...else

语法

{dede:if 条件}
    <!-- 条件成立时输出的内容 -->
    [field:typename function='(@me=="首页") ? "Home" : @me'/]
{else if 另一个条件}
    <!-- 另一个条件成立时输出的内容 -->
{else}
    <!-- 所有条件都不成立时输出的内容 -->
{/dede:if}

示例:根据栏目ID显示不同的前缀。

{dede:if typeid==1}
    <span class="label">新闻</span>
{else if typeid==2}
    <span class="label">产品</span>
{else}
    <span class="label">其他</span>
{/dede:if}

高级技巧

函数与修饰符

DedeCMS 标签支持使用函数对获取到的数据进行二次处理,这是其强大之处。

语法[field:字段名 function='自定义函数(@me)'/]

  • @me 是一个特殊变量,代表当前字段的原始值。

常用函数:

函数 说明 示例
cn_substr() 截取字符串,防止乱码 [field:title function='cn_substr(@me, 20)'/]
MyDate() 格式化时间戳 [field:pubdate function='MyDate('Y-m-d', @me)'/]
htmlspecialchars() 转义HTML特殊字符,防止XSS攻击 [field:title function='htmlspecialchars(@me)'/]
str_replace() 字符串替换 [field:title function='str_replace("DedeCMS", "织梦", @me)'/]
自定义函数 可以调用 /include/helpers/ 目录下的PHP文件 [field:title function='Uppercase(@me)'/] (需要创建 helpers/uppercase.helper.php)

php 标签的妙用

虽然前面提到 php 标签有风险,但在某些特定场景下非常有用,例如在列表页获取当前栏目的ID。

{dede:php}
    $typeid = $_GET['tid'];
    echo "当前栏目ID是: " . $typeid;
{/dede:php}

注意:务必确保你了解代码的安全性,不要让用户输入直接进入 php


实战案例:制作一个首页

假设我们要做一个包含“网站头条”、“最新文章”、“热门推荐”的首页。

  1. 创建模板文件index.htm
  2. 编写代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">{dede:global.cfg_webname/}</title>
    <meta name="description" content="{dede:global.cfg_description/}">
</head>
<body>
    <header>
        <h1>{dede:global.cfg_webname/}</h1>
        <!-- 可以用 {dede:include filename="head.htm"} 引入公共头部 -->
    </header>
    <main>
        <!-- 1. 网站头条 (调用单个文章) -->
        <section class="headline">
            {dede:arclist row='1' titlelen='50' typeid='1' orderby='click'}
                <h2><a href="[field:arcurl/]">[field:title/]</a></h2>
                <p class="summary">[field:description function='cn_substr(@me, 150)'/]</p>
            {/dede:arclist}
        </section>
        <!-- 2. 最新文章 (调用栏目ID为1和2的最新5篇文章) -->
        <section class="latest-news">
            <h3>最新文章</h3>
            <ul>
                {dede:arclist typeid='1,2' row='5' titlelen='30' orderby='pubdate'}
                    <li><span class="date">[field:pubdate function='MyDate('m-d', @me)'/]</span><a href="[field:arcurl/]">[field:title/]</a></li>
                {/dede:arclist}
            </ul>
        </section>
        <!-- 3. 热门推荐 (调用栏目ID为3的热门文章) -->
        <section class="hot-recommend">
            <h3>热门推荐</h3>
            <ul>
                {dede:arclist typeid='3' row='8' titlelen='25' orderby='click'}
                    <li><a href="[field:arcurl/]">[field:title/]</a></li>
                {dede:arclist}
            </ul>
        </section>
    </main>
    <footer>
        <p>Copyright &copy; {dede:global.cfg_webname/} - All Rights Reserved.</p>
        <!-- 可以用 {dede:include filename="footer.htm"} 引入公共底部 -->
    </footer>
</body>
</html>

总结与最佳实践

  1. 分离原则:模板只负责表现(HTML/CSS/JS),逻辑和数据交给 DedeCMS 标签和后台处理。
  2. 命名规范:模板文件和目录命名清晰,如 head.htm, footer.htm, list_article.htm
  3. 善用函数:充分利用 function 属性来格式化输出,使模板更简洁、安全。
  4. 模块化:使用 {dede:include} 标签将公共部分(如头部、底部、侧边栏)抽离出来,提高复用性和维护性。
  5. 性能考虑:DedeCMS 的静态化机制是其性能优势的核心,合理设置更新频率,确保静态页面能被正确生成。

掌握 DedeCMS 模板标签是进行二次开发和模板定制的基石,多看、多练、多思考,就能熟练运用这些标签构建出功能强大、性能优异的网站。

-- 展开阅读全文 --
头像
单片机跑马灯C程序如何实现?
« 上一篇 04-30
织梦如何添加分享按钮?
下一篇 » 04-30

相关文章

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