织梦自定义标签如何创建与调用?

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

目录

  1. 第一步:理解织梦标签的运行机制
  2. 第二步:制作一个简单的自定义标签(入门级)
    • 场景:获取网站名称
    • 步骤详解
  3. 第三步:制作一个带参数的自定义标签(进阶级)
    • 场景:获取指定分类下的文章列表
    • 步骤详解
  4. 第四步:制作一个更复杂的SQL查询标签(高级级)
    • 场景:获取指定时间范围内的热门文章
    • 步骤详解
  5. 第五步:标签的调用与管理
    • 在模板中如何调用
    • 如何管理和查看已添加的标签
  6. 常见问题与注意事项

第一步:理解织梦标签的运行机制

在开始制作之前,你需要明白织梦标签是如何工作的:

织梦添加自定义标签
(图片来源网络,侵删)
  1. 触发:当织梦解析模板文件(.htm)时,遇到一个 {dede:标签名 /}{dede:标签名}...{/dede:标签名} 这样的结构。
  2. 解析:织梦系统会根据标签名,去一个固定的目录下寻找对应的PHP处理文件。
  3. 执行:找到并执行这个PHP文件,这个PHP文件负责从数据库中获取数据,或者进行其他业务逻辑处理。
  4. 返回:PHP文件处理完毕后,将处理结果(通常是HTML代码字符串)返回给模板解析引擎。
  5. 替换:模板引擎将原始的标签(如 {dede:mytag /})替换为返回的HTML代码。

核心文件位置: 织梦的自定义标签处理文件统一存放在 /include/taglib/ 目录下,这个目录是关键,你所有的自定义标签PHP文件都必须放在这里。


第二步:制作一个简单的自定义标签(入门级)

假设我们要创建一个标签 {dede:mywebname /},它的功能是直接输出网站的全局名称。

场景:获取网站名称

步骤详解:

  1. 创建标签处理文件

    • /include/taglib/ 目录下,新建一个名为 mywebname.lib.php 的文件。
    • 文件名规则:标签名.lib.php,我们的标签名是 mywebname,所以文件名就是 mywebname.lib.php
  2. 编写PHP代码

    织梦添加自定义标签
    (图片来源网络,侵删)
    • 打开 mywebname.lib.php 文件,输入以下代码:
    <?php
    if (!defined('DEDEINC')) {
        exit('Request Error!');
    }
    // function标签的固定写法,标签名就是文件名
    function lib_mywebname(&$ctag, &$refObj)
    {
        // 获取网站配置信息中的站点名称
        $site_name = $GLOBALS['cfg_webname'];
        // 返回需要替换到模板中的内容
        return $site_name;
    }
    ?>
    • 代码解析
      • if (!defined('DEDEINC')) exit('Request Error!');:这是织梦文件的标准开头,用于安全检查,防止直接访问。
      • function lib_mywebname(&$ctag, &$refObj):这是自定义标签的固定函数格式,函数名必须是 lib_ + 你的标签名。
        • $ctag:标签本身的对象,可以从中获取标签的属性。
        • $refObj:引用对象,通常用于获取当前环境的信息(如当前栏目ID等)。
      • $GLOBALS['cfg_webname']:这是织梦的全局变量,存储了网站后台设置的“网站名称”。
      • return $site_name;:函数必须返回一个字符串,这个字符串就是模板中标签位置将被替换成的最终内容。
  3. 在模板中使用标签

    • 打开任意一个模板文件(index.htm),在需要显示网站名称的地方,使用你刚刚创建的标签:
      <h1>欢迎来到 {dede:mywebname /} !</h1>
  4. 生成并查看效果

    • 在织梦后台,点击“生成” -> “更新主页”,或者直接更新包含此标签的页面。
    • 打开生成的HTML文件,你会看到 <h1>欢迎来到 我的织梦网站 !</h1>我的织梦网站 就是你的网站名称。

第三步:制作一个带参数的自定义标签(进阶级)

大多数时候,我们需要标签能根据传入的参数动态变化,下面我们制作一个标签,用于获取指定分类下的文章列表。

场景:获取指定分类下的文章列表

步骤详解:

  1. 创建标签处理文件

    织梦添加自定义标签
    (图片来源网络,侵删)
    • /include/taglib/ 目录下,新建一个名为 myarclist.lib.php 的文件。
  2. 编写PHP代码

    • 打开 myarclist.lib.php 文件,输入以下代码:
    <?php
    if (!defined('DEDEINC')) {
        exit('Request Error!');
    }
    function lib_myarclist(&$ctag, &$refObj)
    {
        // 1. 初始化数组,用于存放查询条件和最终数据
        $attlist = 'typeid|0,row|10,titlelen|30';
        $ctp = new DedeTagParse();
        $ctp->SetRefObj($refObj);
        $ctp->SetNameSpace('field', '[', ']');
        $atts = DedeAttributeParse($ctag->GetAtt(), $attlist);
        $typeid = $atts['typeid']; // 获取typeid属性
        $row = $atts['row'];       // 获取row属性
        $titlelen = $atts['titlelen']; // 获取titlelen属性
        // 2. 构建SQL查询语句
        $sql = "SELECT id, title, pubdate FROM dede_archives WHERE typeid='$typeid' ORDER BY id DESC LIMIT 0, $row";
        // 3. 执行查询并处理数据
        $dsql = new DedeSql(false);
        $dsql->SetQuery($sql);
        $dsql->Execute('me');
        $artlist = '';
        while ($row = $dsql->GetArray('me')) {
            $title_cn = cn_substr($row['title'], $titlelen); // 截取标题
            $pubdate = MyDate('Y-m-d', $row['pubdate']); // 格式化日期
            $artlist .= "<li><a href='/view.php?aid={$row['id']}'>{$title_cn}</a> ({$pubdate})</li>\n";
        }
        $dsql->Close();
        // 4. 返回结果
        return $artlist;
    }
    ?>
    • 代码解析
      • $attlist = 'typeid|0,row|10,titlelen|30';:定义标签允许的属性及其默认值,格式为 属性名|默认值,多个属性用 分隔。
      • $atts = DedeAttributeParse(...):这是织梦内置的函数,用于解析标签的属性,并将其与 $attlist 中定义的属性进行匹配,返回一个包含所有属性值的数组。
      • $typeid = $atts['typeid'];:从解析后的数组中获取 typeid 属性的值。
      • SQL查询:根据传入的 typeidrow 等参数,构建查询语句,从 dede_archives 表中获取文章数据。
      • 循环处理:遍历查询结果,使用 cn_substr 截取标题,MyDate 格式化日期,并拼接成HTML列表字符串。
      • return $artlist;:返回最终的HTML列表。
  3. 在模板中使用标签

    • 假设我们要获取ID为 2 的分类下的5篇文章,标题长度为20个字符。
      <h2>最新文章</h2>
      <ul>
      {dede:myarclist typeid='2' row='5' titlelen='20'}
      {/dede:myarclist}
      </ul>
  4. 生成并查看效果

    • 生成页面后,模板中的 {dede:myarclist...} 部分会被替换成一个包含5篇文章列表的 <ul>

第四步:制作一个更复杂的SQL查询标签(高级级)

这个例子将展示如何使用更复杂的SQL和织梦的其他功能。

场景:获取指定时间范围内的热门文章(按点击量排序)

步骤详解:

  1. 创建标签处理文件

    • /include/taglib/ 目录下,新建一个名为 hotbytime.lib.php 的文件。
  2. 编写PHP代码

    • 打开 hotbytime.lib.php 文件,输入以下代码:
    <?php
    if (!defined('DEDEINC')) {
        exit('Request Error!');
    }
    function lib_hotbytime(&$ctag, &$refObj)
    {
        // 定义属性:开始日期、结束日期、显示数量
        $attlist = 'startdate|0,enddate|0,row|10';
        $atts = DedeAttributeParse($ctag->GetAtt(), $attlist);
        $startdate = $atts['startdate'];
        $enddate = $atts['enddate'];
        $row = $atts['row'];
        // 构建SQL,注意日期格式的处理
        $where = " WHERE 1=1 ";
        if (!empty($startdate)) {
            $where .= " AND pubdate >= '".GetMkTime($startdate)."'";
        }
        if (!empty($enddate)) {
            $where .= " AND pubdate <= '".GetMkTime($enddate)."'";
        }
        $sql = "SELECT id, title, click FROM dede_archives {$where} ORDER BY click DESC LIMIT 0, {$row}";
        $dsql = new DedeSql(false);
        $dsql->SetQuery($sql);
        $dsql->Execute('me');
        $hotlist = '';
        while ($row = $dsql->GetArray('me')) {
            $hotlist .= "<li><a href='/view.php?aid={$row['id']}'>{$row['title']}</a> (点击:{$row['click']})</li>\n";
        }
        $dsql->Close();
        return $hotlist;
    }
    ?>
    • 代码解析
      • GetMkTime($startdate):织梦内置函数,将 YYYY-MM-DD 格式的字符串转换成Unix时间戳,用于SQL查询。
      • $where 条件拼接:根据是否传入了开始和结束日期,动态构建SQL的 WHERE 子句。
      • ORDER BY click DESC:按点击量降序排序,实现“热门”效果。
  3. 在模板中使用标签

    • 获取2025年1月1日到2025年1月31日的热门文章,显示10条。
      <h2>本月热门文章</h2>
      <ul>
      {dede:hotbytime startdate='2025-01-01' enddate='2025-01-31' row='10'}
      {/dede:hotbytime}
      </ul>

第五步:标签的调用与管理

在模板中如何调用

  • 对标签{dede:mytag /}
  • 对标签:标签体内容通常作为默认内容,当标签返回空时显示。
    {dede:myarclist typeid='2'}
      暂无文章
    {/dede:myarclist}

如何管理和查看已添加的标签

织梦后台提供了一个“自定义标签”管理界面,方便你查看和管理。

  1. 登录织梦后台。
  2. 在左侧菜单中找到 “核心” -> “自定义标签”
  3. 你可以看到所有系统内置的标签和你自己创建的标签。
  4. 你可以在这里测试标签的输出,查看标签的参数说明,这对于调试非常有用。

第六步:常见问题与注意事项

  1. 文件名和函数名必须匹配mytag.lib.php 文件对应的函数名必须是 lib_mytag,大小写也要注意。
  2. 安全第一:永远不要直接将用户输入的参数拼接到SQL中,除非你做了严格的过滤或使用了参数化查询,上面的例子中,typeid 是管理员在模板中设定的,相对安全,如果接受用户输入,请务必使用 $dsql->SetQuery("SELECT ... WHERE field = '{$value}'"); 这种方式让织梦的数据库类进行简单处理,或者更推荐使用 $dsql->Execute('me', "SELECT ... WHERE field = ?", array($value));
  3. 性能问题:避免在自定义标签中进行非常耗时的数据库查询或循环操作,标签会被频繁调用,性能差的标签会严重影响网站速度。
  4. 缓存问题:织梦有页面缓存机制,如果你的自定义标签数据需要实时更新,记得在生成页面时勾选“不生成静态HTML”或者使用“动态浏览”模式。
  5. 调试技巧:如果标签没有输出,最简单的调试方法是在函数中 echo "test"; exit;,看看页面是否能输出 "test",如果能,说明函数被调用了,问题出在返回值上,如果连 "test" 都没有,说明函数根本没有被调用,检查文件名和函数名。

通过以上步骤,你就可以在织梦CMS中自由地创建和使用自定义标签了,这将让你的模板开发能力得到质的飞跃。

-- 展开阅读全文 --
头像
dede专题列表分页如何实现?
« 上一篇 04-21
dede如何获取当前时间?
下一篇 » 04-21

相关文章

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