去评论
dz插件网

详解 Discuz! 嵌入点使用方式

admin
2020/09/22 09:40:01
在 discuz 模板中,我们经常会看到例如:
  1. <!--{hook/global_header}--><!--{hook/index_top}--><!--{hook/viewthread_top}--><!--{hook/viewthread_postfooter $postcount}-->
这样的语句,我们把hook 开头结构的语句,统称为嵌入点(俗称“钩子”),以方便插件应用通过该嵌入点,嵌入相关代码。

而在这里,我们将嵌入点分为了两种类型。一种是可直接嵌入的普通嵌入点;一种是需要遍历的遍历嵌入点。

一,普通嵌入点
    是可以直接将PHP、html、css、js、jQuery等语句嵌入到该嵌入点的语句。普通嵌入点与 discuz 的变量一样,又分为:全局嵌入点、局部嵌入点。

举例:当新建插件唯一标识符为:yulun_test 时:
  1. <?php/** *      (C)2010-2011 New PHP Support Forum *      This is NOT a freeware, use is subject to license terms * *      $Id: *****.class.php 2018-03-08 上官雨伦 $ */if(!defined('IN_DISCUZ')) {        exit('Access Denied');}class plugin_yulun_test {}class plugin_yulun_test_forum extends plugin_yulun_test {}?>
全局嵌入点需写在class plugin_yulun_test {}内局部嵌入点需写在class plugin_yulun_test_forum extends plugin_yulun_test{}内
  1. class plugin_yulun_test {        function global_header(){                        }}class plugin_yulun_test_forum extends plugin_yulun_test {        function viewthread_bottom_output(){                        }}
这样就可以把嵌入点内的部分嵌入到对应的嵌入点中了。


二,遍历嵌入点
    这是一个比较特殊的存在,它往往出现在主题列表页、主题内容页这种 loop的数据中。比如在主题内容页中,包括一楼的主题以及往下的回复楼层中,都会出现一个 <!--{hook/viewthread_posttop $postcount}-->

如果直接在其中嵌入对应的比如pid,那么很明显是行不通的。这个时候,我们就需要换一种方式。
先来解析一下这个hook,它是存在于每一个楼层内,也就是说它是存在于 loop 的 $postlist 中,那么要想使得 pid 于楼层的pid对应,就需要先遍历一遍 $postlist,则
  1. function viewthread_posttop(){        global $_G,$postlist;        foreach ($postlist as $id=>$post){                $return[] = $post['pid'];        }        return $return;}