- 核心概念:门户、栏目、文章
- 模板文件结构与存放位置
- 主要模板文件详解
- 常用模板标签与函数
- 自定义模板的完整流程(实战示例)
- 常用资源与注意事项
核心概念:门户、栏目、文章
在开始修改模板前,必须先理解 Discuz! X3 门户的三个核心元素:

(图片来源网络,侵删)
- 门户: 指的是整个内容聚合展示系统,你的网站首页就是一个典型的“门户”页面。
- 栏目: 门户内容的分类,你可以创建“网站公告”、“技术分享”、“最新动态”等栏目,每个栏目都有独立的设置,包括:
- 允许发布的模型类型:文章、话题、图片等。
- 模板:可以为每个栏目指定一个独立的显示模板。
- 页显示方式。
- 文章: 门户上展示的具体内容,这些文章可以在后台“内容” -> “门户”中创建和发布,发布时,你需要选择它属于哪个栏目。
关系: 栏目 是内容的容器,文章 是内容本身。门户 页面通过调用不同 栏目 来聚合展示这些 文章。
模板文件结构与存放位置
Discuz! X3 的模板系统采用了主题包的形式,所有与界面相关的文件都存放在主题目录下。
- 主题目录位置:
/static/目录下,通常会有一个名为default的文件夹,这是默认主题,你也可以在这里创建自己的主题文件夹,mytheme。 - 门户相关文件位置:
/static/你的主题目录/portal/
在 portal 目录下,你会看到以下关键文件:
portal.htm: 最重要的文件! 这是门户首页的模板文件,你看到的大部分首页布局和样式都在这里定义。list_*.htm: 单个栏目的列表页模板。 是该栏目在数据库中的 ID。list_1.htm是 ID 为 1 的栏目的列表页。view.htm: 门户文章的内容详情页模板,当用户点击一篇文章标题进入详情页时,就是调用这个模板。category_*.htm: 栏目的封面页模板,如果你的栏目设置了封面页,就会调用这个模板。block_*.htm: 各种功能块的模板,热门文章推荐、最新评论等,每个功能块都可能对应一个block_文件。
主要模板文件详解
portal.htm - 门户首页模板
这是你工作的核心文件,打开它,你会发现它主要由三部分组成:

(图片来源网络,侵删)
- HTML 结构: 使用标准的 HTML 代码,定义了页面的
<head>、<body>、<header>、<footer>等结构。 - Discuz! 模板标签: 以 包围的代码,用于动态调用数据,
{loop $catlist $cat}会循环输出所有栏目。 - 区块调用: 这是最关键的部分,首页通常被划分为多个区块,每个区块显示一个或多个栏目的内容。
一个典型的 portal.htm 结构示例:
<!-- ... 头部 ... -->
<div id="pt" class="bm cl">
<div class="z">
<a href="./" class="nvhm" title="{lang homepage}">$_G[setting][sitename]</a><em>›</em>
<a href="portal.php">{lang portal}</a>
</div>
</div>
<div id="ct" class="ct2_a wp cl">
<div class="mn">
<!-- 左侧主要内容区 -->
<div class="bm bw0">
<!-- 这里是区块1,通常用于显示一个指定的大栏目 -->
{template block/portal_block_1}
</div>
<div class="bm bw0">
<!-- 这里是区块2,可能是一个两栏布局,显示两个小栏目 -->
<div class="cl">
<div class="z xw1">
{template block/portal_block_2}
</div>
<div class="y xw1">
{template block/portal_block_3}
</div>
</div>
</div>
<!-- 更多区块... -->
</div>
<div class="sd">
<!-- 右侧边栏 -->
{template block/portal_block_4}
{template block/portal_block_5}
</div>
</div>
<!-- ... 底部 ... -->
解读:
{template block/portal_block_1}是一个区块调用,它告诉 Discuz! 去加载/static/你的主题目录/portal/block/portal_block_1.htm这个文件的内容。- 你可以在后台“门户” -> “页面管理” -> “首页”中,可视化地设置每个区块显示哪个栏目、显示多少条内容、排序方式等,你设置的这些参数会传递给对应的
block_*.htm模板文件。
常用模板标签与函数
在修改 portal.htm 或 block_*.htm 时,你会用到大量的模板标签。
循环输出栏目 (catlist)
这是在首页布局中放置栏目的最常用方法。

(图片来源网络,侵删)
{loop $catlist $cat}
<!-- $cat 是一个栏目数组,包含栏目的各种信息 -->
<div class="portal_block">
<h2><a href="{$cat[caturl]}">{$cat[catname]}</a></h2>
<!-- 调用该栏目的文章列表 -->
{loop $cat['articles'] $article}
<div class="article_item">
<h3><a href="{$article[url]}">{$article[title]}</a></h3>
<p class="summary">{$article[summary]}</p>
<div class="info">
<span class="author">作者:{$article[author]}</span>
<span class="date">{$article[dateline]}</span>
</div>
</div>
{/loop}
<a href="{$cat[caturl]}" class="more">查看更多 »</a>
</div>
{/loop}
常用 $cat 数组键值:
$cat[catid]: 栏目 ID$cat[catname]: 栏目名称$cat[caturl]: 栏目链接$cat[articles]: 该栏目下的文章数组(需要在前台设置中开启)
循环输出文章 (article)
在 block_*.htm 文件中,你通常会看到这样的循环。
{loop $articles $article}
<li>
<span class="ico">{if $article[isrecommend]}<em class="p">荐</em>{/if}</span>
<a href="{$article[url]}" target="_blank" title="{$article[title]}">{if $article[thumb]}<img src="{$article[thumb]}" width="80" height="60" />{/if}{$article[title]}</a>
</li>
{/loop}
常用 $article 数组键值:
$article[aid]: 文章 ID$article[title]: 文章标题$article[url]: 文章链接$article[summary]: 文章摘要$article[thumb]: 文章封面图$author[author]: 作者$article[dateline]: 发布时间 (时间戳)$article[viewnum]: 浏览次数$article[commentnum]: 评论数
其他常用标签
{lang xxx}: 调用语言包。{lang portal}会显示“门户”二字。$_G[setting][sitename]: 网站名称。$_G[member][username]: 当前登录用户名。{date 格式}: 显示当前时间。{date Y-m-d H:i:s}。
自定义模板的完整流程(实战示例)
假设你想在首页添加一个新的区块,用来展示“最新公告”。
步骤 1:后台设置
-
创建栏目:
- 进入后台 ->
分类->添加分类。 - 名称填入“最新公告”。
- 模型选择“文章”。
- 提交后记下它的 栏目 ID(假设是
5)。
- 进入后台 ->
-
发布文章:
- 进入后台 ->
文章,发布几篇属于“最新公告”栏目的文章。
- 进入后台 ->
-
首页区块设置:
- 进入后台
门户->页面管理->首页。 - 在页面布局下方,点击“添加模块”。
- 选择“指定栏目模块”。
- 在右侧设置中,选择“最新公告”栏目,设置显示数量(如 5 条),排序方式(如发布时间倒序)。
- 保存,后台已经为你生成了一个调用这个栏目的区块。
- 进入后台
步骤 2:修改模板
-
找到区块文件:
- 假设后台自动分配给你的区块是
portal_block_6。 - 通过 FTP 或文件管理器,打开
/static/你的主题目录/portal/block/portal_block_6.htm。
- 假设后台自动分配给你的区块是
-
编辑
portal_block_6.htm:- 可能比较简单,你可以用下面的代码替换它,让它看起来更美观。
<!-- portal_block_6.htm --> <div class="bm"> <div class="bm_h cl"> <h2>最新公告</h2> </div> <div class="bm_c"> <ul class="xl xl1"> {loop $articles $article} <li> <span class="num">{$article[dateline]}</span> <a href="{$article[url]}" target="_blank" title="{$article[title]}">{$article[title]}</a> </li> {/loop} </ul> </div> </div> -
在首页布局中调用:
- 打开
/static/你的主题目录/portal/portal.htm。 - 在你希望显示“最新公告”的位置(比如右侧边栏),添加一行代码:
{template block/portal_block_6}
- 打开
-
添加 CSS 样式(可选):
- 为了让新区块更好看,你可以在主题的 CSS 文件(通常是
/static/你的主题目录/style/common.css)中添加一些样式。 /* 最新公告样式 */ .xl1 li { padding: 8px 0; border-bottom: 1px dashed #eee; } .xl1 .num { float: right; color: #999; font-size: 12px; }
- 为了让新区块更好看,你可以在主题的 CSS 文件(通常是
步骤 3:清缓存并刷新
- 进入后台
全局->缓存设置,点击“更新全部缓存”。 - 清除浏览器缓存。
- 访问你的网站首页,你应该就能看到自定义的“最新公告”区块了。
常用资源与注意事项
-
官方资源:
- Discuz! 官方论坛: https://.discuz.com/ - 里面有模板讨论区,可以搜索到很多现成的模板和教程。
- Discuz! 文档中心: 官方会提供一些开发文档,但可能不够新。
-
第三方模板站:
网上有很多 Discuz! X3 的免费和付费模板售卖网站,购买模板是快速搭建网站的好方法,同时你也可以下载下来研究其模板结构,学习别人的代码。
-
注意事项:
- 备份!备份!备份! 在修改任何文件前,务必备份原始的模板文件和数据库。
- 使用 FTP/SFTP: 不要直接在服务器上在线编辑,使用 FTP 客户端下载、修改、上传更安全。
- 熟悉基础: 修改模板需要一定的 HTML 和 CSS 基础,如果不懂,建议先学习相关知识。
- 命名规范: 创建自己的主题文件夹时,不要使用中文或特殊字符。
- 版本兼容性: 你找到的教程或模板代码可能不适用于你的 Discuz! X3 版本,注意甄别。
希望这份详细的指南能帮助你掌握 Discuz! X3 门户模板的制作和修改!祝你搭建出满意的网站。
