DedeCMS标签扩展

织梦教程 0 来源:老K模板网 收藏

定义标签​

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

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

标签文件内容结构​

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

<button title="Copy Code" class="copy" style="touch-action: manipulation; border: 1px solid var(--vp-code-copy-code-border-color); padding: 0px; background-image: var(--vp-icon-copy); direction: ltr; position: absolute; top: 12px; right: 12px; z-index: 3; border-radius: 4px; width: 40px; height: 40px; opacity: 0; background-position: 50% center; background-size: 20px; background-repeat: no-repeat; transition: border-color 0.25s, background-color 0.25s, opacity 0.25s;"></button>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 为空,则需要更改为:

<button title="Copy Code" class="copy" style="touch-action: manipulation; border: 1px solid var(--vp-code-copy-code-border-color); padding: 0px; background-image: var(--vp-icon-copy); direction: ltr; position: absolute; top: 12px; right: 12px; z-index: 3; border-radius: 4px; width: 40px; height: 40px; opacity: 0; background-position: 50% center; background-size: 20px; background-repeat: no-repeat; transition: border-color 0.25s, background-color 0.25s, opacity 0.25s;"></button>php
$attlist="name|"

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

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

<button title="Copy Code" class="copy" style="touch-action: manipulation; border: 1px solid var(--vp-code-copy-code-border-color); padding: 0px; background-image: var(--vp-icon-copy); direction: ltr; position: absolute; top: 12px; right: 12px; z-index: 3; border-radius: 4px; width: 40px; height: 40px; opacity: 0; background-position: 50% center; background-size: 20px; background-repeat: no-repeat; transition: border-color 0.25s, background-color 0.25s, opacity 0.25s;"></button>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

底层模板处理​

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

<button title="Copy Code" class="copy" style="touch-action: manipulation; border: 1px solid var(--vp-code-copy-code-border-color); padding: 0px; background-image: var(--vp-icon-copy); direction: ltr; position: absolute; top: 12px; right: 12px; z-index: 3; border-radius: 4px; width: 40px; height: 40px; opacity: 0; background-position: 50% center; background-size: 20px; background-repeat: no-repeat; transition: border-color 0.25s, background-color 0.25s, opacity 0.25s;"></button>html
{dede:test  name='dedecms'/}
 我的名字叫:[field:name/]
{dede:test}

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

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

<button title="Copy Code" class="copy" style="touch-action: manipulation; border: 1px solid var(--vp-code-copy-code-border-color); padding: 0px; background-image: var(--vp-icon-copy); direction: ltr; position: absolute; top: 12px; right: 12px; z-index: 3; border-radius: 4px; width: 40px; height: 40px; opacity: 0; background-position: 50% center; background-size: 20px; background-repeat: no-repeat; transition: border-color 0.25s, background-color 0.25s, opacity 0.25s;"></button>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 其他标签文件。


免责声明:1.凡本站注明“来源:XXX(非老K模板网)”的作品,均转载自其它媒体,所载的文章、图片、音频视频文件等资料的版权归版权所有人所有,如有侵权,请联系laokcms#126.com处理;2.凡本站转载内容仅代表作者本人观点,与老K模板网无关。
0 条评论

网友留言