欢迎使用QQ帐号登录 雨伦博客
详解 Discuz! 嵌入点使用方式
上官雨伦

发表于 2020-09-20 19:08

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

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

一,普通嵌入点
    是可以直接将PHP、html、css、js、jQuery等语句嵌入到该嵌入点的语句。普通嵌入点与 discuz 的变量一样,又分为:全局嵌入点、局部嵌入点。
  • 全局嵌入点:所有页面都会出现的嵌入点,一般存在于 common文件夹中。如:common/header.htm 里出现的 <!--{hook/global_header}-->
  • 局部嵌入点:各个页面之间出现的嵌入点,这些嵌入点往往互不干涉。如:forum/discuz.htm 里出现的 <!--{hook/index_top}-->,仅在论坛首页显示

举例:当新建插件唯一标识符为:yulun_test 时:
  1. <?php
  2. /**
  3. *      (C)2010-2011 New PHP Support Forum
  4. *      This is NOT a freeware, use is subject to license terms
  5. *
  6. *      $Id: *****.class.php 2018-03-08 上官雨伦 $
  7. */

  8. if(!defined('IN_DISCUZ')) {
  9.         exit('Access Denied');
  10. }

  11. class plugin_yulun_test {

  12. }

  13. class plugin_yulun_test_forum extends plugin_yulun_test {

  14. }
  15. ?>
复制代码
全局嵌入点需写在class plugin_yulun_test {}内
局部嵌入点需写在class plugin_yulun_test_forum extends plugin_yulun_test{}内
  1. class plugin_yulun_test {
  2.         function global_header(){

  3.         }
  4. }

  5. class plugin_yulun_test_forum extends plugin_yulun_test {
  6.         function viewthread_bottom_output(){

  7.         }
  8. }
复制代码
这样就可以把嵌入点内的部分嵌入到对应的嵌入点中了。


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

如果直接在其中嵌入对应的比如pid,那么很明显是行不通的。这个时候,我们就需要换一种方式。
先来解析一下这个hook,它是存在于每一个楼层内,也就是说它是存在于 loop 的 $postlist 中,那么要想使得 pid 于楼层的pid对应,就需要先遍历一遍 $postlist,则
  1. function viewthread_posttop(){
  2.         global $_G,$postlist;
  3.         foreach ($postlist as $id=>$post){
  4.                 $return[] = $post['pid'];
  5.         }
  6.         return $return;
  7. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

回帖后跳转到最后一页

当前话题还没有评论,来做第一个评论的人吧