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! 的「自定义版面」工具,开开发者模式后前台可拖拽)是搭首页的核心。它把页面切成「区域」,每个区域可拖入「框架」(框架=一个数据调用,如「最新文章」)。

标准路径:

  1. 后台 → 门户 → 模块管理,确认需要的「数据调用」已存在(没有就新建,数据源选「文章」或「主题」)。
  2. 后台 → 门户 → 门户首页开启 DIY,或前台首页点右上角「DIY」按钮进拖拽模式。
  3. 拖入框架、调排序与样式,保存即生效。

页面哪些位置允许拖拽,由模板里的 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)可直接调用论坛数据,论坛也能把精华推到门户。互通靠两处:

  1. 门户「数据调用」选数据源「主题/帖子」,按版块、精华拉取,再在 DIY 框架展示,即「论坛热帖上首页」。
  2. 文章发布时关联论坛主题,或在版块把优质帖「推送到门户」。

代码读论坛数据走系统 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、导航三块凑齐,一个「论坛聊内容、门户秀精华、导航指路」的站点骨架就立起来了。