Skip to content
快速导航

DedeCMS标签扩展

定义标签

在解析式模板引擎中我们需要定义全局标签,在上面的文档说明中已经知道在系统根目录下 /include/taglib 中进行扩展,标签的文件名应该是:标签.lib.php ,例如 arclist 所对应的标签名称则为:arclist.lib.php

我们创建一个测试的标签 {dede:test name='dedecms'/} ,那就需要创建一个名为 test.lib.php 的文件。

标签文件内容结构

标签内容的文件结构如下,为一个函数

php
<?php
if(!defined('DEDEINC')) exit("Request Error!");
function lib_test(&$ctag,&$refObj)
{
    global $dsql,$envs;
    //属性处理
    $attlist="row|12,titlelen|24";
    FillAttsDefault($ctag->CAttribute->Items,$attlist);
    extract($ctag->CAttribute->Items, EXTR_SKIP);
    $revalue = '';
    //你需编写的代码,不能用echo之类语法,把最终返回值传给$revalue
    //------------------------------------------------------
    $revalue = 'Hello Word!';
    //------------------------------------------------------
    return $revalue;
}
?>

这里 function lib_test(&$ctag,&$refObj) 就是我们标签的扩展函数,所有标签生成的内容都是由这个函数解析后获得的。

属性处理

函数中 $attlist="row|12,titlelen|24" 为系统默认属性的参数,例如我们上面 test 标签需要一个默认的属性 name ,并且 name 为空,则需要更改为:

php
$attlist="name|"

这里符号 , 用来隔开各个属性,符号 | 用来分隔变量的名称和值,这里 name| 则代表默认参数 name 为空。

我们在使用参数的时候,直接使用 $name 就可以在函数中进行调用了,例如:

php
function  lib_test(&$ctag,&$refObj)
{
	global  $dsql,$envs;
	//属性处理
	$attlist="name|";
	FillAttsDefault($ctag->CAttribute->Items,$attlist);
	extract($ctag->CAttribute->Items, EXTR_SKIP);
	$revalue =  '我的名字:'.$name;
	return  $revalue;
}

我们在系统后台标签测试器中进行测试:

image-20220328220918108

底层模板处理

一般的标签会涉及到底层模板,例如:arclistchannel 等,我们来扩展下我们上面标签的功能:

html
{dede:test  name='dedecms'/}
	我的名字叫:[field:name/]
{dede:test}

这里 我的名字叫:[field:name/] 则为我们要处理的底层模板,[field:name/] 为我们标签属性中的 name

这里我们需要了解 lib_test(&$ctag,&$refObj) 函数中 $ctag 参数,这个参数就是我们解析式模板引擎获取的当前标签内容,其中这个对象下有一个 GetInnerText() 方法能够获取当前标签的底层模板。

php
<?php
if(!defined('DEDEINC'))  exit("Request Error!");

function  lib_test(&$ctag,&$refObj)
{
	global  $dsql,$envs;
	//属性处理
	$attlist="name|";
	FillAttsDefault($ctag->CAttribute->Items,$attlist);
	extract($ctag->CAttribute->Items, EXTR_SKIP);
	// 获取底层模板
	$innertext=  $ctag->GetInnerText();
	// 对标签进行解析
	$revalue =  str_replace("[field:name/]", $name, $innertext);
	return  $revalue;
}
?>

这样我们就完成了一个简单的对底层模板解析的处理。

image-20220328221858319

标签其他一些开发技巧可参考 /include/taglib 其他标签文件。