2.4 门户、DIY 与站点导航
门户(portal)是 Discuz! 里独立于论坛的一套「内容展示系统」——它用文章、频道、区块组织信息,而不是用帖子。把它想成给论坛配的编辑部:论坛是聊天的客厅,门户是门口的展示墙,把精华摆给访客第一眼看到。本文操作路径以 X5.0 默认后台为准,版本差异处以你的版本为准。
2.4.1 门户模块(portal)到底是什么
门户模块(英文 portal,X5 里对应 source/app/portal/ 与 template/default/portal/)是内置的内容聚合前台。论坛内容单位是「主题/帖子」,门户单位则是「文章」,且可脱离版块自由排版。
门户由三类东西组成:
| 组成 | 作用 | 数据表前缀 |
|---|---|---|
| 文章(article) | 单篇可编辑图文,支持分类、封面、专题 | pre_portal_article* |
| 频道(category) | 文章归类容器,可绑定为频道首页 | pre_portal_category |
| 区块(block) | DIY 里可调用的数据模块,拉取文章/帖子/会员等 | pre_portal_block* |
门户最实用的场景是做网站首页:把论坛热帖、精华用区块聚合,再用 DIY 排成版面。
2.4.2 用 DIY 拖拽搭首页与频道页
DIY(Discuz! 的「自定义版面」工具,开开发者模式后前台可拖拽)是搭首页的核心。它把页面切成「区域」,每个区域可拖入「框架」(框架=一个数据调用,如「最新文章」)。
标准路径:
- 后台 → 门户 → 模块管理,确认需要的「数据调用」已存在(没有就新建,数据源选「文章」或「主题」)。
- 后台 → 门户 → 门户首页开启 DIY,或前台首页点右上角「DIY」按钮进拖拽模式。
- 拖入框架、调排序与样式,保存即生效。
页面哪些位置允许拖拽,由模板里的 DIY 区域决定。典型区域长这样(尖括号必须转义,写成实体形式):
<!--[diy=diy1]--><div id="diy1" class="area"></div><!--[/diy]-->
把它放进 template/default/portal/index.htm(X5 默认门户首页)里,后台就能在 diy1 区域增删框架。改完模板务必「界面 → 更新缓存」,因为模板会先编译成 PHP 缓存到 data/cache/。
2.4.3 后台 DIY 区域与页面/模块组件
DIY 区域分区块级(一个框架位)和页面级(整页排版)。X5.0 新增「页面组件 / 模块组件导出」,把调好的版面打包成可复用零件:
| 类型 | 导出目录 | 预览图 |
|---|---|---|
| 页面组件(整页 DIY) | template/xxx/portal/diyxml/page/ |
同名 .jpg,80×60 |
| 模块组件(DIY 框架) | template/xxx/portal/diyxml/module/ |
同名 .jpg,80×60 |
导出后,其他站长装模板时能在任何模板下 DIY 一键导入。这就像装修把「电视墙方案」存成图纸,下次照着搭,省得从头量尺寸。
开启 DIY 的前提是开开发者模式,在 config/config_global.php 末尾加:
$_config['plugindeveloper'] = 1;
加了这行后台才出现「设计新模板」入口,前台 DIY 按钮才可用。要查全部预定义钩子,把值改成 2 再更新缓存,然后在前台源码里搜 <hook> 标记。
2.4.4 细胞模板 {cell} 与 {cells}
细胞模板是 X5 新特性,像「封装好的乐高小砖块」。普通模板片段谁都能改,细胞模板把含 PHP 逻辑的部分锁起来,只暴露给站长后台 DIY 组合。
{cell file}:最小封装单元,对应template/{标识}/cell/file.htm,支持多级目录,扩展名固定.htm。{cells file}:把多个{cell}再包一层,对应template/{标识}/cells/;.htm里可嵌套{cell},.php文件要写成 class(类名以你的版本为准)。
用法是在模板里直接引入,例如登录区显示第三方登录图标(系统内置示例):
<!-- 在登录模板里引入第三方登录图标 -->
{cells account/icons account/icons}
系统内置一批细胞模板,搜 template/default 里的 {cell 与 {cells 即可复用。门户聚合首页(后台「论坛 → 聚合首页」)也能配合细胞模板做后台 DIY。
2.4.5 站点导航:顶部、底部、快捷
导航是访客走路的指路牌。Discuz! 把导航拆成三类,配置入口不同:
| 导航类型 | 显示位置 | 配置入口 |
|---|---|---|
| 顶部导航 | 站点最上方横条 | 后台 → 界面 → 导航设置 → 顶部导航 |
| 底部导航 | 页脚一排链接 | 后台 → 界面 → 导航设置 → 底部导航 |
| 快捷导航 | 下拉/弹层快捷入口 | 后台 → 界面 → 导航设置 → 快捷导航 |
新增导航项时,类型选「论坛/门户/群组/家园/自定义链接」之一,填名称和 URL。指向门户频道就写 portal.php?mod=list&catid=1(catid 以你的频道为准)。
导航数据落在 pre_common_nav 系列表;插件同步导航时,记得在 CURSCRIPT 对应钩子里输出,手机版导航由 template/default/touch/ 模板单独渲染,不能只改 PC 模板。
2.4.6 门户与论坛的数据互通
门户和论坛不是孤岛。门户区块(block)可直接调用论坛数据,论坛也能把精华推到门户。互通靠两处:
- 门户「数据调用」选数据源「主题/帖子」,按版块、精华拉取,再在 DIY 框架展示,即「论坛热帖上首页」。
- 文章发布时关联论坛主题,或在版块把优质帖「推送到门户」。
代码读论坛数据走系统 API,不自己拼 SQL:
// 取某版块最新 10 个主题(表名以前缀函数获取,避免硬编码)
$tids = DB::fetch_all('SELECT tid, subject FROM %t WHERE fid=%d ORDER BY dateline DESC LIMIT 10',
array(DB::table('forum_thread'), 2));
DB::table('forum_thread') 自动补安装时设的表前缀(默认 pre_),换前缀不改代码。门户文章表同理用 DB::table('portal_article')。字段以官方《X5.0 开源版数据字典》为准(见 open.dismall.com)。
2.4.7 常见疑难与排查
- DIY 改了不生效:九成没清缓存。后台「界面 → 更新缓存」跑一遍,模板改动尤其要清。
- 前台看不到 DIY 按钮:确认
$_config['plugindeveloper'] = 1且你是管理员登录。 - 细胞模板不显示:检查路径是否落在
template/{标识}/cell/或cells/下,扩展名是否.htm(cell 强制.htm)。 - 手机版导航与电脑版不一致:手机版走
touch模板,要单独渲染导航,不能只改 PC 模板。
排障时重启 PHP 释放缓存(命令路径以你的环境为准):
# 释放 PHP 缓存,让模板与配置改动立即生效
systemctl restart php-fpm
门户、DIY、导航三块凑齐,一个「论坛聊内容、门户秀精华、导航指路」的站点骨架就立起来了。
