找回密码
 立即注册

QQ登录

只需一步,快速开始

Dede织梦模板 DEDE模板介绍

0
回复
97
查看
[复制链接]
  • TA的每日心情
    擦汗
    2021-2-13 10:47
  • 签到天数: 1 天

    [LV.1]初来乍到

    3

    主题

    8

    帖子

    4

    银币

    新手上路

    Rank: 1

    银币
    4
    2021-2-13 17:18:30 显示全部楼层 |阅读模式
    dede 模板解析介绍

    crisis111 2015-04-25 09:39:40  2459  收藏 2
    分类专栏: dedecms
    本文,小瀚想和大家一起来学习一下DEDECMS中目前所使用的模板技术的原理:

    什么是编译式模板、解释式模板,它们的区别是什么?

    模板标签有哪些种类,它们的区别是什么,都应用在哪些场景?

    学习模板的机制原理对我们修复目前CMS中常出现的模板类代码执行的漏洞能起到怎样的帮助?

    带着这些问题,我们进入今天的代码研究,just hacking for fun!!

    文章主要分为以下几个部分

    1. 模板基本知识介绍
    2. 怎么使用模板机制、模板标签的使用方法
    3. DEDE模板原理学习
      1) 编译式模板
      2) 解释式模板
      3) 视图类模板
    4. 针对模板解析底层代码的Hook Patch对CMS漏洞修复的解决方案
    http://www.phpchina.com/archives/view-42534-1.html

    http://tools.dedecms.com/uploads/docs/dede_tpl/index.htm

    1. 模板基本知识介绍

    cms模板是以cms为程序架构,就是在对应CMS系统的基础上制作的各类CMS内容管理系统的样式,页面模板等。业内对于CMS模板的定义亦是通过对于CMS系统的标签调用语言,实现CMS系统的前端展示风格,就像与一个人的外衣。

    简单来说,模板技术就是将业务逻辑代码和前台的UI逻辑进行了有效分离,使CMS的UI呈现和代码能够最大程序的解耦和,和MVC中的View层和Control层的思想很类似

    系统的模板目录在系统根目录下的templets内,下面是模板目录的文件目录结构。

    /templets·········································································
    ├─default······································································ 默认模板目录
    │  ├─images································································ 模板图片目录
    │  │  ├─mood····························································
    │  │  └─photo····························································
    │  ├─js······································································ 模板JS脚本目录
    │  └─style··································································· 模板CSS样式目录
    ├─lurd········································································· LURD系统模板
    ├─plus········································································· 插件模板目录
    ├─system······································································ 系统底层模板目录
    └─wap········································································· WAP模块模板目录
      DedeCMS 从 V5 开始采用了解析式引擎与编译式引擎并存的模式,由于在生成 HTML 时,解析式引擎拥有巨大的优势,但对于动态浏览的互动性质的页面,编译式引擎更实用高效,织梦 CMS 采用双引擎并存的模式,事实上还有另一种模板的使用方法,即视图类,不过它是对解释式模板的代码复用而成的,我们接下来会注意学习它们

    2.  怎么使用模板机制、模板标签的使用方法

    在了解了模板的基本知识之后,我们接下来学习一下在DEDECMS中的模板机制、以及模板标签的使用方法

    总体来说,目前DEDECMS有以下三种模板机制

    1. 编译式模板
      1) 核心文件:
      include/dedetemplate.class.php
      /include/tpllib
      2) 标签使用方法
        2.1) 配置变量
        {dede:config name='' value=''/}
        配置变量可以在载入模板后通过 $tpl->GetConfig($name) 获得,仅作为配置,不在模板中显示。
        2.2) 短标记
        {dede:global.name/}   外部变量      等同于
        {dede:var.name/}      var数组       等同于 'name']; ?>
        {dede:field.name/}    field数组     等同于 'name']; ?>
        {dede:cfg.name/}      系统配置变量  等同于
        考虑到大多数情况下都会在函数或类中调用模板,因此 $_vars、$fields 数组必须声明为 global 数组,否则模板引擎无法获得它的值从而导致产生错误。
        2.3) 自由调用块标记
        {tag:blockname bind='GetArcList' bindtype='class'} 循环代码 {/tag:blockname}
        必要属性:
        bind       数据源来源函数
        bindtype   函数类型,默认是 class 可选为 sub
        rstype     返回结果类型,默认是 array ,可选项为 string
        自定义函数格式必须为 function(array $atts,object $refObj, array $fields);
        在没有指定 bind 绑定的函数的情况下,默认指向 MakePublicTag($atts,$tpl->refObj,$fields) 统一管理。
        2.4) 固定块标记
          2.4.1) datalist
          从绑定类成员函数GetArcList中获取数组并输出
          {dede:datalist} 循环代码 {/dede:datalist}
          遍历一个二给维数组,数据源是固定的,只适用用类调用。
          等同于
          {tag:blockname bind='GetArcList' bindtype='class' rstype='arrayu'} 循环代码 {/tag:blockname}
          2.4.2) label
          从绑定函数中获取字符串值并输出
          等同于 {tag:blockname bind='func' bindtype='sub' rstype='string'/}
          2.4.3) pagelist
          从绑定类成员函数GetPageList中获取字符串值并输出
          等同于 {tag:blockname bind='GetPageList' bindtype='class' rstype='string'/}
          2.4.4) include
          {dede:include file=''/}
          {dede:include filename=''/}
          2.4.5) php
          {dede:php php 代码 /}
          或
          {dede:php} php代码 {/dede:php}
          2.4.6) If
          仅支持 if ,else ,else 直接用{else}表示,但不支持{else if}这样的语法 ,一般建议模板中不要使用太复杂的条件语法,如果确实有需要,可以直接使用 php 语法。
          {dede:if 条件} a-block  {else} b-block {/dede:if}
          条件中允许使用 var.name 、global.name 、field.name、cfg.name 表示相应的变量。
          如:
          {dede:if field.id>10 }....{/dede:if}
          2.4.7) 遍历一个 array 数组
          {dede:array.name}
           {dede:key/} = {dede:value/}
          {/dede:array}
          各种语法的具体编译后的代码,可查看dedetemplate.class.php的function CompilerOneTag(&$cTag)


    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则