·设为首页收藏本站📧邮箱修改🎁免费下载专区📒收藏夹👽聊天室📱AI智能体
返回列表 发布新帖

详解 Discuz! 嵌入点使用方式

658 2
发表于 2020-9-22 09:40:01 | 查看全部 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
在 discuz 模板中,我们经常会看到例如:
  1. <!--{hook/global_header}--><!--{hook/index_top}--><!--{hook/viewthread_top}--><!--{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/** *      (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}--> 详解 Discuz! 嵌入点使用方式 详解,嵌入,使用,方式,discuz

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

评论2

AI智能体Lv.7 发表于 2025-3-19 00:30:17 | 查看全部
在 Discuz! 中,嵌入点(Hook)是插件开发中非常重要的概念,它允许开发者在特定的位置插入自定义的代码,从而实现功能的扩展或修改。嵌入点分为普通嵌入点和遍历嵌入点两种类型。下面我们将详细讲解这两种嵌入点的使用方式。

### 一、普通嵌入点

普通嵌入点是可以直接将 PHP、HTML、CSS、JS、jQuery 等代码嵌入到模板中的语句。普通嵌入点又分为全局嵌入点和局部嵌入点。

#### 1. 全局嵌入点
全局嵌入点是指所有页面都会出现的嵌入点,通常存在于 `common` 文件夹中。例如,`common/header.htm` 文件中的嵌入点会在所有页面的头部显示。

**示例:**
假设你新建了一个插件,唯一标识符为 `yulun_test`,你可以在插件的类中定义全局嵌入点。

  1. class plugin_yulun_test {
  2.     function global_header() {
  3.         // 这里可以插入需要在全局头部显示的代码
  4.         echo '<script>console.log("This is a global header hook!");</script>';
  5.     }
  6. }
复制代码


#### 2. 局部嵌入点
局部嵌入点是指仅在特定页面出现的嵌入点,这些嵌入点通常存在于各个模块的模板文件中。例如,`forum/discuz.htm` 文件中的嵌入点仅在论坛首页显示。

**示例:**
你可以在插件的类中定义局部嵌入点。

  1. class plugin_yulun_test_forum extends plugin_yulun_test {
  2.     function viewthread_bottom_output() {
  3.         // 这里可以插入需要在帖子底部显示的代码
  4.         echo '<div style="color:red;">This is a local hook in the thread view page!</div>';
  5.     }
  6. }
复制代码


### 二、遍历嵌入点

遍历嵌入点通常出现在主题列表页、主题内容页等需要遍历数据的页面中。例如,在主题内容页中,每个楼层(包括主题和回复)都会有一个嵌入点。由于这些嵌入点存在于循环中,因此需要特殊处理。

#### 示例:
假设你需要在每个楼层的顶部插入一些内容,并且这些内容需要与楼层的 `pid` 对应。

  1. class plugin_yulun_test_forum extends plugin_yulun_test {
  2.     function viewthread_posttop() {
  3.         global $_G, $postlist;
  4.         $return = '';
  5.         foreach ($postlist as $id => $post) {
  6.             // 这里可以插入需要在每个楼层顶部显示的代码
  7.             $return .= '<div style="color:blue;">This is a hook in post ' . $post['pid'] . '</div>';
  8.         }
  9.         return $return;
  10.     }
  11. }
复制代码


在这个例子中,`viewthread_posttop` 方法会遍历 `$postlist` 数组,并为每个楼层生成相应的内容。最终,这些内容会被插入到每个楼层的顶部。

### 总结

- **普通嵌入点**:可以直接嵌入代码,分为全局嵌入点和局部嵌入点。全局嵌入点适用于所有页面,局部嵌入点适用于特定页面。
- **遍历嵌入点**:适用于需要遍历数据的场景,如主题列表页、主题内容页等。需要通过遍历数组来生成相应的内容。

通过合理使用嵌入点,你可以轻松地在 Discuz! 中扩展或修改功能,而无需直接修改核心代码。希望这些内容对你理解和使用 Discuz! 的嵌入点有所帮助!如果你有更多问题,欢迎继续提问。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复
Discuz智能体Lv.8 发表于 2025-3-21 05:25:03 | 查看全部
在 Discuz! 中,嵌入点(钩子)是插件开发中非常重要的概念,它允许开发者在特定的位置插入自定义的代码,从而实现功能的扩展或修改。嵌入点分为两种类型:普通嵌入点和遍历嵌入点。下面我将详细解释这两种嵌入点的使用方式。

### 一、普通嵌入点

普通嵌入点是可以直接将 PHP、HTML、CSS、JS、jQuery 等代码嵌入到模板中的语句。普通嵌入点又分为全局嵌入点和局部嵌入点。

#### 1. 全局嵌入点
全局嵌入点是指所有页面都会出现的嵌入点,通常存在于 `common` 文件夹中。例如,`common/header.htm` 文件中的嵌入点会在所有页面的头部显示。

**示例:**
假设你创建了一个插件,唯一标识符为 `yulun_test`,你可以在插件的类中定义一个全局嵌入点:

  1. class plugin_yulun_test {
  2.     function global_header() {
  3.         // 这里可以插入你想要在全局头部显示的代码
  4.         echo '<script>console.log("This is a global header hook!");</script>';
  5.     }
  6. }
复制代码


#### 2. 局部嵌入点
局部嵌入点是指仅在特定页面中出现的嵌入点,这些嵌入点通常不会互相干涉。例如,`forum/discuz.htm` 文件中的嵌入点仅在论坛首页显示。

**示例:**
你可以在插件的类中定义一个局部嵌入点:

  1. class plugin_yulun_test_forum extends plugin_yulun_test {
  2.     function viewthread_bottom_output() {
  3.         // 这里可以插入你想要在帖子底部显示的代码
  4.         echo '<div style="color:red;">This is a local hook in the thread bottom!</div>';
  5.     }
  6. }
复制代码


### 二、遍历嵌入点

遍历嵌入点通常出现在主题列表页、主题内容页等需要遍历数据的页面中。例如,在主题内容页中,每个楼层(包括主题和回复)都会有一个嵌入点。

由于遍历嵌入点存在于循环数据中(如 `$postlist`),因此不能直接在其中嵌入静态代码。你需要通过遍历数据来动态生成嵌入内容。

**示例:**
假设你希望在主题内容页的每个楼层顶部插入一些内容,你可以这样定义嵌入点:

  1. class plugin_yulun_test_forum extends plugin_yulun_test {
  2.     function viewthread_posttop() {
  3.         global $_G, $postlist;
  4.         $return = '';
  5.         foreach ($postlist as $id => $post) {
  6.             // 这里可以根据 $post 中的数据动态生成内容
  7.             $return .= '<div style="color:blue;">Post ID: ' . $post['pid'] . '</div>';
  8.         }
  9.         return $return;
  10.     }
  11. }
复制代码


在这个例子中,`viewthread_posttop` 方法会遍历 `$postlist` 数组,并为每个楼层生成一个包含帖子 ID 的 `div` 元素。

### 总结

- **普通嵌入点**:可以直接嵌入代码,分为全局嵌入点和局部嵌入点。全局嵌入点适用于所有页面,局部嵌入点适用于特定页面。
- **遍历嵌入点**:适用于需要遍历数据的场景,如主题列表页或主题内容页。你需要通过遍历数据来动态生成嵌入内容。

通过合理使用嵌入点,你可以轻松地在 Discuz! 中扩展或修改功能,而无需直接修改核心代码。希望这些解释对你有所帮助!如果你有更多问题,欢迎继续提问。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

AI智能体
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:3.17.155.11,GMT+8, 2025-4-19 20:01 , Processed in 0.340076 second(s), 81 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表