/include/taglib 中进行扩展,标签的文件名应该是:标签.lib.php ,例如 arclist 所对应的标签名称则为:arclist.lib.php 。 {dede:test name='dedecms'/} ,那就需要创建一个名为 test.lib.php 的文件。

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

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

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

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

    1. $attlist="name|"

    , 用来隔开各个属性,符号 | 用来分隔变量的名称和值,这里 name| 则代表默认参数 name 为空。 $name 就可以在函数中进行调用了,例如:

    1. function lib_test(&$ctag,&$refObj)
    2. {
    3. global $dsql,$envs;
    4. //属性处理
    5. $attlist="name|";
    6. FillAttsDefault($ctag->CAttribute->Items,$attlist);
    7. extract($ctag->CAttribute->Items, EXTR_SKIP);
    8. $revalue = '我的名字:'.$name;
    9. return $revalue;
    10. }

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

    arclist 、channel 等,我们来扩展下我们上面标签的功能:

    1. {dede:test name='dedecms'/}
    2. 我的名字叫:[field:name/]
    3. {dede:test}

    我的名字叫:[field:name/] 则为我们要处理的底层模板,[field:name/] 为我们标签属性中的 name 。 lib_test(&$ctag,&$refObj) 函数中 $ctag 参数,这个参数就是我们解析式模板引擎获取的当前标签内容,其中这个对象下有一个 GetInnerText() 方法能够获取当前标签的底层模板。

    1. <?php
    2. if(!defined('DEDEINC')) exit("Request Error!");
    3. function lib_test(&$ctag,&$refObj)
    4. {
    5. global $dsql,$envs;
    6. //属性处理
    7. $attlist="name|";
    8. FillAttsDefault($ctag->CAttribute->Items,$attlist);
    9. extract($ctag->CAttribute->Items, EXTR_SKIP);
    10. // 获取底层模板
    11. $innertext= $ctag->GetInnerText();
    12. // 对标签进行解析
    13. $revalue = str_replace("[field:name/]", $name, $innertext);
    14. return $revalue;
    15. }
    16. ?>

    这样我们就完成了一个简单的对底层模板解析的处理。 image-20220328221858319 /include/taglib 其他标签文件。