详解 Discuz! 嵌入点使用方式
在 discuz 模板中,我们经常会看到例如:这样的语句,我们把hook 开头结构的语句,统称为嵌入点(俗称“钩子”),以方便插件应用通过该嵌入点,嵌入相关代码。
而在这里,我们将嵌入点分为了两种类型。一种是可直接嵌入的普通嵌入点;一种是需要遍历的遍历嵌入点。
一,普通嵌入点
是可以直接将PHP、html、css、js、jQuery等语句嵌入到该嵌入点的语句。普通嵌入点与 discuz 的变量一样,又分为:全局嵌入点、局部嵌入点。
举例:当新建插件唯一标识符为:yulun_test 时:全局嵌入点需写在class plugin_yulun_test {}内局部嵌入点需写在class plugin_yulun_test_forum extends plugin_yulun_test{}内这样就可以把嵌入点内的部分嵌入到对应的嵌入点中了。
二,遍历嵌入点
这是一个比较特殊的存在,它往往出现在主题列表页、主题内容页这种 loop的数据中。比如在主题内容页中,包括一楼的主题以及往下的回复楼层中,都会出现一个 <!--{hook/viewthread_posttop $postcount}-->
如果直接在其中嵌入对应的比如pid,那么很明显是行不通的。这个时候,我们就需要换一种方式。
先来解析一下这个hook,它是存在于每一个楼层内,也就是说它是存在于 loop 的 $postlist 中,那么要想使得 pid 于楼层的pid对应,就需要先遍历一遍 $postlist,则
- <!--{hook/global_header}--><!--{hook/index_top}--><!--{hook/viewthread_top}--><!--{hook/viewthread_postfooter $postcount}-->
而在这里,我们将嵌入点分为了两种类型。一种是可直接嵌入的普通嵌入点;一种是需要遍历的遍历嵌入点。
一,普通嵌入点
是可以直接将PHP、html、css、js、jQuery等语句嵌入到该嵌入点的语句。普通嵌入点与 discuz 的变量一样,又分为:全局嵌入点、局部嵌入点。
- 全局嵌入点:所有页面都会出现的嵌入点,一般存在于 common文件夹中。如:common/header.htm 里出现的 <!--{hook/global_header}-->局部嵌入点:各个页面之间出现的嵌入点,这些嵌入点往往互不干涉。如:forum/discuz.htm 里出现的 <!--{hook/index_top}-->,仅在论坛首页显示
举例:当新建插件唯一标识符为:yulun_test 时:
- <?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 { 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,则
- function viewthread_posttop(){ global $_G,$postlist; foreach ($postlist as $id=>$post){ $return[] = $post['pid']; } return $return;}