PHPBB2-在线社区构建指南-全-
PHPBB2 在线社区构建指南(全)
原文:
zh.annas-archive.org/md5/c7ddac08c45e2bbc36f66d9b9e5e38cc译者:飞龙
第一章:引言
phpBB 是一个免费、开源的互联网社区应用程序,拥有卓越的讨论论坛和会员管理功能。它使用 PHP 脚本语言编写,并利用流行的 MySQL 数据库,phpBB 在全球范围内的网络托管公司中已成为标准,并且是世界上使用最广泛的公告板软件包之一。phpBB 简化了您创建和管理大型在线社区的需求,无需您成为网络开发大师。
本书将指导您设置和运行自己的 phpBB 在线社区。通过易于理解的语言和清晰的说明,您将学习如何安装自己的系统,处理基本的论坛管理任务,并自定义论坛。之后,您将学习高级管理和技术,以及如何通过编程扩展 phpBB。
本书涵盖的内容
本书从对 phpBB 和在线社区的概述开始。第一章 也提供了一些关于 phpBB 的背景信息,并通过一些 phpBB 驱动的社区的真实案例,让您了解使用 phpBB 可以取得哪些成就。
第二章 带您完成 phpBB 的完整安装过程,包括必要的准备工作以及安装后的任务。它还探讨了配置安装,并提供了一些故障排除技巧,帮助您尽快开始使用您的新论坛和在线社区。
在您设置并运行之后,第三章 将直接进入 phpBB 环境,让您熟悉配置网站、创建论坛和用户以及 phpBB 管理的基础知识。为了全面理解不同的功能和它们的管理,本章从用户和管理员的角度对 phpBB 进行了浏览。
第四章 探讨了一些更多自定义论坛外观和功能的方法。进行这些自定义是赋予您的社区独特身份,使其在众多在线论坛中脱颖而出的关键。论坛的外观主要受 phpBB 的样式系统控制,该系统管理论坛的颜色、图像和视觉布局。在本章中,您将了解 phpBB 2.0 样式的基础知识,添加和删除样式,修复常见的样式安装问题,自定义样式,以及向论坛添加新功能,包括“修改”。
第五章 完成了您对 phpBB 管理的掌握。您将学习如何使您的论坛多语言化,配置头像,管理表情符号,论坛、用户和组权限,以及论坛管理的“人性”方面——包括管理、网络战争和封禁。
为了使您的论坛具有真正独特的风格,您可能需要创建自己的模板。创建自己的模板可能是一个非常有趣的过程,但也可能相当耗时。第六章将引导您完成这个过程,从设计新模板到实现该设计以创建论坛的新外观。从纸上的草图开始,我们经过所有步骤,直到我们有一个完成的模板。
随着您的社区成长,您可能会发现您需要扩展论坛的功能。最终,您可能需要一个功能,但发现自己无法找到现有的修改!第七章向您展示了如何为自己创建一个新的修改(也称为黑客),以帮助您获得您如此渴望的额外功能。在本章中,您将首先学习修改是什么,以及创建修改所需的技能和工具。之后,我们创建一个简单的修改,并向您展示如何使修改对其他 phpBB 用户可用。
第八章 通过查看您需要了解的内容来结束整个内容,以便编程新的、定制的 phpBB 功能。本章从简单的 phpBB 脚本开始,然后转向与 phpBB 数据库、使用 phpBB 消息和多种语言、与模板引擎以及验证用户的工作。我们在本章末尾构建一个新的 phpBB 扩展,巩固您的 phpBB 编程知识。
此外,还有四个附录,涵盖 phpBB 文件和目录结构、phpBB 资源、权限速查表以及 phpBB 数据库结构的指南。
使用本书所需条件
为了从本书中获得最大收益,您需要拥有对 phpBB 工作安装的行政访问权限—第二章 将引导您完成这一过程。
习惯用法
在本书中,您将找到多种文本样式,用于区分不同类型的信息。以下是一些这些样式的示例及其含义的解释。
代码有三种样式。文本中的代码词如下所示:"为了说明差异,您可以print_r()两个函数的结果"。代码块将如下设置:
define(‘IN_PHPBB’, true);
$phpbb_root_path = ‘./’;
include($phpbb_root_path . ‘extension.inc’);
include($phpbb_root_path . ‘common.’.$phpEx);
当我们希望您注意代码块中的特定部分时,相关的行或项目将被加粗:
define(‘IN_PHPBB’, true);
$phpbb_root_path = ‘./’;
include($phpbb_root_path . ‘extension.inc’);
include($phpbb_root_path . ‘common.’.$phpEx);
新术语和重要词汇以粗体字形式引入。您在屏幕上看到的单词,例如在菜单或对话框中,在我们的文本中如下所示:"点击下一步按钮将您移动到下一屏幕"。
注意
提示、建议或重要注意事项以如下框中的形式出现。
任何命令行输入和输出都如下所示:
>\. mydump.sql
Query OK, 1 row affected (0.00 sec)
读者反馈
我们欢迎读者的反馈。告诉我们你对这本书的看法,你喜欢什么或可能不喜欢什么。读者反馈对我们来说非常重要,以便我们开发出真正能让你受益的标题。
要发送给我们一般性的反馈,只需发送电子邮件至 `feedback@packtpub.com》,确保在邮件主题中提及书名。
如果有你想让我们出版但尚未出版的书籍,请通过 www.packtpub.com 上的 建议书名 表格或发送电子邮件至 <suggest@packtpub.com> 给我们留言。
如果你在一个领域有专业知识,并且你对撰写或为书籍做出贡献感兴趣,请参阅我们在 www.packtpub.com/authors 上的作者指南。
客户支持
现在你已经是 Packt 书籍的骄傲拥有者,我们有一些事情可以帮助你最大限度地利用你的购买。
下载本书的示例代码
访问 www.packtpub.com/support,从标题列表中选择本书,下载任何示例代码或额外资源。可下载的文件将随后显示。
注意
可下载的文件包含如何使用它们的说明
错误清单
尽管我们已经尽最大努力确保内容的准确性,但错误仍然可能发生。如果你在我们的书中发现错误——可能是文本或代码中的错误——如果你能向我们报告这个错误,我们将不胜感激。通过这样做,你可以帮助其他读者避免挫败感,并有助于改进本书的后续版本。
如果你发现任何错误,请通过访问 www.packtpub.com/support,选择你的书籍,点击 提交错误 链接,并输入你的错误详情来报告它们。一旦你的错误得到验证,你的提交将被接受,并将错误添加到现有错误清单中。现有的错误清单可以通过从 www.packtpub.com/support 选择你的标题来查看。
问题
如果你在本书的某个方面遇到问题,可以通过 <questions@packtpub.com> 联系我们,我们将尽力解决。
第一章. phpBB 简介
在本质上,在线公告板是商店和其他公共场所中发现的公告板的互联网版本。它基本上就是一个人们留下信息供他人阅读的地方。嗯,在线公告板应用程序已经变得比这更强大和复杂,但基本原则是相同的。phpBB 是目前在网上实现公告板理念的最受欢迎的免费软件之一。
在这本 phpBB 书的第一章中,你将了解以下内容:
-
在线社区
-
phpBB 历史
-
phpBB 开发及其发展方向
-
使用 phpBB 可以实现什么,以及现有的 phpBB 网站的例子
在线社区
在线社区是一群人因为某种原因聚集在网站上的群体。这个原因可以是任何对群体共同感兴趣的主题,比如职业、爱好、激情或地点。这样的在线社区非常受欢迎,随着越来越多的人开始上网,它们的受欢迎程度正在增长。想想看——每个人都有他或她热衷的事情。而且每个人都喜欢遇到有共同兴趣的人。从历史上看,这样的基于计算机的社区甚至在互联网出现之前就存在了;例如,使用基于调制解调器的点对点公告板系统(BBS)。
在社区中存在的一个基本部分是分享和贡献(例如,对某个主题发表评论或指出对群体感兴趣的话题)。这样,网站访客就不再是仅仅看着一个一成不变的网站。他们通过贡献内容在改变网站的面貌。如今,在我们访问的网站上发表评论的能力已经变得如此普遍,以至于我们几乎期望它在那里。
静态的、像小册子一样的网站正在变得过时。社区统治着网络。这对网站所有者和访问者来说都是好消息。网站被设计成供人们访问和使用,同时,人们也在参与建设他们访问的网站。网站所有者可以立即获得关于访客喜欢或不喜欢什么的反馈,而访客每次访问都能获得新的和新鲜的内容。如今,社区不仅会影响网站所有者的决策,甚至可以通过投票或公开讨论做出决策。因此,说网站的成功或失败往往取决于围绕网站建立在线社区的成功或失败并不过分。最终,网站是为了被使用而建立的,而人们有权决定这个网站是否有价值。
建设社区——工具
为了设置您的在线社区将聚集的地方,您需要工具。您可以将精力投入到自己创建工具中——当然,前提是您在网页编程、服务器管理等方面有专业知识——或者您可以选择不重新发明轮子,并采用一个解决方案。这就是 phpBB 发挥作用的地方。
现在有各种各样的社区建设工具。它们可以是像留言簿那样简单,或者更复杂,如聊天系统、网络日志(博客)或邮件列表。或者它们可以是论坛,也称为公告板。论坛系统继承了并扩展了来自黑暗的互联网前时代的公告板系统(BBS),并为它们添加了网络浏览器界面。phpBB 属于用于构建在线社区的论坛工具家族。
名称
名称由两部分组成——“PHP”和“BB”。PHP 是编写软件的编程语言,“BB”代表“公告板”;它是一个用 PHP 编程语言编写的公告板工具。
PHP 也是一个缩写,它代表,或者至少曾经代表,Personal Home Page。PHP 不再仅仅是像最初那样的一套个人主页工具,而已经成长为一个真正的编程语言。它的缩写已经深入了一层,现在递归地代表“PHP Hypertext Preprocessor”。但人们通常简单地称之为 PHP。
环境
从技术角度来说,您需要以下内容才能使用 phpBB:
-
要执行的程序代码
-
一个数据库来存储信息
-
Web 服务器软件,因为这是一个网络应用程序
-
一台计算机来运行所有这些!
如您所知,phpBB 使用PHP服务器端编程语言编写。此外,为了运行,phpBB 需要一个数据库。所有讨论的数据都存储在那里。有不同类型的数据库系统 phpBB 可以与之协同工作,但最流行且在当今 PHP 应用程序中最常用的是MySQL。最后,phpBB 需要一个网络服务器和运行操作系统的计算机。phpBB 可以在不同的操作系统和网络服务器上运行,但它主要在Linux平台上与Apache网络服务器一起使用。
使用网络开发者的术语,您可能会说 phpBB 主要在 LAMP 环境中使用,其中 LAMP 是 Linux、Apache、MySQL 和 PHP 的缩写。关于 LAMP 环境的一个重要特点是它的组件是免费和开源的。在实践中,“免费和开源”意味着:
-
您可以使用该软件而无需支付软件许可费。
-
如果您想修改软件以更好地满足您的需求,软件的编程代码可供您使用。
phpBB 的另一个优点是它对托管服务器的需求非常低。由于 phpBB 环境由免费软件产品组成,您很容易找到一个好且相对便宜的托管服务提供商。只需在 Google 上搜索“phpbb 托管”就会得到大约一百万个结果。
为什么选择 phpBB?
为什么你应该从你所拥有的所有选项中选择 phpBB?好吧,既然你在读这本书,你很可能已经做出了决定,所以我就给你一些建议,如何处理你的这位运行 vBulletin、Phorum 或其他类型系统的网站管理员朋友。
-
phpBB 是免费的。看起来它将保持这种方式。已经有公司提出购买 phpBB,但这些提议都被拒绝了。
-
phpBB 是最受欢迎的论坛软件之一。所有那些网站管理员都不可能是错的。他们继续使用 phpBB 来支持他们的网络社区,这是他们最好的证明。
-
人们都知道 phpBB。由于其受欢迎程度,你的访客很可能已经见过并使用过它。他们不需要学习一个全新的系统,可以立即开始发帖,在一个熟悉的环境中感到舒适。
-
phpBB 已经成熟。它已经活跃并重用了超过四年,在互联网术语中这是一个相当长的时期。
-
phpBB 功能丰富,并开放接受定制功能添加。你可以编写自己的定制功能,或者你可以使用一个或多个由 phpBB 用户社区贡献的众多 phpBB 插件,也称为 MOD 或 hacks。
-
phpBB 的外观是可定制的。你可以轻松地更改字体和颜色。你甚至可以更改布局或使用其他 phpBB 用户贡献的现有布局。
历史
詹姆斯·阿特金森是该软件的创造者。他是第一个开发者,现在是 phpBB 项目的项目经理。像许多其他开源项目一样,phpBB 最初是一个个人项目。詹姆斯想在妻子的网站上建立一个论坛。当时,他有两个选择:使用像先驱 UBB(Ultimate Bulletin Board,用 Perl 编写)这样的商业包,或者使用名为 Phorum 的免费解决方案,它是用 PHP 编写的,但詹姆斯不太喜欢它的线程风格。因此,他决定自己动手,创建一个类似 UBB 的基于 PHP 的公告板系统。
phpBB 是在 2000 年 7 月 1 日晚上 6:45“出生”的。我们知道确切的日期和时间,因为那是詹姆斯在互联网论坛上发帖说,他已经创建了一个公告板,并希望得到一些测试帮助的时候。几周后,他公开了项目的源代码,使其免费并可供所有希望加入并贡献开发的人使用。
其他爱好者加入了进来,2000 年 12 月 16 日,第一个官方 phpBB 发布了——phpBB 版本 1.0。此后,phpBB 团队开始了发布-特性请求-开发-测试-发布的循环。
phpBB 在 2002 年 4 月 4 日发布了 2.0 版本后变得非常受欢迎。这个版本是对源代码的完全重写,因为软件的功能比最初预期的要丰富得多,而旧代码库根本无法容纳新的开发。界面也得到了完全的翻新。
开发
phpBB 是一个开源项目,并且具有一些特定的特点:
-
开发者来自世界各地,他们是志愿者。phpBB 是一个成功的开源项目。它拥有一个令人印象深刻的团队名单,大约有 50 人,而大多数开源项目只有两三个。
-
有一个社区的用户经常转变为合作者。
您可能会想知道社区和 phpBB 的开源性质如何帮助其发展。有很多方法,但仅举一些主要的例子:
-
使用和测试软件
-
报告错误,以便开发者可以修复它们
-
通过 MOD 和黑客手段贡献新功能,从而扩展功能
-
为其他 phpBB 管理员贡献新的模板
-
为其他 phpBB 用户提供技巧和建议
-
推广和宣传 phpBB,从而增加社区规模
phpBB 正在持续开发中。下一个版本 3 的工作正在进行中,并且本着这个开源项目的精神,正在开发中的工作可以供预览和评论。
phpBB 示例网站
phpBB 的一个优点是它高度可定制和可扩展,无论是在功能上还是在外观上。这意味着:
-
您可以使用您喜欢的配色方案、字体和整体布局。
-
您可以修改 phpBB 并开发您自己的功能扩展,或者您可以使用现有的修改。
在本节中,您将找到一些真实世界的例子,说明 phpBB 如何用于支持在线社区网站。
标准的 phpBB 布局
让我们从使用默认 phpBB 风格和默认功能集的现成解决方案的例子开始。在这个示例网站上,甚至 phpBB 标志也被保留了下来。这是 Distributed Proofreaders([www.pgdp.net/phpBB2/](http://www.pgdp.net/phpBB2/))的网站,它使用 phpBB 提供一种基于网络的校对方法,以简化将公共领域书籍数字化为 Project Gutenberg 电子书的相关校对工作。通过将工作分解成单个页面,许多校对者可以同时校对同一本书。

不同模板的标准网站
下面的例子是具有默认功能集的 phpBB 安装,但具有不同的风格。在您的论坛展示方面,您有很多选择。
您可以选择不使用默认的 phpBB 外观,而是找到一个更适合您需求和布局/颜色偏好的预制作模板。或者,如果您找不到您想使用的模板并且您了解一些 HTML,您甚至可以创建自己的自定义模板。以下是一些使用不同于默认模板的模板的网站。
Mike Lothar:本书作者之一的个人网站(community.mikelothar.com/)。他的章节(第六章 创建您的自定义模板
Keenspot:一个讨论漫画书的公告板(forums.keenspot.com/):

ForumPlasma:一个游戏社区(www.forumplasma.com/):

具有标准样式和修改功能的网站
一些网站选择使用默认的 phpBB 样式,但引入了新功能。这些新功能通常被称为修改(MOD)或黑客技术。
您可以找到许多可免费下载的预制作 MOD,您可以使用它们来增强您的论坛。
Dogomania 论坛:一个宠物主人的社区。该网站与标准 phpBB 安装不同,具有自定义页眉、页脚和导航(forum.dogomania.com/):

中文语言和文化论坛:页眉和页脚已修改以放置广告;引入了多项其他修改。该网站还提供论坛的 RSS 订阅、WAP 和 PDA 视图(www.chinese-forums.com/):

使用自定义模板修改的 phpBB 安装
设计师领域:一个各种风格的设计师社区——网页、图形、印刷等。该网站具有自定义布局,并且从基础 phpBB 安装中进行了大量修改(www.designersrealm.com/):

Jaredwsmith 的论坛:一个非常好的自定义布局,包括自定义页眉、页脚、导航,以及安装了多个修改(www.jaredwsmith.com/forums):

GaiaOnline
GaiaOnline 是终极 phpBB 公告板。该网站的模板是自定义的,并引入了许多功能、定制和优化。拥有约 2 亿条帖子、150 万注册用户,这是互联网上最大的公告板(www.gaiaonline.com):

摘要
本章使你熟悉了 phpBB 解决方案及其解决的问题。你已经了解了它的历史和发展。你还看到了许多现有的由 phpBB 驱动的社区网站,这些网站可以给你一些关于你可以用该软件实现什么的提示。现在,你已经准备好学习关于 phpBB 论坛的安装、配置和定制了。很快,就在下一章结束之后,你将能够开始建立自己的社区网站。让我们踏上探索 phpBB 世界的旅程。
第二章 安装和配置 phpBB
现在你对 phpBB 有了一个大致的了解,是时候在你的服务器或个人计算机上安装它并开始使用了。安装过程通常不难——phpBB 有一个内置的基于浏览器的安装程序,这使得工作变得容易得多——但在开始之前,你需要了解一些先决条件和一些细节。安装 phpBB 后,你还需要执行一些安装后任务。在本书的第二章中,你将学习:
-
在安装 phpBB 之前需要满足哪些先决条件
-
如何下载和安装 phpBB
-
基本安装后任务,以及一些安全提示
-
遇到问题时在哪里以及如何寻求帮助
预安装
在本节中,你将了解 phpBB 的服务器需求,这些需求在托管提供商提供的服务器配置中价格较低。然后本节讨论一些与数据库相关的话题,并以一个清单结束,你可以使用这个清单来确保你有开始安装过程所需的一切。
需求
在服务器需求方面,phpBB 非常灵活,你有很多选择。但让我们集中讨论最广泛使用的配置,包括:
-
任何主要操作系统
-
Apache 网络服务器
-
MySQL 数据库系统,版本 3.22 或更高
-
PHP 版本 4. PHP3 也可以使用,但建议使用最新的稳定版 4.3
phpBB 在设计时考虑了便携性,因此上述所有需求都非常灵活。让我们更详细地看看它们,并了解你有哪些选择。
-
操作系统(OS):phpBB 是操作系统独立的。这意味着它可以在各种操作系统上运行——Windows、Linux、MacOS。你应该不会遇到满足这个要求的问题,并且可以在你首选或最经济的环境中运行你的论坛。
-
网络服务器:phpBB 可以运行在各种网络服务器上,包括最流行的 Apache 和微软的互联网信息服务器(IIS)。如果你使用的是托管服务,网络服务器需求不会成为障碍。但如果你想在你的计算机上安装 phpBB,你必须注意这个细节。虽然描述如何安装网络服务器超出了本书的范围,但你可以找到一些有用的信息。
-
数据库系统:目前 phpBB 支持的数据库包括 MySQL 3.22 或更高版本(包括 MySQL 4.x)、PostgreSQL 7.0.3、MS SQL Server(7 或 2000,直接或通过 ODBC)以及通过 ODBC 的 MS Access(2000 或 XP)。再次强调,根据你是本地安装 phpBB 还是远程服务器安装,你可能需要在你的计算机上安装一个支持的数据库系统,或者简单地询问你的服务提供商你有什么数据库访问权限。
-
PHP:一般来说,所有 PHP 应用程序都由包含编程指令的文件组成,这些指令由所谓的 PHP 解释器执行。PHP 解释器是一段软件,你需要在想要安装 phpBB 的系统上运行它。如果你选择托管服务,好消息是 PHP 非常流行,以至于实际上很难找到一个不支持它的托管服务。
PHP 4.x 是最广泛使用的 PHP 版本,也是 phpBB 安装中最广泛使用的版本。如前所述,PHP 3.x 足以让你的论坛运行,但不推荐使用。PHP 5 也不推荐使用(目前还不推荐),因为由于 phpBB 是在 PHP 5 发布之前开发的,所以 phpBB 在这个平台上还没有经过彻底的测试。
注意
phpBB 可以在 PHP 3.x 和 4.x 版本上运行,但如果你有选择,你应该目标是最新稳定的 PHP 4.3.x 版本。
攻击计划
现在你已经明确了要求,让我们来探讨将 phpBB 安装到系统中的选项:
-
你已经有了一个现有的网络托管服务:在这种情况下,你只需要联系你的托管服务提供商,并询问他们是否支持 PHP 以及上述列出的任何数据库,最好是 MySQL。如果他们不支持,找出他们是否可以为你安装/启用这些。如果他们仍然无法帮助你,你可能需要从剩下的选项中选择一个。
-
你在寻找一个好的托管服务提供商:好消息是,即使是价格最低的托管套餐通常也包含 PHP 和 MySQL 的支持。在选择托管服务提供商时有很多要点需要考虑,但至少,你应该在网上浏览一些独立的评论。不要仅仅因为带宽和磁盘空间巨大甚至无限而匆忙选择最便宜的套餐。向你的潜在托管服务提供商问一些问题(例如关于上述要求的问题)并判断他们响应的速度和质量。当你需要时,你希望有一个可靠的支持。
-
你想要在自己的电脑上安装 phpBB:有时,即使你选择了前两种选项,你也可能仍然想要在本地测试你的论坛。例如,如果你以后想要尝试安装或创建新的样式或修改,在你上线之前在自己的电脑上进行开发和测试可能会更容易(并且肯定更安全)。
如果你想在你的电脑上设置环境,你有两种选择:一个接一个地安装所有必要的组件,配置它们,并使它们协同工作,或者使用互联网上可以找到的某个一站式安装(捆绑包)。它们通常包括一个可下载的安装程序,负责安装和配置你所需的所有内容——Apache、PHP、MySQL——以及更多。这样的全包捆绑通常有 XAMPP([www.apachefriends.org/en/](http://www.apachefriends.org/en/))和其他在 HotScripts 上列出的捆绑包,例如(http://www.hotscripts.com/PHP/Software_and_Servers/Installation_Kits/)。
如果你想要自己设置环境而不是使用现有的捆绑包,以下是你需要做的。
行动时间 - 在本地电脑上设置环境
-
安装 Apache Web 服务器。
注意
前往
httpd.apache.org/download.cgi。从您最近的镜像下载适用于您操作系统的最新稳定版 1.3.x 服务器版本。安装它,如有疑问,请参考httpd.apache.org/docs/上的文档。 -
安装 PHP。
注意
从
www.php.net/downloads.php下载适用于您操作系统的最新稳定版 4.3.x。版本,如有必要,参考文档www.php.net/manual/en/install.php进行安装。 -
安装 MySQL。
注意
从
dev.mysql.com/downloads/下载最新推荐的版本。文档只需点击dev.mysql.com/doc/mysql/en/Installing.html即可获取。 -
安装 phpMyAdmin(可选)。
注意
phpMyAdmin 是一个免费且非常流行的 Web 应用程序,通过简单直观的浏览器界面管理 MySQL 数据库。你并不绝对需要它,但它在数据库操作方面可以使你的生活变得更加容易。它需要 PHP,但你已经安装了它,所以你一切都准备好了。最新稳定版本可以从
www.phpmyadmin.net/下载。
当你下载时,你可能已经注意到了建议下载“源代码”或“二进制文件”。请下载二进制文件,但如果你真的对幕后代码的样子感到好奇,请下载源代码文件,玩弄它们并尝试自己编译它们。当然,这需要一些 C 编程知识。所有这些源代码都可以免费使用、学习和修改。欢迎来到开源软件的奇妙世界!
现在有了运行 PHP 和 MySQL(或另一个数据库系统)的 Web 服务器,让我们看看一些数据库准备工作。
完成预安装前的触摸——数据库
phpBB 需要访问数据库,因此您必须使用现有的数据库或创建一个新的数据库。根据您是在本地计算机上安装还是远程服务器上安装,您将有不同的选项来设置 phpBB 所需的数据库;我们将查看这些选项。如果您有选择,请为 phpBB 使用一个新的空数据库;这使维护更容易。
为本地安装设置数据库
如果您在个人计算机上安装 phpBB,您在创建用于 phpBB 的新数据库时应该没有限制。您可以通过使用 phpMyAdmin 或使用控制台(命令提示符)来实现。使用 phpMyAdmin,创建新数据库非常简单;这是您加载应用程序时呈现的第一个选项之一。如果您没有安装 phpMyAdmin,您可以使用命令提示符来创建新数据库。让我们看看两种方法。为了本章中的示例,让我们假设您的新数据库名为"forums"。
行动时间——使用 phpMyAdmin 创建论坛数据库
-
前往您的主要 phpMyAdmin 页面。
-
在创建新数据库字段中输入文本forums。
-
点击创建按钮。
发生了什么
您已创建了一个新的数据库。在您左侧的 phpMyAdmin 中的数据库下拉菜单中,您现在将找到一个新选项——您刚刚创建的"forums"数据库。
行动时间——使用命令提示符创建论坛数据库
-
访问您的命令提示符。(Windows 用户,点击开始,然后运行,然后输入cmd)。
-
在命令提示符(控制台窗口)中,使用
cd directory_name进入目录(cd 表示“更改目录”)和cd .返回(向上一级),如果您错误地输入了错误的目录。 -
一旦您进入 MySQL 安装的目录,请转到
bin目录,在那里您将找到几个 MySQL 可执行文件。 -
输入
mysql u root p。注意
这条指令的意思是“使用用户名
root连接到 MySQL 并要求我输入密码”。root是 MySQL 安装时的默认用户名。如果您已创建了其他 MySQL 用户帐户,您可以使用其中一个。 -
当提示输入密码时,按Enter(Mac 上的Return)。这意味着您提供一个空密码。用户名
root带有空密码是默认的 MySQL 帐户。如果您已更改此密码,请输入它。 -
如果您已成功连接,您将看到一个欢迎信息和
mysql提示符。输入CREATE DATABASE forums;然后按Enter。不要忘记在末尾加上分号。 -
如果您想验证数据库是否已创建,请输入
SHOW DATABASES;然后按Enter。您应该在列表中看到您刚刚创建的新数据库。 -
就这样。输入
exit,按Enter,MySQL 会礼貌地对您说“再见”。 -
再次输入
exit以关闭您的命令提示符。![行动时间——使用命令提示符创建论坛数据库]()
为远程安装设置数据库
在这种情况下,过程可能因你具体的套餐及其限制而大不相同。一些可能的场景包括:
-
一些主机只提供一个具有预定义名称的数据库。找出这个名字;这就是你将要使用的数据库。
-
一些主机允许你使用安装在服务器上的 phpMyAdmin 创建数据库。
-
一些提供不同的 Web 界面来创建数据库,作为主机套餐控制面板的一部分。
-
一些服务提供商可以给你他们的服务器 shell 访问权限。shell 访问意味着你将能够使用命令提示符并在远程服务器上执行指令(命令)。在这种情况下,你需要向你的主机提供商了解如何建立到服务器的 shell 连接。连接成功后,重复之前描述的命令提示符创建数据库的步骤。这次你将使用主机提供给你的数据库用户名和密码。
-
为了建立 shell 连接,你需要一个名为shell 客户端的程序。一个流行的选择是免费的 PuTTY telnet 和 SSH 客户端(
www.chiark.greenend.org.uk/~sgtatham/putty/)。
安全提示:如果可能的话,在你的主机上创建一个新的 MySQL 用户账户,只给它访问你刚刚创建的新数据库的权限,并用于 phpBB 的安装。这听起来可能有些过于偏执,但原因通常是主机只提供一个用户名和密码,它可以用于所有事情——FTP、MySQL、控制面板和 shell 访问。因此,创建新的 MySQL 用户名/密码组合的原因是,如果它因某种原因被泄露,拥有它的恶棍只能造成有限的损害。这个密码只适用于一个数据库,不适用于 FTP、shell 或控制面板访问。
在创建这个新的数据库用户账户时,最好只分配“select”、“insert”、“update”和“delete”权限;phpBB 的正常运行不需要其他可能的权限。尽管如此,phpBB 的安装也需要“create”权限,而某些修改安装可能需要“alter”或“drop”权限。因此,最安全的选项是将“select”、“insert”、“update”、“delete”和“create”权限分配给新的数据库用户,一旦安装完成,就移除“create”权限。
创建新数据库用户的实际过程可能因你的主机提供商的政策而异。有些可能不允许这样做,有些可能提供专门的界面,有些可能允许你访问 phpMyAdmin。使用 phpMyAdmin 创建新的 MySQL 用户账户相当简单;只需点击 phpMyAdmin 主页上的用户链接,然后填写添加表单。
如果你正在使用命令提示符创建新用户,请使用以下查询:
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE
ON forums.*
TO ‘mysecretusername’@’localhost’
IDENTIFIED BY ‘mysecretpassword’;
在这个例子中,forums 是数据库名称,localhost 是数据库主机名,mysecretusername 是分配给该数据库用户的用户名,而 mysecretpassword 是密码。
phpBB 预安装清单
到目前为止,您现在已准备好安装 phpBB。但在继续之前,花一分钟回答以下问题;这只是为了确保您拥有所需的一切(第七章,讨论了修改和黑客技术,讨论了一些可能对您有帮助的技能集和工具):
-
我有一个运行的 Web 服务器吗?
-
我的 Web 服务器运行 PHP 吗?
-
我的 Web 服务器运行的是 MySQL、PostgreSQL、MSSQL 还是 MS Access?
-
我知道我的 FTP 主机名、用户名和密码吗?(此步骤仅适用于远程服务器,请参阅清单后的说明。)
-
我访问数据库的用户名是什么?
-
该数据库运行在哪个主机上?(询问您的托管提供商;它通常是
localhost或127.0.0.1。在 ODBC 的情况下,需要一个 DSN。) -
我的数据库(例如
forums)的名称是什么?
关于 FTP 的说明:您需要一个 FTP 程序,也称为 FTP 客户端,以便将文件从您的计算机传输到远程服务器。有许多免费/试用版的 FTP 程序可供使用。只需简单的 Google 搜索就会产生大量结果。通常,使用 FTP 程序与在本地计算机的不同位置复制文件没有太大区别。区别在于您需要首先建立与远程计算机的连接。为了做到这一点,您需要一个 FTP 主机名、用户名和密码,您可能已经拥有,由您的托管提供商提供。
安装
现在所有先决条件都已满足,让我们开始安装过程:
-
下载:从
www.phpbb.com/downloads.php下载压缩的 phpBB 文件,选择您知道如何解压的压缩格式。 -
解压:使用您首选的压缩工具(例如 WinZip)将文件解压到选定的目录中。如果您是在本地安装,请将文件解压到您的网站根目录内的一个目录中。phpBB 目录树的最顶层目录将被称为
phpBB2。 -
FTP:如果您是在本地安装,请跳过此步骤。如果您是在远程服务器上安装,请将整个
phpBB2目录原样复制到远程服务器上。您可以使用 FTP 程序连接到您的服务器并传输文件。 -
选择您的 phpBB 根目录。在这个步骤中,您需要做出一个重要的决定——在您的服务器上安装 phpBB 的位置以及如何命名它。之所以这很重要,是因为这将决定您的用户将如何看到您的论坛。假设您的域名是
www.yourdomain.com。您有以下几种选择:-
如果您将
phpBB2目录及其内容复制到您的网站根目录并安装而不做任何修改,您的论坛将可在www.yourdomain.com/phpBB2访问。 -
您可以简单地将
phpBB2目录重命名为您喜欢的名称,比如forum。在这种情况下,您的社区将位于www.yourdomain.com/forum。 -
您可以选择在您的网站根目录中托管论坛,以便可以直接在
www.yourdomain.com/访问,或者如果您使用子域名,则类似于forum.yourdomain.com/。如果您决定这样做,那么您需要复制phpBB2目录的 内容 到您的(子)域名的网站根目录,这不仅仅是phpBB2目录本身,而是包含在其中的文件和目录。
为了本章的目的,我们将选择第二个选项
www.yourdomain.com/forum,因为它可能是最常见的一种。 -
-
config.php:您需要更改此文件的权限,以便在安装过程中 phpBB 可以写入。转到 phpBB 安装的根目录,找到名为config.php的文件。更改文件权限,使其可由 phpBB 安装脚本写入,换句话说,在 Linux 系统上,使用chmod命令将其设置为666(或-rw-rw-rw-)。在 Linux/Unix 系统上,chmod是一个表示“更改模式”的命令,用于调整文件权限。文件权限指定了谁可以对特定文件做什么。您更改文件模式的选择包括:-
如果您有对 Linux 服务器的 shell 访问权限,请转到您的 phpBB 目录并输入
chmod 666 config.php。这样就可以了。 -
如果您只有 FTP 访问权限,那么您的 FTP 客户端(您用于将文件复制到远程服务器的程序)可能会给您提供 chmod 的选项,但您需要找到它。在一些 FTP 客户端中,这个选项简单地称为 chmod,在其他客户端中则位于文件属性或权限下。
-
如果您无法更改文件权限,请不要担心。如果在安装过程中 phpBB 安装程序无法写入此文件,您将会有下载系统中的
config.php文件并然后通过 FTP 上传文件,覆盖 phpBB 根目录中已有的文件的选择。
-
-
启动 phpBB 安装程序:将您的浏览器指向 phpBB 目录,在我们的例子中是
www.yourdomain.com/forum/。您将被自动重定向到安装脚本,该脚本位于www.yourdomain.com/forum/install/install.php。您应该会看到一个类似于上页所示的屏幕。
![安装]()
-
安装程序数据表单:完成安装屏幕上显示的表单。上一节中的清单在这里很有用。以下是对此表单字段描述的概述,因为其中一些可能不是那么不言自明。简而言之,此表单中的大多数字段由 phpBB 安装程序预先填写;您需要关注的基本上只是数据库名称、用户名、密码以及管理员用户名、密码和电子邮件地址。
选项 设置 默认论坛语言 由于您尚未安装其他语言,英语是唯一选项。稍后如果您决定使用其他语言,您总是可以更改此设置。 数据库类型 您将使用的数据库系统,最可能是 MySQL 4.x 或 MySQL 3.x 选择您的安装方法 安装或升级。由于您没有之前的 phpBB 安装,您将选择安装。 数据库服务器主机名/DSN 通常为localhost;请参考您的清单。 您的数据库名称 请参考您的清单。 数据库用户名 请参考您的清单。 数据库密码 请再次参考您的清单。 数据库中表的表前缀 phpbb_是默认值。安装后,数据库中所有与 phpBB 相关的表都将使用此前缀作为其名称的一部分,例如phpbb_users和phpbb_posts。使用前缀不是强制性的,但这是一个很好的方法,可以区分您的 phpBB 表和其他所有表,以防您在同一数据库中有其他非 phpBB 相关的表。这也允许您,例如,拥有两个或更多共享同一数据库的独立 phpBB 安装;您只需为每个安装使用不同的前缀即可。在此前缀中不要使用空格,否则安装程序将返回错误。如果您没有理由更改它,保留默认的phpbb_前缀是一个好主意。您可能希望在以后安装的大多数 phpBB 修改都将假定此前缀。 管理员电子邮件地址 您的电子邮件地址。当 phpBB 通知用户关于新私信时,它将被用作发送者电子邮件地址。因此,提供一个您经常检查的有效电子邮件地址是一个好主意。例如,代表您的论坛的电子邮件地址 admin@yourdomain.com将是一个不错的选择。域名 您的域名。phpBB 安装程序可能会自动识别,否则请自行输入。 服务器端口 默认值为80。通常您不需要更改此值。 脚本路径 到您安装的相对路径。通常 phpBB 安装程序会正确猜测,您不需要更改它。 管理员用户名 管理员用户名非常重要。没有默认值,但使用管理员是一个常见的选择。 管理员密码 请谨慎选择并确保难以猜测。此选项不能留空。 -
完成安装:点击安装按钮。如果到目前为止一切顺利,您已填写安装表单中所有必需的数据,并且没有错误信息,phpBB 将成功安装。恭喜!点击完成安装并继续进行安装后的任务。
安装故障排除
此故障排除指南并非详尽无遗;它仅包含 phpBB 用户遇到的一些常见问题。如果您的問題未在此列出,请参阅本章末尾的最后部分以获取有关如何寻求帮助的指南。
症状
错误信息:当前无法写入配置文件。
原因
由于某种原因,上述安装步骤的第 5 步未完成。再次阅读第 5 步的描述,但仅当您需要更多关于错误性质的背景信息时。否则,请参阅下面的解决方案。
解决方案
phpBB 安装程序本身将从这个情况中恢复。只需遵循屏幕上的说明即可。
您可以选择下载安装程序尝试写入的config.php文件。下载文件后,将其复制/FTP 到 phpBB 根目录中已存在的config.php文件上。
或者,如果您使用的是支持 FTP(很可能)的 PHP 版本,您还可以选择使用安装程序为您 FTP 文件。如果您想使用此选项,您将必须输入您通常用于通过桌面 FTP 客户端(CuteFTP、SmartFTP 等)连接到服务器的数据。请确保输入 phpBB 安装程序可以复制config.php文件的完整路径。完整路径与在您的 FTP 客户端中可见的路径相同。换句话说,phpBB 安装程序正在尝试为您充当 FTP 客户端。
症状
错误信息:无法连接到数据库。
原因
此消息可能有几个原因:
-
您尚未安装数据库系统。
-
数据库系统已安装,但未运行。
-
您未从第 7 步中描述的下拉列表中选择正确的数据库类型。
-
数据库主机名/DSN 不正确。
-
您提供的数据库名称指向一个不存在的数据库。
-
您访问数据库的用户名不正确或此数据库用户权限不足。
-
您访问数据库的密码不正确。
解决方案
再次阅读预安装部分。确保使用正确数据完成最后的清单。如果您仍然遇到问题,请参阅本章末尾的最后部分以获取寻求帮助的建议。
症状
错误信息:您输入的密码不匹配。
原因
这指的是在安装程序表单的最后部分,在管理员配置下输入的管理员密码和密码确认。
解决方案
确保在两个字段中输入相同的密码。密码不能为空。
症状
错误信息:您的服务器上的 PHP 配置不支持您选择的数据库类型。
原因 1
PHP 实际上支持您想要使用的数据库系统,但您没有从安装表单的数据库类型字段中选择它。
解决方案
点击浏览器上的 后退 按钮,并选择适当的数据库类型。
原因 2
正如消息所述,您的 PHP 安装不支持所选的数据库系统。
解决方案
与您的托管提供商联系,或者如果您是在本地安装,请阅读有关如何启用对所选数据库类型支持的 PHP 文档。
症状
错误信息:尝试更新数据库表‘phpbb_auth_access’时发生错误,该表已存在。
在这里 phpbb_ 是您在安装表单中输入的表前缀。
原因 1
虽然可能性很小,但可能发生的情况是,在您的数据库中有一个与 phpBB 完全无关的表格,其名称与 phpBB 表的名称相同。
解决方案
这是一个命名冲突。为了解决这个问题,请返回并选择不同的表前缀。
原因 2
您正在尝试使用已经包含 phpBB 安装的数据库进行安装。
解决方案
如果您想保留现有安装,请返回安装表单并简单地选择不同的前缀。这样,您就解决了命名冲突,并且将有两个使用相同数据库的 phpBB 安装。
如果您不想保留现有安装,例如它是一个失败的安装,您必须删除由先前安装创建的所有数据库表格。要删除哪些表格?您可以通过它们的名称前缀来判断。使用友好的 phpMyAdmin 删除这些表格,或者如果您不能使用它,则像本章前面所述,在命令提示符下连接到 MySQL,并手动删除表格。为此,您需要使用 DROP TABLE 语法,这实际上非常简单,但也有一点危险,因为它会永久删除整个数据库表格及其内容。
行动时间——使用 phpMyAdmin 删除 phpBB 表格
-
加载 phpMyAdmin 主页。
-
从左侧下拉菜单中选择 forums。forums 是数据库名称;如果不同,请使用您的数据库名称。
-
在右侧,显示所有表格的地方,勾选您想要删除的每个表格旁边的框。您也可以使用 全选 链接来选择此数据库中的所有表格。
-
从操作选项中选择 删除。
![行动时间——使用 phpMyAdmin 删除 phpBB 表格]()
行动时间——使用命令提示符删除 phpBB 表格
-
如前所述,使用控制台连接到 MySQL。
-
一旦连接到 MySQL,使用
\u forums更改正在使用的数据库,其中forums是您数据库的名称。 -
使用
SHOW TABLES列出所有表格;然后使用DROP TABLE table_name_here;逐个删除它们。
或者,如果您确定这个数据库中没有您需要的表——也就是说,这里除了失败的安装中的一些无用的 phpBB 表之外什么都没有——您可以一次完成:连接到 MySQL 后,输入DROP DATABASE forums;。
这将删除整个数据库。永久!所以请小心。您需要重新创建它以进行下一次安装。
注意
删除表和数据库是一个单向过程,这意味着您不能撤销。所以在删除任何内容之前请三思。在销毁一些表之前,如果您有疑虑,请考虑制作备份。
小贴士:这是一个允许您快速备份表的 MySQL 查询:
CREATE TABLE ‘new_table_name’
SELECT * FROM ‘table_to_back_up’;
这将在当前数据库中创建一个新的表,称为new_table_name,并且新表将与名为table_to_back_up的表具有相同的结构和内容。
如果您想备份不同数据库中的表,您可以使用:
CREATE TABLE ‘new_database’.’new_table_name’
SELECT * FROM ‘source_database’.’table_to_back_up’;
安装后任务
安装 phpBB 后,您需要执行一些安装后操作,即删除不需要的目录并设置一些基本配置选项。
行动时间—删除不需要的目录
-
通过 FTP 连接到您的服务器(对于本地安装请跳过此步骤)。
-
前往 phpBB 安装的目录。
-
删除
install和contrib目录。 -
(可选)也可以删除
docs目录。
发生了什么?
安装成功后,当您访问您的新 phpBB 论坛首页时,您会得到有关安装后任务的提示。建议您删除install和contrib目录,因为将它们留在服务器上被认为是一个安全风险,如此之大以至于如果 phpBB 检测到它们的存在,甚至不会运行。
如果您喜欢,也可以删除doc目录;它不是安全威胁,但可以节省一些磁盘空间。
基本配置
删除不需要的目录后,您就可以访问您刚刚安装的新亮丽的公告板了。太棒了!它工作了!
现在熟悉一下管理面板是个好主意。您可以通过编辑一些通用配置变量立即做到这一点。
行动时间—使用管理面板进行初始配置
-
在浏览器中加载您的公告板,即访问
www.yourdomain.com/forum。它看起来像以下截图。![行动时间—使用管理面板进行初始配置]()
-
使用页面底部的表单登录。根据安装如何结束,您可能已经登录。如果您还没有,请使用您在安装期间选择的管理员用户名和密码。
-
点击转到管理面板链接;它位于每个页面的底部。
-
点击左侧菜单中一般管理部分下找到的配置链接。
-
根据需要编辑字段(稍后讨论)。
-
完成后点击提交。
发生了什么?
您已成功登录到您的管理面板,这是管理您基于 phpBB 的公告板的地方。您已加载通用配置设置表单并保存了设置。
此表单中的大多数字段都预先填充了 phpBB 安装程序设置的值,这些值已经很好,但有些字段如果编辑会更好。以下是一个感兴趣字段的列表:
一般论坛设置
站点名称:您站点的友好名称:通常是域名。它将出现在每个页面的顶部。默认值为yourdomain.com,您可以在前面的截图中看到它的实际应用。
站点描述:对站点内容的简要描述,最好不超过六到七个字。它将出现在每个页面的顶部,不是必需的。再次提醒,查看前面的截图以了解默认值一个简短的文字来描述你的论坛。
启用账户激活:这指的是新用户被接受的方式。有三个选项:
-
用户在注册后立即被接受(这是默认选项)。
-
他们必须通过点击通过电子邮件收到的链接来确认他们的订阅。这样,他们确认了他们成为会员的愿望,并验证了他们是注册时提供的电子邮件地址的所有者。这可能是最常用的选项。
-
会员注册申请需要由管理员进行审查和批准。
系统时区:您的社区主要所在的时区。这是一个默认值,每个成员都可以覆盖。
启用 GZip 压缩:启用此选项将导致所有页面在从服务器发送时被压缩,并在用户计算机接收到后(如果用户的浏览器支持压缩)被解压缩。如果不支持,则服务器不会压缩页面。这会导致网站运行更快,使用更少的带宽,但会增加服务器负载,因为压缩每个服务的页面的开销。
Cookie 设置
Cookie 名称:通常你不需要更改这个。只有在你使用同一个域名托管多个论坛时,你可能需要更改这个值。如果是这种情况,你可以为每个安装使用不同的 cookie 名称。
Cookie 安全:如果您的站点运行在安全套接字层(SSL)上;换句话说,如果您的页面使用安全的 HTTPS 协议显示,而不是仅使用 HTTP,则启用此选项。
会话长度[秒]:确定用户会话“存活”多长时间后才会被删除。这是一个与安全相关的设置,它确定用户在多久不活跃(不访问任何论坛页面)之前会被 phpBB 注销。
头像设置
“头像”指的是出现在成员用户名下方的那些小型的成员特定图形。你有三种方式提供这种功能。
-
启用相册头像:用户可以从您上传到指定目录的预定义图形中选择。
-
启用远程头像:用户可以将他们在互联网上找到的图形链接到其他服务器上。
-
启用头像上传:用户可以向您的服务器上传图形。
头像存储路径:上传的头像存储位置;默认为images/avatars,这表示www.yourdomain.com/forum/images/avatars/。
头像画廊路径:预定义图形存储位置;默认为images/avatars/gallery,这表示www.yourdomain.com /forum/images/avatars/gallery/。
COPPA 设置
COPPA 代表儿童在线隐私保护法案。基本上,如果他们的孩子要成为您论坛的成员,需要父母书面同意。更多信息,请参阅 phpBB 用户指南和www.coppa.org。
电子邮件设置
管理员电子邮件地址:在安装过程中提供的电子邮件地址。
电子邮件签名:这将被附加到 phpBB 代表您发送的每一封电子邮件上,例如私人消息通知、主题关注通知等。发挥你的想象力,为你的成员设计友好的消息页脚。
使用 SMTP 服务器发送电子邮件:您可以选择使用 SMTP 服务器发送邮件,而不是本地的 PHP 邮件函数。一些主机禁用了 PHP 邮件函数,因为不道德的客户可能会滥用它(发送垃圾邮件)。如果是这种情况,您需要使用 SMTP 服务器发送邮件。您的互联网服务提供商(ISP,您用来连接互联网的)很可能已经为您提供了访问 SMTP 服务器的权限来发送电子邮件(例如使用 Microsoft Outlook)。您可以使用这个 SMTP 服务器来管理您的论坛。如果您在自己的 PC 上安装 phpBB 而没有设置邮件服务器,您也可以使用这个选项。
设置头像目录
如果您允许成员向您的服务器上传头像,您必须使存储它们的目录可写。文件权限(在 Linux 机器上)需要是 777。使用我们在预安装部分中用于config.php的相同方法更改文件权限,将image/avatars目录或您决定存储成员头像的任何位置的权限更改为 777。
安全提示
确保您的论坛尽可能安全始终应该是一个关注点。以下是一些可以帮助您开始的提示。
管理员密码
让您的管理员密码难以猜测。这是一个非常重要的密码,所以您不希望其他人猜到并随意操作您的论坛。这也适用于您稍后决定分配的任何版主。提醒他们更改密码为非常难以猜测的密码。例如,使用与用户名相同的密码绝对不推荐。发挥创意,选择像y0u11n3v3rgue$$(读作“你永远不会猜到”)和wh00p3375(读作“whoopee 75”)这样的密码。定期更改此密码并仅为此论坛使用它(不要用于其他服务如 Hotmail 等)也是一个好主意。
禁止对数据库的远程连接
远程连接允许您从远程位置访问您的数据库。例如,从您的本地机器,您可以查询在远程托管服务器上运行的数据库。这确实有好处——例如,为远程数据库中的数据制作本地备份——但它可能是一个安全风险。如果访问数据库的用户名和密码以某种方式泄露,那么如果远程连接被启用,入侵者就可以从他的或她的计算机访问您的数据。如果远程连接被禁用,黑客将必须访问远程服务器才能连接到您的数据库。此外,在启用远程连接的情况下,潜在的黑客可以通过尝试不同的组合来猜测您的密码,直到他们连接成功。
一些托管提供商允许您启用/禁用远程连接,而有些则完全不允许远程连接。检查您的情况,并且(除非您有很好的理由)确保远程连接被禁用。
MySQL 账户
为论坛使用新的 MySQL 账户(或您可能正在使用的任何其他数据库的新账户)。这在本章的预安装部分中已有更详细的描述。
config.php
在您将config.php文件的权限(在预安装部分中描述)更改为所有用户可写之后,并安装了 phpBB,现在是时候将其恢复原状了。使用之前描述的相同方法,将权限更改为 664。
在执行chmod 664 config.php命令后,以下是配置文件的更直观描述。这是一张来自 Windows FTP 客户端的屏幕截图。

.htaccess 保护管理面板
为管理面板添加一层额外的保护可以通过设置 .htaccess 目录保护来实现。.htaccess 是一个文件,可以包含适用于 .htaccess 文件所在目录及其所有子目录的 Apache 服务器指令。设置 .htaccess 保护将在你进入管理面板时显示一个额外的用户名/密码窗口。设置保护可能不是一件简单的事情,互联网上有许多教程可以帮助你完成这项任务。.htaccess 文档可以在 Apache 网站上找到,网址为 httpd.apache.org/docs/howto/htaccess.html。
有可能你的托管提供商为你提供了一个更简单的界面(控制面板),这可以帮助你设置保护。
因此,你可以直接使用 .htaccess 或通过一个更友好的界面来保护根 phpBB 目录下的 admin 子目录,使用与“正常”管理密码不同的用户名和密码。这样,你使潜在的入侵者更难入侵,因为他们需要处理两个不同的用户名/密码组合。
寻找帮助
记得我们之前提到的 phpBB 用户的大社区吗?这些人可以在你遇到无法解决的问题时帮助你。在 phpBB.com 上,有一个包含“静态”文章的支持部分,例如用户指南、知识库和常见问题解答,还有一个社区部分(不出所料,由 phpBB 支持),全球的 phpBB 用户在这里分享他们的经验。你可以在 phpBBHacks.com 上找到类似的用户社区。
当你遇到问题时,不要慌张;你不是一个人,而且很可能有人遇到过并解决了完全相同的问题,这个人很可能会分享解决方案。所以,你提出的问题很可能已经被问过并得到了回答。你所需要做的就是找到它。如果你找不到所需的解决方案,可以在公告板上发帖提问,但请确保先进行搜索。
即使你已经找到了答案,也不要立刻离开。你可以拖延一段时间,帮助那些你知道如何解决的问题。
摘要
在本章中,我们已经走了很长的路:设置了使 phpBB 运行的不同组件,进行了一些数据库准备工作,下载了 phpBB 并安装了它。现在你对 phpBB 的基本配置选项以及如何使你的论坛更安全也有了一定的了解。
到目前为止,你已经拥有了启动社区网站所需的知识和技能。今天就可以开始!
第三章。phpBB 快速游览
在前面的章节中,你学习了 phpBB 是什么以及如何安装它。现在是时候更深入地了解它实际上是如何工作的,以及它为用户、版主和管理员提供哪些功能了。
在本章中,你将学习:
-
从访客的角度看 phpBB 是如何工作的
-
版主的权限是什么
-
最受欢迎的行政功能是如何工作的
访客体验
随着越来越多的人加入你的在线社区,他们可能会开始询问有关一些论坛功能的问题。如果你想成为一个好、理解且乐于助人的社区主人,你应该能够引导他们并回应他们的关切。这就是为什么详细了解你的 phpBB 论坛是如何工作的是个好主意。
如果你刚刚从上一章跳转过来,你可能仍然以管理员身份登录。请登出,让我们穿上访客的鞋子开始对新论坛的游览。
概览
如果有人按照上一章的步骤访问你刚刚创建的论坛,他们很可能看到以下内容:

这张截图显示了 phpBB 的发货情况,包括所有默认设置和一个测试论坛中的测试帖子。论坛的唯一注册用户是在安装时创建的管理员用户。在屏幕顶部,紧邻 phpBB 标志旁边,有一组与一些小图标图像一起的链接。这些链接代表论坛的主要导航。其中一个链接是注册并成为社区成员的链接。我们出发吧!
注册
注册流程有三个步骤——阅读和接受注册条款、填写用户资料表单,以及(可选的)通过电子邮件进行注册确认。
第 1 步
当访客从顶部菜单选择注册链接时,他们会看到“注册协议条款”。他们可以选择以下三个选项之一:
-
接受条款并年满 13 岁或以上:此选项触发标准注册流程。
-
接受条款并年龄小于 13 岁:此选项与上面的选项相同,但增加了一个附加条件。根据 1998 年儿童在线隐私保护法(COPPA)的规定,父母或监护人需要通过邮件或电子邮件向你,即论坛管理员,发送一份标准表格。这份表格允许孩子参与论坛。phpBB 会将一份空白 COPPA 表格发送到注册时提供的电子邮件地址。
-
不同意条款:选择此选项将终止注册流程,访客将被重定向到主论坛页面。
第 2 步
当访客接受 phpBB 条款时,注册表单会显示出来。这个注册/资料表单中每个字段的确切含义将在稍后描述。现在让我们专注于绝对必需的字段:
-
用户名
-
有效的电子邮件地址
-
密码和密码确认
第 3 步
在填写完所有信息后,用户点击提交。如果有验证错误,比如电子邮件地址或密码不匹配的语法错误,错误信息将显示在表单的顶部。在没有错误且注册成功的情况下,会显示一个“感谢”页面。根据论坛的配置(见下文编辑您的个人资料部分中显示的表格中电子邮件地址字段的说明),感谢页面可能会建议用户检查他们的电子邮件,以确认消息以完成注册。
登录
注册成功后,用户可以使用论坛首页底部的表单登录。

在密码字段旁边有一个复选框,上面写着每次访问自动登录我。用户在使用这种便利时应小心,尤其是在共享电脑上。作为管理员,您在使用此选项时应更加小心,因为如果“坏人”接管了您的账户,会发生可怕的事情。想想还有谁可能在使用您的电脑——家人、来访的朋友等。
编辑您的个人资料
登录用户可以编辑他们在注册期间创建的原版个人资料。如果他们点击顶部导航菜单中的个人资料链接,他们会看到一个个人资料表单,这个表单实际上与注册表单相同,除了两点:
-
用户名不可编辑。管理面板允许用户更改他们的用户名,但这不是默认选项,并且有很好的理由。给用户更改身份的机会意味着,人们将很难在您的社区中分辨出谁是谁。
-
现在有三个密码字段:一个用于旧密码,一个用于新密码,一个用于确认新密码。这些字段通常留空,仅在用户想要更改密码时使用。
好的,让我们通过一个简单的练习来回顾一下我们到目前为止所学的关于用户资料的知识。
行动时间——创建和编辑“The Dude”个人资料
-
前往论坛的主页,并从顶部导航菜单中选择注册。
-
在接受条款页面,选择我已满 13 岁
-
使用用户名The Dude、密码test和您的电子邮件地址填写表单。其他一切保持不变。
-
点击提交按钮。
-
到目前为止,注册已成功。再次访问主页。您将在谁在线下看到 The Dude,显示为最新注册用户。
![行动时间——创建和编辑“The Dude”个人资料]()
-
现在转到你的电子邮件收件箱并检查你的电子邮件。你应该会看到一条欢迎来到 yourdomain.com 论坛的消息。根据之前讨论的论坛配置,此消息将建议你现在是会员,或者会提供一个链接来激活并完成你的会员申请。欢迎加入!
-
返回到论坛首页。向下滚动到登录表单。将用户名输入为The Dude,密码输入为test,然后点击登录。登录成功后,你将在在线注册用户列表中看到 The Dude。
![行动时间——创建和编辑"The Dude"个人资料]()
-
查看顶部的导航链接,并选择个人资料。个人资料表单将显示。
-
在空白签名字段中,输入以下内容:人类不为其祖先感到自豪,很少邀请他们来参加晚宴。 - 道格拉斯·亚当斯。其他内容保持不变。
-
点击提交以保存你的修改后的个人资料。
发生了什么?
你已成功注册新个人资料,登录并编辑此个人资料。此用户现在可以开始发帖。
理解用户个人资料字段背后的含义是许多 phpBB 功能的关键,因此这里有一个详细的描述。花时间了解这些字段;你将在论坛的不同区域反复看到它们。
| 字段名称 | 描述 |
|---|---|
| 注册信息 | |
| 用户名* | 选定的用户名。允许空格和特殊符号,但引号(")除外。最多允许 25 个字符。 |
| 电子邮件地址* | 用户的电子邮件地址。论坛可以配置为通过电子邮件请求注册确认,以便激活用户账户。如果需要此类确认,将发送一封电子邮件到本字段提供的地址。许多 phpBB 管理员选择通过电子邮件确认,以确保用户输入有效的电子邮件地址。这有一个很好的理由——如果你不要求电子邮件确认,而用户使用虚假的电子邮件地址注册,你将开始收到大量退回的邮件到你的管理员电子邮件地址。为什么会有这些退回的邮件?嗯,phpBB 会使用你的账户(你将是发送者)发送电子邮件,用于私信通知、主题关注通知等,如果由于错误的收件人地址导致邮件投递失败,这些邮件会退回给发送者。 |
| 密码* | 密码可以是任何内容,包括单个字母,尽管这种简单的密码实际上并不推荐。 |
| 确认密码* | phpBB 要求用户确认密码,以确保他们正确地输入了他们打算输入的密码。关于密码的说明:在保存到数据库之前,使用 MD5 单向加密算法对密码进行加密。用简单的话说:没有方法可以恢复保存的密码;至少现代计算机算法无法做到这一点。这意味着只有用户知道他们的密码。如果用户忘记了密码,有一个创建新密码的程序,但没有恢复旧密码的程序。 |
| 个人资料信息 | |
| 正如表格所述,注册的这一部分包含所有社区成员都可以公开查看的信息,即使那些未注册的成员。其中一部分伴随着用户写的每一篇帖子,另一部分只有在有人访问用户个人资料页面时才会显示。本节包含有关用户 ICQ、AOL、MSN 和 Yahoo! Messenger 服务的用户数据以及一些其他个人信息。有一个称为签名的特殊字段。该字段中的文本附加到用户发布的每篇帖子的底部。它可以包含链接、URL 和格式,通常用于添加个人风格。人们出于各种原因使用它,如喜欢的智慧名言、有趣的引言或自我宣传。人们使用它的方式有时会根据社区的主题而有所不同。在罕见的情况下,它实际上可以用于其原始目的——包含发帖者的名字或任何类似真实签名的信息。格式化签名的规则与格式化正常帖子相同,这将在稍后讨论。 | |
| 偏好设置 | |
| 总是显示我的电子邮件地址 | 选择“是”将在帖子和个人资料中显示用户的电子邮件地址。选择“否”仍然允许其他成员向此用户发送电子邮件,但不知道确切的电子邮件地址。他们可以通过使用特别设计的 phpBB 电子邮件界面来做到这一点。 |
| 隐藏您的在线状态 | 如果选择“是”,当此用户登录时,用户名将不会显示在论坛首页的“谁在线”区域。许多人出于隐私原因选择此选项。尽管如此,当以管理员身份登录时,隐藏的用户仍然会显示。 |
| 总是通知我回复 | 选择“是”时,phpBB 将在有人回复由该用户创建的帖子或该用户已回复的帖子时,向用户发送电子邮件。这可以在每个帖子的基础上取消选中。 |
| 当收到新私人消息时通知 | 选择“是”时,phpBB 将在用户收到私人消息时发送电子邮件。 |
| 在新窗口中弹出弹出窗口 | 当用户当前登录并收到私人消息时,选择“是”,将弹出一个新的浏览器窗口通知用户有新消息。 |
| 总是附加我的签名 | 总是允许 BBCode |
| 总是允许 HTML | |
| 总是启用表情符号 | |
| 董事会语言 | 论坛的语言。默认安装中只包含英语,但好消息是还有超过 50 种其他翻译可供选择。第五章解释了如何将新语言添加到您的论坛中。 |
| 论坛风格 | 在这里,用户可以选择论坛将如何显示。默认且唯一的论坛风格是"subSilver",但很快您就会了解到如何添加更多风格或自定义它们,甚至创建您自己的风格! |
| 时区 | 用户可以选择他们所在的时区,以便所有在论坛上显示的日期/时间数据都转换为他们的本地时间。 |
| 日期格式 | 用户可以使用date() PHP 函数的格式化选项来配置日期/时间数据显示的方式。有相当多的选项:详细信息可以在位于www.php.net/date的 PHP 手册条目中找到。默认情况下,日期将显示为"Sat Nov 21, 2004 1:01 pm",但可以更改为类似"2004-11-21 13:01"或"2004 年 11 月 21 日 01:01 pm"或用户最舒适的方式。 |
发布
在公告板上发布消息是主要的活动;其他所有内容都是或多或少额外的功能。因此,了解发布消息的所有细节是个好主意。
帖子结构
让我们看看帖子是什么样子,以及它由哪些不同的元素组成:

作者信息框包括作者的昵称、加入日期、发帖数和位置。它还可以包含头像图像、等级和等级图像,但这些默认情况下是未启用的。等级和头像将在稍后讨论。
帖子元信息包括一个小小的帖子图形、日期/时间戳和帖子主题。这个极小的图形 (
) 非常小,以至于大多数人甚至不会注意到它,即使他们注意到了,也会认为它只是装饰品。但实际上,这是一个功能图形;它是到这个帖子的精确链接。很少有人会想去查看他们正在阅读的帖子,但当你想要提供一个指向特定帖子的链接时,这可以非常有用,而不是指向主题的一般链接。要获取帖子的确切 URL,右键单击这个微型图形并复制它链接到的 URL。这个图形的颜色也可能不同,这有特定的含义。在默认的 phpBB 模板中,橙色框表示这是一篇未读帖子,而白色灰色框表示用户已经阅读了这篇帖子。
动作区域包含用户可以对这篇帖子执行的动作的按钮。始终存在的按钮是“引用”按钮,其外观如下:
另一个可能可用的动作按钮是“编辑”按钮,其外观如下:
“编辑”按钮是否可用取决于用户权限,但在默认的 phpBB 论坛配置中,作者可以编辑自己的帖子,而版主可以编辑所有人的帖子。作者还可以根据权限和特定帖子拥有删除操作。默认的 phpBB 配置允许帖子的作者在之后没有更多帖子的情况下删除帖子。版主可以访问所有动作按钮——引用、编辑、删除以及查看发帖者 IP 地址的按钮。
帖子文本区域包含消息的实际文本,而签名区域包含用户在其个人资料中的签名。
顶部链接只是一个“返回顶部”链接,它将链接到当前页面的开头。
至少,“联系作者选项”区域包含一个访问作者个人资料的按钮和一个发送作者私人消息(PM)的按钮。此区域还可以包含在个人资料中输入的其他信息:电子邮件地址、ICQ 号码、MSN 信使 ID、网址等。关于 ICQ 按钮的好处是,它将显示作者(在线或离线)的 ICQ 状态,当然前提是作者允许在 ICQ 设置中查看状态。
回复
回复是在现有讨论主题中的一项新帖子。它通过点击位于主题列表顶部和底部的“发表回复”(post reply)按钮(回复)来发起。回复也可以通过点击之前提到的位于帖子动作区域的“引用”动作按钮来发起。在这种情况下,帖子正文将预先填充引用的帖子内容。
这是发表回复的界面:

用户真正需要在这个表单上担心的事情只有消息体。其他一切都是可选的。以下是关于帖子界面的更多详细信息:
-
主题(如果填写)将出现在帖子元信息框中(参见 帖子结构 部分)
-
有一些使用所谓的 BB 代码(BB 标签)的格式化选项,其中 BB 代表 公告板。格式化选项赋予用户改进帖子外观(有时甚至破坏它)的能力。
-
表情符号(通常被称为笑脸)是那些可爱的小图像,帮助用户在帖子中添加一丝个人化和非正式的风格。点击左侧的这些图形之一,将在消息体字段中插入其文本表示。例如,如果你点击
,你会在文本框中看到 :D被插入,如前一个屏幕截图所示。 -
蓝色文本
查看更多表情符号实际上是一个链接到新窗口弹出窗口,其中包含更多可供选择的笑脸。这个链接是人们经常错过并开始询问你为什么从他们那里隐藏这个绿色图标
,而其他人似乎一直在使用。解释是它在那里,但只能通过 查看更多表情符号弹出窗口访问。 -
选项部分位于消息体下方,包含我们之前提到的一些复选框;它们的默认值在用户配置文件中定义。
-
点击 预览 按钮将显示消息体在发布时的确切外观。使用此功能总是一个好主意。
-
如果论坛配置允许未注册访客发布,他们将在所有其他字段上方看到一个额外的字段,并且这将是一个必填字段,用于输入用户名。
-
在帖子表单下方,有一份最新先前帖子的列表(在先前的屏幕截图中未显示)。这使得帖子作者更容易回忆起其他人之前说过的话。
开始新主题
开始新主题与在现有主题中发表回复非常相似。它通过点击 新主题
按钮来启动。表单与我们刚才看到的非常相似,只是 主题 是必填字段,并且有字段可以包含与主题一起进行的投票。
关于投票的一些其他有趣话题:
-
当开始新主题时,用户可以设置投票问题、多个答案(至少两个)以及投票到期前的天数。
-
一旦投票到期,访客仍然可以看到投票结果,但不能再投票。
-
将过期天数设置为 0(或留空)将使投票始终可供投票(一个 永恒的投票)。
-
创建投票需要一项单独的权限,可以从管理员面板中限制,但默认情况下是允许的。
格式化帖子
用户可以通过使用一组简短的指令(BB 标签)来格式化帖子。在发布帖子时,您可以在帖子正文中插入这些标签,当您查看帖子时,这些标签会被处理以产生所需的格式。如果您了解一些基本的 HTML 标签,那么您很可能对 BB 标签的工作方式有一个相当好的了解,并且可以立即开始输入它们。
如果您既不知道 HTML 也不知道 BB 标签(而且您的大多数访客也不会知道),请不要担心;您不需要记住这个全新的秘密代码。phpBB 有一个直观的界面,可以像使用文字处理软件一样轻松地引导您完成这个过程。只需看看格式化工具栏,就应该能让大多数选项变得清晰。

应用格式有两种方式:您可以手动输入标签,或者选择您想要格式化的单词或短语,然后点击工具栏上的相应按钮。不幸的是,由于不同浏览器对 JavaScript 的支持不同,第二种选项在某些浏览器或平台上不可用。但好消息是,大约 95%的互联网用户将能够访问这个功能,因为他们会使用支持它的浏览器。
总是有一个打开的 BB 标签来显示格式化的开始位置,以及一个关闭的 BB 标签来显示格式化应该结束的位置。打开标签的形式是 [tag],关闭标签的形式是 [/tag]。让我们看看加粗标签,因为它可能是使用最频繁的标签。如果您想在句子“帖子是 fun”中加粗单词“fun”,您输入(或使用工具栏产生相同的结果)"帖子是 [b]fun[/b]"。这些标签可能看起来很吓人,但如果您习惯了它们,实际上是非常容易的。
您知道可以通过输入句子,选择单词“fun”,然后点击B图标来应用这种格式。还有另一种使用工具栏的方法:
-
输入帖子是。
-
点击B图标(这将插入打开的
[b])。 -
输入fun。
-
再次点击B图标(这将插入关闭的
[/b])。
与之前描述的格式化选择方法不同,上述场景几乎在任何知道至少一些 JavaScript 的浏览器中都能工作。在上面的步骤 2 之后,B图标将获得一个星号,表示有一个尚未关闭的打开的 [b] 标签。在完成步骤 4 后,星号将消失。
您可以通过使用 [img] 标签将图片插入到您的帖子中,前提是图片必须可在互联网上访问,也就是说您知道其以类似 http:// 开头的网址。您还可以使用 [url] 标签将网页链接放入帖子中,尽管 phpBB 足够智能,能够猜测到您的帖子中包含网页链接,并将它自动显示为可点击的链接。
你可以查阅 phpBB 用户指南以获取更多关于 BB 标签的详细信息,但让我们先通过一个示例来大致了解这些标签的工作方式。
如果你查看之前的截图,其中显示了格式化工具栏,你会注意到它看起来像三条不同的线(或行),分别包含:
-
格式化命令按钮,如B用于粗体,I用于斜体等。
-
两个下拉菜单包含字体格式化和关闭标签链接。此链接将关闭所有当前打开的标签(假设它们是从工具栏打开的,而不是手动输入的)。例如,如果你输入发布是,点击B按钮然后是I按钮,输入fun,最后点击关闭标签,你会得到以下结果:发布是 [b][i]fun[/i][/b]。点击关闭标签与点击I然后B来关闭已打开的标签具有相同的效果。
-
工具栏的第三行包含有关如何使用 BB 标签的提示。如果你将鼠标悬停在工具栏图标上,你会看到提示行的内容会改变以反映按钮的功能。前面的插图显示了鼠标光标悬停在B按钮上。在括号中,提示显示了一个可用于格式化的键盘组合。这个组合与点击工具栏按钮具有相同的效果,并可以帮助你仅使用键盘更快地发布帖子,甚至不必担心将手从键盘移到鼠标,然后再将鼠标移到所需的图标。
从示例中可以看到,仅使用键盘就能达到相同的结果:输入发布是,按住ALT键(Mac 用户的 Apple 键),按B,按I,释放ALT,输入fun,按住ALT,按I,然后按B。
时间行动——格式化帖子
-
你已经知道如何使用粗体和斜体格式化标签,但这次让我们也添加下划线。使用你喜欢的方 法(工具栏、键盘或直接输入标签)来生成以下 BB 代码:发布是 [b][i][u]fun[/u][/i][/b]!。
-
下一个要讲的是引用。通常你会在回复时使用引用动作按钮,但了解如何手动操作也无妨:
I can quote other posters like this: [quote="The Dude"]For my name is The Dude...[/quote] -
现在我们来看看
[code]标签,它通常用于人们将编程代码粘贴到他们的帖子中时,但也可以用于其他目的,如以表格样式更好地对齐,因为它使用固定宽度的字体。输入:I can write "phpBB" using binary: [code]01110000 01101000 01110000 01000010 01000010[/code] -
接下来是列表。列表使用
[list]标签标记列表的开始和结束,并使用星号[*]作为列表项。列表开始标签可以接受如1或A之类的参数。尝试这个:And I can list stuff like this: [list][*]one[*]two[/list] or even enumerate, like this [list=1][*]first[*]second[/list] -
然后使用
[img]标签和已知图片的网址添加图片,如下所示:I can use images: [img]http://www.packtpub.com/images/Packt.png[/img] -
现在是链接。链接是通过
[url]标签插入的,有两种可能的情况。如所示尝试它们:Links: [url]http://www.packtpub.com[/url], fancy links: [url=http://www.packtpub.com]Packt Publishing[/url] -
最后,是
[color]和[size]标签。它们的起始标签接受如[color=black], [color=blue], [size=7]等参数。尝试以下操作以获得更好的理解:and [color=red]different [/color][color=green]colors [/color]and [size=18]font [/size][size=9]sizes[/size]!
发生了什么
点击 预览 或 提交 按钮,您将看到您刚刚所做的。它应该看起来像以下截图。

恭喜!您刚刚使用几乎所有的 phpBB 格式化功能来格式化了一个帖子!
编辑帖子
用户允许编辑自己的帖子。这同样是 phpBB 的默认配置,可以通过管理面板进行更改。用户通过位于操作区域的 编辑 链接来编辑帖子。
在帖子编辑后,帖子底部会出现一条小字消息,通知其他用户该帖子已被修改。消息如下:

这条消息总是出现,只有一个例外。如果帖子在另一个用户在同一主题中发布回复之前被编辑,则不会出现。
删除帖子
用户允许删除自己的帖子,但仅限于讨论主题中的最后一个帖子。一旦有回复被发布(即使是同一用户),删除帖子的操作就不再可能。
通过位于帖子操作区域的删除操作图标(
)来删除帖子。
搜索
很快,您的论坛将充满跨越多个主题列表页面的主题。这将使得定位一个特定的旧主题变得有些困难。phpBB 的搜索功能在这里提供了帮助。它可以通过 搜索 顶部导航链接访问。搜索表单提供了许多选项来查找您感兴趣的主题,例如搜索哪个论坛,如何显示结果,等等。
很可能您和您的成员会在搜索中忽略大多数搜索选项。毕竟,我们习惯了像 Google 一样的简单搜索框,所以我们很少寻找其他选项。但这里有一个简单的选项可以帮助您很多。这个选项是 搜索所有术语。当您使用多个单词进行搜索时,这很有帮助。与 Google 不同,当您添加更多单词时,结果会缩小,而 phpBB 会搜索每个单独的单词并返回更多结果(相对于缩小搜索范围)。
例如,如果您搜索 牛奶巧克力,您将得到所有包含 牛奶 和 巧克力 的结果,这可能不是您想要的。勾选 搜索所有术语 选项将仅返回那些两个单词都能找到的帖子。
您还可以使用通配符 (*) 来搜索单词的一部分。例如 *late 将返回包含 chocolate 和 late 的帖子。
发送和接收私密消息(PM)
phpBB 的一个很酷的功能是用户可以在公共论坛区域之外通过私信(PM)相互私下交流。(PM 也被用作动词,例如“请给我发私信”。)PM 的工作方式与我们都习惯的正常电子邮件非常相似。写私信的界面与写帖子相同,只是顶部有一个收件人用户名的字段。此外,如果您不确定拼写,您还可以查找用户名。
有以下私信邮箱:
-
Inbox:存储所有收到的消息,就像在正常的电子邮件收件箱中一样。
-
Sentbox:包含您发送给其他成员的所有消息。
-
Outbox:暂时包含您已发送但尚未被收件人阅读的消息。您可以在发件箱中编辑或删除消息。一旦收件人阅读了消息,发件人就无法再修改它。此时,它是最终的。有时可能会发生这样的情况:用户收到一封电子邮件和一个关于新私信的弹出窗口通知,当用户进入收件箱时,却没有新消息。这种情况并不常见,因为编辑或删除发件箱中消息的能力是一个相对隐藏的功能,大多数人并不了解。但无论如何,请准备好回答用户关于为什么他们收到通知但没有消息的疑问。
-
Savebox:存储发送或接收的消息。您可以从其他邮箱将消息移动到这个邮箱。这对于存储一些您希望与其他消息分开的重要消息很有用,这样您就不会不小心删除它们。当其他邮箱达到存储限制时,保存箱也可以用来卸载其他邮箱。
当查看消息列表时,您可以点击每条消息旁边的复选框,然后将选中的消息移动到保存箱或通过列表底部的相应操作按钮删除它们。请注意不要混淆删除所有按钮和删除标记按钮;尽管它们看起来相同(甚至包括您确定要…的确认消息),但删除所有会清除私聊箱中的所有内容。
行动时间——The Dude 给管理员发送私信
-
您以 The Dude 的身份登录。点击
顶部的“您没有新消息”链接。您现在处于空旷而孤独的收件箱中。 -
点击新建帖子。您将看到写私信的界面;这个界面与写帖子的界面相似。
-
您想给管理员用户发送私信,即您在第二章中描述的安装过程中创建的用户。假设您不确定它是否被称为管理员或简单地称为 Admin。点击文本框旁边用于收件人用户名的查找用户名按钮。会出现一个新窗口。
-
输入Admin(注意星号)并点击搜索*(*是一个通配符,意味着匹配以"Admin"开头的任何用户名)。
-
出现一个下拉菜单,显示匹配项;在我们的案例中,只有一个匹配项。点击选择。
![行动时间——The Dude 给管理员发消息]()
-
现在用户名字段已预先填写。在主题行中输入测试 #1,并在消息正文中输入相同的文本。添加😃使其更友好。
-
点击预览。看起来好吗?
-
点击提交发送消息。
-
使用测试 #2作为主题行和消息正文重复上述步骤。
-
前往您的发件箱。它是空的。
-
前往您的发件箱。您会看到您刚刚发送的两条消息。勾选测试 #1旁边的框。
-
点击删除标记并确认删除。
-
退出并重新以管理员身份登录。通过使用您有 1 条新消息的链接进入您的收件箱。
-
您看到您收到了来自 The Dude 的新 PM,主题为测试 #2。点击主题行来阅读消息。
-
点击保存消息将消息移动到保存箱。
发生了什么?
您已成功创建、发送、修改、接收和保存了一条 PM。如果您现在以 The Dude 的身份重新登录,您会看到您的发件箱为空,但发件箱现在包含测试 #2的消息。
投票
您已经知道在发起新主题时可以创建投票。以下是关于在这些投票中投票的一些注意事项:
-
只有注册用户才能投票。
-
未注册用户只能看到投票结果。
-
投票是保密的;无法知道特定用户是如何投票的。
-
您可以通过选择查看结果来查看结果,即使您没有投票。
-
请记住,投票结果并不完全可靠,因为现有用户可以注册为新成员只是为了再次投票。
关注主题的最新动态
如您所知,如果您创建或发起了某个主题,有人回复该主题,您会收到通知。您可以通过在发帖时确保勾选了当有回复时通知我来订阅这个主题。此外,即使您没有在该主题中发帖,您也可以开始关注该主题。
您可以通过使用位于主题底部关注此主题以获取回复的链接来实现。您可以在任何时候通过使用您正在关注的主题每页底部的停止关注此主题链接来停止接收主题更新的通知。
查看其他用户的信息
有几种方法可以了解社区的其他成员。会员列表功能和用户组提供了不同类型的用户列表,而“谁在线”功能提供了有关当前登录用户及其正在做什么的信息。
会员列表
如果用户想了解更多关于社区其他成员的信息,他们可以获取成员列表。点击成员列表顶部导航链接将显示所有注册用户的列表。此列表顶部有排序选项。例如,如果你想得到一个更“辣味”的列表,比如“嗯,谁发帖最多?”,你可以根据发帖数量进行排序。你可以选择总发帖数作为选择排序方法,并将顺序设置为降序。这将显示发帖最多的成员。
好吧,在我们的示例论坛中,只有管理员和 The Dude 的列表并没有什么特别之处,但随着社区的壮大,这可能会变得更有趣。以下是这种类型的成员列表报告在 phpBB.com 社区执行时的样子。

用户组
这是一个高级的 phpBB 功能,允许根据某些标准创建用户组。用户组由管理员定义,并分配一个组管理员。默认情况下,不存在任何用户组。用户可以申请加入用户组,并且根据配置(可能需要或不需要组管理员批准用户),会被批准。
谁在线
论坛首页的这个部分已经被提到。有趣的是,这里有一个隐藏功能——对于大多数人来说并不明显。那就是谁在线标题实际上是一个链接。(论坛分类标题也是如此。)

点击谁在线将显示一个特殊的“间谍”屏幕,这是公开可用的。这个巧妙的功能允许每个人看到其他人此刻在做什么。

这可能成为所有当前登录用户以及当前浏览网站的访客的长期列表。
管理员经验
到目前为止,你对论坛普通成员的视角已经有了相当好的了解。现在让我们看看如何在 phpBB 中如何使用管理员。首先,什么是管理员?抛开所有词典定义,管理员是比普通用户拥有更多发帖和话题权限的社区成员。管理员通常是受到尊敬的资深成员,他们自愿贡献时间和精力,使论坛成为符合管理员对社区愿景的讨论场所。
管理员是管理您网站的最佳助手,因此您应该确保您向他们明确任务并对其进行培训,以便他们在路上不会遇到任何技术困难。
为了更好地可视化本章讨论的内容,你需要一个管理员账户。你可以让 The Dude 用户成为管理员,或者你可以创建一个新用户并分配管理员权限。让我们以 The Dude 为例。
行动时间——将管理员权限分配给用户
-
以管理员身份登录。
-
前往管理面板。
-
在左侧菜单中,在用户管理下点击权限链接。
![行动时间——将用户权限分配给管理员]()
-
您现在在用户权限控制部分。
-
在文本框中输入The Dude并点击查找用户。
![行动时间——将用户权限分配给管理员]()
-
现在您可以看到一个设置 The Dude 权限的表单。
-
如图中所示,选择是管理员并点击提交:
![行动时间——将用户权限分配给管理员]()
发生了什么?
你已成功更改 The Dude 的授权级别;此用户现在是Test Forum 1的管理员。从您的管理员账户注销并作为 The Dude 重新登录,您就可以开始探索管理员能做什么了。
管理员可以承担两组任务;这些与管理帖子和管理主题相关。
管理帖子
现在,您以 The Dude 的身份登录,作为管理员,如果您查看任何帖子并查看帖子的操作区域,您将看到所有管理员可以对帖子执行的操作按钮。

编辑和删除
在本章前面已经讨论了从用户的角度编辑帖子并删除它们。对于管理员来说也是一样,只有一个简单但相当重要的区别:在默认的 phpBB 配置中,管理员可以编辑和删除任何主题的帖子,而不仅仅是他们自己的帖子。
编辑主题的第一篇帖子
当管理员编辑讨论中的第一篇帖子时,有一些额外的选项,因为第一篇帖子包含一些与主题相关的信息。例如,更改帖子的主题会更改主题的主题。
还有一些选项可以更改帖子的类型。主题类型的可能选项如下所示:

如果你将主题发布为公告或置顶,它将保持在主题列表的顶部。这两种类型之间有一个区别是显示在主题标题旁边的图标。另一个(更重要)的区别是,置顶主题显示在主题列表第一页的顶部,而公告则显示在所有列表页的顶部。这意味着,如果你的论坛中有如此多的主题以至于它们跨越了几个页面(默认情况下,每页有 25 个主题),则标记为公告的主题将显示在所有页面的顶部,而置顶主题仅显示在第一页的顶部。以下是一个置顶主题和公告的示例。

关于编辑主题的第一篇帖子,还有一点具体的是,您在编辑界面有删除它的选项。

如果帖子包含投票,投票也可以编辑或删除。

这里有一些关于编辑主题中第一条帖子的其他具体信息。尝试列出的情况是个好主意,只是为了确保你做起来感到舒适。
-
如果这是主题中唯一的帖子,并且你删除了它,主题也会被删除。
-
如果第一条帖子包含投票并且你删除了帖子,投票将保留。
-
如果你删除第一条帖子后还有其他帖子,主题将保留。主题的标题将保留从删除的帖子主题中。
-
投票可以从主题中安全移除,同时保持其他一切不变。
查看帖子的 IP 地址
如果你点击 IP 操作图标,你会看到 IP 信息屏幕。

你在这屏幕上看到的是用户的 IP 地址,使用此 IP 地址发布的用户列表,最后是其他 IP 地址列表(如果有)。以下是一些可能对你有用的信息:
-
IP 地址是一个数字标识符,每个连接到互联网的计算机都是唯一的。IP 代表互联网协议。全球的互联网服务提供商(ISP)在每次请求互联网连接时都会为其客户分配 IP 地址。这意味着如果你连接到互联网,断开连接,然后重新连接,第二次分配给你的 IP 地址可能与第一次不同。
-
如果你点击上述截图所示的查找 IP 地址链接,phpBB 将尝试解析(以更友好的形式表示)IP 地址。这个功能可能并不总是有效,因为并非所有 IP 地址都可以解析。在上面的例子中,数字 IP 地址将被解析如下:
![查看帖子的 IP 地址]()
IP 地址的最后部分(videotron.ca)提供了关于互联网服务提供商(ISP)的信息。一些公司有自己的 IP 地址,它们表现得就像它们自己的 ISP 一样。解析帖子的 IP 地址有时可以提供关于发帖人雇主或发帖人 ISP 的信息,或者如果没有解析出来,则没有信息。请记住:
-
一个用户可以与多个 IP 地址相关联,这很常见,因为 ISP 会更改分配给其客户的 IP 地址。此外,一个成员可以使用多个计算机和互联网连接来发布帖子(例如,家用电脑和办公电脑)。
-
几个用户可能使用相同的 IP 地址。你可能首先想到的可能性是某个人注册了新的用户名,并从这两个用户名中发帖。尽管这是一个可能的场景,但并不一定总是如此。两个用户可能有相同的 ISP(或者可能在同一家公司工作),因此可能有相同的 IP 地址。另一个解释是两个用户是朋友,其中一个人正在使用另一个人的电脑和互联网连接来发帖。还有另一个情况——两个用户从同一个互联网俱乐部(游戏俱乐部、互联网咖啡馆等)发帖。
-
在 IP 信息界面中,点击用户名会弹出用户个人资料页面。
-
在同一界面中,点击搜索按钮将列出特定用户的全部帖子。
管理主题
管理主题是版主拥有的、普通用户没有的第二组选项。管理主题的一种方法是通过更改此主题的第一篇帖子。这在本章前面的管理帖子部分已经讨论过(你可能想回去看看;这里讨论的其他选项都是与主题相关的)。
在每个主题的底部,版主可以访问四个操作图标,如下所示:

按照它们出现的顺序,它们的意思是:
-
删除主题:永久从数据库中删除主题。
-
移动主题:将主题从当前论坛移动到另一个论坛。另一个论坛指的是同一公告板中的论坛。
-
锁定主题:用户(除版主和管理员外)不能再在此主题中发帖。
-
拆分主题:将主题分成两个。
删除、锁定和解锁主题
所有这些选项实际上都很简单易用。你只需列出一个主题,然后选择相应的操作图标。phpBB 会要求你确认所选操作。就这样!解锁图标
仅在已锁定主题中显示。
移动主题
为了测试这个功能,你需要至少两个论坛。所以在你继续之前,让我们首先创建一个新的论坛。
行动时间——创建论坛
-
以管理员身份(你在安装时创建的用户账户)登录,然后点击转到管理面板链接。
-
在左侧菜单下,在论坛管理中点击管理。
![行动时间——创建论坛]()
-
在第一个字段中输入新论坛,然后点击创建新论坛。
![行动时间——创建论坛]()
-
你会看到一个新表单;保持原样,然后点击创建新论坛。
-
点击左上角的 phpBB 图标返回论坛。
发生了什么?
你已经创建了一个新的论坛。不用担心细节;它们将在本章的后面更详细地讨论。好的,回到移动主题。这仅仅涉及将一个主题移动到另一个论坛,这在有人在公告板上发帖位置不合适时通常需要。现在登出并作为 The Dude 重新登录。
主持人通过选择
操作图标来移动主题。以下确认屏幕会显示:

此屏幕允许主持人选择要将主题移动到的论坛。还有一个在旧论坛中留下阴影主题的复选框(默认选中)。选择此选项将在旧论坛中留下指向新位置的链接。链接看起来就像一个正常的主题,除了在标题前有已移动字样,如下所示:

拆分主题
有时讨论会偏离原始主题;在其他时候,人们在同一主题中讨论两个不同的问题——帖子开始重叠,难以跟随讨论。为了避免这种情况下产生的混淆,主持人可以将讨论拆分为两个主题。为此,主持人点击拆分图标
。以下是为拆分主题提供的特殊界面:

实际上,拆分主题涉及创建一个新主题来容纳一些已经存在的消息,同时从它们最初发布的主题中移除。因此,新主题需要一个标题,一个要居住的论坛,以及至少一个帖子。
拆分主题控制面板显示了一个用于标题的文本字段和一个下拉菜单来选择现有的论坛。每个帖子旁边都有一个复选框。有两种拆分选项:
-
要单独选择每个帖子。检查每个单独的帖子很耗时,但在完全重叠的两个单独问题讨论时这是一个选项。
-
选择一个帖子然后将其完整的讨论拆分。这在讨论在某一点上完全转向不同方向时适用。在这种情况下,选中的帖子是新主题的开始。
两个小贴士:
-
尤其是在负载很重的论坛上,在拆分主题之前暂时锁定一个主题是个好主意。这给主持人足够的时间重新思考细节,同时防止其他用户同时发帖并增加混乱。
-
请记住,新创建的主题的第一条消息的作者成为新主题的作者。
一同完成——主持人控制面板
phpBB 有一个名为主持人控制面板的功能,它提供了管理主题的所有上述操作的访问权限。要访问此界面,请点击位于每个论坛页面右下角的管理此论坛链接。

这就引出了“版主控制面板”界面(下一页截图):
-
此界面在每个主题旁边都有一个“选择”复选框,底部还有多个操作按钮。它允许您选择多个主题并对它们执行一次性操作。
-
点击主题标题会弹出“拆分主题”界面。
-
所有操作(删除、锁定、解锁、移动和拆分)的工作方式与本章前面已经讨论的方式完全相同,只是界面不同,以便一次更改多个主题。
以下截图显示了“版主控制面板”:

管理员体验
就是这个。您已经来到了最重要的部分——管理您的论坛。您已经看到了本章以及第二章中描述的一些之前的功能,但现在您需要采取更系统的方法,确保您了解您的管理选项以及如何使用它们。
本节将随后描述一些您可能比其他功能更频繁使用的 phpBB 管理基本功能。对于更高级和特殊的功能,请确保您阅读第五章,其中详细介绍了与安全相关的问题、表情符号、用户组和其他问题。
为了测试接下来将要描述的内容,您需要登录为具有管理权限的用户。您的论坛可以有多个管理员,但无论如何,至少存在一个管理用户账户——在安装 phpBB 时创建的账户。我们将使用此账户登录,点击“前往管理面板”链接,然后开始探索管理选项。
管理面板概览
“管理面板”有两个主要区域(在 HTML 术语中称为框架):
-
左侧的导航区域,其中包含指向所有管理选项的链接。它被分为类似选项的组,如论坛管理、用户管理等。
-
右侧的内容区域,当您从导航区域点击链接时,会加载适当的内容。
您的“管理面板”首页看起来如下所示:

“管理面板”首页还有一些关于论坛使用的通用统计数据,以及一个“谁在线”部分,其工作方式与访问者在论坛首页上可以访问的方式类似(参见本章前面的“访客体验”部分),只不过这个部分还有一个 IP 地址列。点击 IP 地址会将您重定向到一个第三方网站,该网站提供一些您可能认为有用的 IP 相关工具。
导航菜单的前三个选项相当直接,你可能想尝试一下,以便在浏览管理面板时感觉更舒适。它们实际上不是管理选项,而是指向论坛首页和管理面板的链接。左上角的 phpBB 标志也是一个链接,指向论坛的首页。
现在,让我们更仔细地看看导航菜单上的其他选项组。
论坛管理员
正如标题所说,这是一组供你管理论坛的选项,包括创建、编辑、删除或重新排列论坛及其类别,以及设置它们的使用选项和规则(称为权限)。
论坛管理
点击论坛管理员选项组中的管理链接会弹出论坛管理界面。此界面允许你创建、编辑和删除论坛,并将它们组织到类别中。
创建新论坛和类别
在版主体验部分已经简要讨论了创建新论坛的最简单方法。现在让我们更详细地探讨。以下截图显示了在上一节中添加了新论坛后的界面。如果你没有按照版主体验部分描述的操作进行,你将看到默认的 phpBB 外观,如下所示,只是没有新论坛这一行:

行动时间——创建新类别
-
在论坛管理界面的第二个文本字段中输入Fun。
-
点击创建新类别。
-
在创建类别后,点击点击此处返回论坛管理行中的链接。
发生了什么
你已经创建了一个新的空白类别(因为还没有包含任何论坛)。完成上述步骤后,论坛管理屏幕将如下所示:

在这一点上,因为新类别仍然是空的,访客看不到对论坛主页所做的任何更改。
现在让我们向新类别添加一些论坛。
行动时间——创建新论坛
-
在论坛管理界面中你刚刚添加的Fun类别后面的文本框中输入Funny pics。
-
点击创建新论坛。你现在会看到一个以下形式的表单:
![行动时间——创建新论坛]()
-
在描述字段中,输入网络上的搞笑图片集合。
-
保持类别下拉菜单不变。
-
保持论坛状态下拉菜单不变。
-
在自动修剪部分保持默认设置。
-
点击创建新论坛按钮。
-
点击链接点击此处返回论坛管理。在这个时候,我们正在重复练习,但有一些修改。
-
要开始创建另一个新论坛,输入Funny quotes,但这次在第一个文本字段中输入。
-
在描述字段中,输入这里您可以找到管理员觉得有趣的搞笑引言网站链接。
-
将分类下拉菜单中的值从测试分类 1更改为娱乐。
-
将论坛状态下拉菜单中的值从解锁更改为锁定。
-
在自动修剪部分,选择启用。
-
在自动修剪部分,将第一个文本值从7更改为30。
-
在自动修剪部分,将第二个文本值从1更改为7。
-
点击创建新论坛按钮。
-
点击点击此处返回论坛管理链接。
发生了什么
这里是您刚刚在管理面板中看到的结果:

这是您的用户将看到的内容——主页上更改后的版块:

现在,让我们退一步,看看确切发生了什么,使用与前面行动时间部分相同的数字:
-
您为您的新论坛提供了名称。
-
您启动了创建新论坛的过程。
-
您为您的论坛提供了描述。
-
您使用了 phpBB 提出的分类值。
-
您使用了 phpBB 提出的锁定/解锁论坛状态值(在这种情况下,解锁)。这意味着用户可以在此论坛中发帖。锁定,如您所知,意味着用户不能在论坛中发帖,但管理员和版主仍然可以。
-
您使用了 phpBB 的默认值自动修剪选项,即不使用此选项。如果您启用自动修剪功能,phpBB 将删除所有在指定时间内未活跃的主题。主题的不活跃是从最后发布到该主题的时间开始计算的。
-
您完成了新论坛的创建。
-
您返回到论坛管理界面。
-
您再次开始创建新论坛的过程并设置了标题。
-
您指定了论坛描述。
-
这次您没有使用建议的值,而是更改了论坛分类。这个分类是由 phpBB 提出的,因为您在步骤 9 中将论坛名称输入到测试分类 1下,而不是娱乐下。
-
您决定将此论坛锁定,以便用户无法发帖,但您仍然可以。
-
您已启用自动修剪选项。
-
您已设置 phpBB 应删除所有超过 30 天的主题,从本主题最后发布日期开始计算。
-
您已将 phpBB 设置为每七天检查一次主题以进行自动删除。
-
您完成了新论坛的创建。
-
您返回到论坛管理界面。
精细调整现有论坛和分类
在创建论坛后,可以进一步管理它——编辑、删除或相对于其他论坛在版块中的位置。
编辑
您可以通过点击位于分类/论坛标题旁边的编辑链接来编辑现有的分类或论坛。编辑表单看起来与创建新论坛的表单完全相同,并且以相同的方式工作。
删除
你可以通过使用它们标题旁边的删除链接来删除类别和论坛。这里有一个具体点:当你删除一个已经存在一段时间并且有人在其中发帖的论坛或类别时,你可能不想删除所有帖子。为了简化这个过程,phpBB 允许你在删除选定的主题之前,将现有主题移动到另一个论坛或类别。
当你删除一个类别时,你可以选择将所有论坛移动到新的类别,如下所示(此界面显示删除论坛和论坛名称,但实际上是指删除类别;你会在实际删除论坛的界面中看到区别):

当你想删除一个论坛时,你将有一个选项,可以将所有主题移动到另一个论坛。与类别删除不同,当你删除一个论坛时,你甚至可以选择删除主题和帖子。在使用此选项之前,请再次思考。删除你社区的发帖可能不是一个好主意。

改变显示顺序
你可以通过使用每个论坛或类别旁边的向上移动和向下移动链接来更改在论坛首页上显示类别和论坛的顺序。
行动时间 - 调整显示顺序
-
点击测试类别 1类别旁边的向下移动链接。
-
点击新论坛论坛旁边的向上移动链接。
发生了什么
娱乐类别现在是用户首先看到的第一个类别。此外,在测试类别 1中,你已经更改了论坛的顺序,使得新论坛在测试论坛 1之前显示。以下是调整后用户将看到的你的论坛。

使用 Resync 选项
如果你发现你的板上出现了奇怪的现象,请首先尝试使用Resync选项来恢复。无论出于什么原因,如果存在数据不一致的情况,Resync将尝试将数据恢复到一致状态。
Resync 不会对论坛数据造成损害。所以请不要担心,你不会破坏任何东西。(好吧,不要将最后一句话当作挑战。)如果你对是否应该使用此选项有疑问,只需使用它即可。另一方面,如果你发现自己经常使用它,可能存在其他问题;隔离症状,并在 phpBB 社区论坛上寻求解决方案。
谁能做什么——设置论坛权限
phpBB 对运行论坛的安全方面非常重视。这就是为什么有一个强大且选项丰富的权限和用户特权系统。你将在第五章中找到有关权限系统的更多详细信息,该章节包含了一些高级 phpBB 特性的细节。你还可以在 phpBB 用户指南中找到更多信息。所以在你开始玩弄权限之前,确保你知道你在做什么。现在,我们只是快速查看一下最常用的权限,并将细节留到以后。
设置论坛权限有两种模式:简单和高级。使用简单模式,你可以从预设值列表中选择权限模式(一组高级权限组合在一起以便更容易使用)。简单模式的一些示例选项是“公开论坛”、“注册用户论坛”和“隐藏论坛”。
这些简单选项是由 phpBB 团队精心分析和选择的,因此在使用它们而不是高级选项之前,这可能是最安全的事情,直到你能够舒适地管理论坛和用户权限。让这个规则成为你的指导原则:除非你有充分的理由不这样做,并且你知道你在做什么,否则请使用简单模式。
最常用的两种简单模式选项是“注册用户”和“公开”。为了有一个大致的了解,在一个“公开”论坛中,访客不需要是注册用户就可以发帖。在一个“注册用户”论坛中,只有注册用户可以发帖。在这两种情况下,只有版主和管理员可以使用更高级的功能,如指定主题类型(置顶和公告)或编辑和删除其他人的帖子。
默认情况下,phpBB 创建的所有论坛都是公开的。一个良好(且常见)的做法是在创建论坛后将其权限更改为“注册用户”。
时间行动——在简单模式下设置论坛权限
-
从左侧导航中的论坛管理选项中选择权限:
![时间行动——在简单模式下设置论坛权限]()
-
选择搞笑图片论坛并点击查找论坛按钮。
-
从简单模式选项下拉菜单中选择注册用户并点击提交。
![时间行动——在简单模式下设置论坛权限]()
刚发生了什么?
现在,只有注册用户被允许在“搞笑图片”论坛中发帖。你是通过在简单模式下设置 phpBB 权限来做到这一点的。
修剪
修剪是一个允许你清理旧的不活跃主题以释放数据库空间的特性。你已经看到了自动修剪功能是如何工作的。修剪与自动修剪的不同之处在于,它是你主动发起的,而不是自动完成的。
在使用此功能之前三思而后行——删除主题是不可逆的!您确定不再需要这些主题了吗?请记住,您的社区成员已经花费了大量时间撰写所有这些帖子。您想扔掉他们的帖子吗?在删除人们的主题之前,考虑购买更多的数据库空间。如果您仍然肯定想要修剪帖子,以下是方法。
行动时间—修剪论坛
-
从左侧导航菜单中选择论坛管理员选项中的修剪。
![行动时间—修剪论坛]()
-
如果您想清理所有论坛,请选择所有论坛。您还可以选择修剪单个论坛。
-
输入30作为天数。
-
点击执行修剪。
发生了什么?
您刚刚删除了所有论坛中超过 30 天未活跃的主题。这是此操作的样本结果,这是关于删除了多少主题和帖子的报告。

使用常规管理员选项进行系统管理
现在让我们转到常规管理员选项组,它允许您执行基本的系统管理任务。
配置
您可以通过点击左侧导航菜单中的常规管理员选项下的配置链接来访问常规配置选项。(不用担心跳过备份数据库;这个选项的描述稍后会有说明。)

这将打开包含非常基础的论坛设置的“常规配置”表单,例如域名、启用私人消息等。您已经从第二章中了解了这些设置。
数据库备份和恢复
做数据备份是个好主意,以防万一出了什么问题。您的托管提供商可能会制作这样的备份副本;您也可以使用 phpMyAdmin 或使用 MySQL 命令行工具进行备份。如果您使用的是不同的数据库系统,您可能有其他选项。如果您可以访问 phpMyAdmin,请使用它。如果您的托管提供商正在制作副本,了解他们的频率和恢复数据库所需的工作量。不要让数据丢失是您的责任,这应该被认真对待。
惊吓到你了吗?很好。现在,让我们看看好消息:如果您担心没有访问数据备份工具的权限,请放心,phpBB 为您提供了数据库备份工具。有时这可能成为您的唯一选择,所以让我们来看看。
行动时间—备份您的论坛数据
-
从导航菜单中点击备份数据库。
-
在您看到的备份选项表单中,点击开始备份,保留所有值为默认。您会看到一个请等待的消息。
-
一个文件对话框会询问您如何处理请求下载的
phpbb_db_backup.sql文件。将此文件保存到您的计算机上的一个选定的文件夹中。
发生了什么
你刚刚创建了一个包含数据库 SQL 指令的备份文件,并将其保存在你的电脑上。妥善保存这些备份文件是个好主意,通过使用合适的文件名和目录来保持它们有序。例如,文件名可以包含备份创建的日期。偶尔,将这些文件烧录到 CD 上;你永远不知道你的电脑何时会崩溃,导致你丢失数据备份。
行动时间——从备份副本恢复数据库
-
在管理面板的左侧导航菜单中点击 恢复数据库。
-
定位一个现有的备份副本文件(你可以使用在前一个练习中创建的
phpbb_db_backup.sql文件)。 -
点击 开始恢复。
-
如果一切正常,你会收到一条消息,表明恢复成功。
发生了什么
你已从保存在你电脑上的备份副本中恢复了你的论坛数据库,其中包含所有配置、论坛、主题、用户:简单来说,就是你的论坛运行所需的所有数据。
根据数据库的大小,执行备份和恢复操作所需的时间可能会有所不同。对于非常大的数据库,这些操作可能会因为你的主机提供商施加的一些服务器限制而失败。如果你遇到问题,请务必阅读第五章以获取有关数据库备份和恢复选项的更多信息,并在 phpBB.com 或 phpBBHacks.com 论坛上寻求建议。
大规模邮件
你可以使用 phpBB 向所有用户或单个用户组发送电子邮件。这个功能非常容易使用:你只需从左侧菜单中选择 大规模邮件 链接,选择收件人,输入主题和消息正文,然后点击 电子邮件 按钮。这可能会向所有用户发送电子邮件。
“希望如此”,因为有可能这个功能对你不起作用。由于所有这些发送垃圾邮件(即垃圾邮件)的人,互联网提供商和主机公司正在采取措施反对所有看起来像大规模邮件的东西。所以如果你数据库中有大量用户,或者你的主机有严格的邮件使用规则,你可能无法向用户发送大规模邮件。
如果尝试发送邮件而不进行任何配置更改失败,你可以尝试使用你的 ISP 的 SMTP 服务器。邮件设置位于“配置”链接下的“一般管理”部分。
phpBB 邮件发送器的工作方式是将所有收件人添加到 BCC 中。想象一下你在你最喜欢的电子邮件环境中发送一封普通电子邮件。现在想象你将所有用户添加到 BCC(盲碳拷贝)字段中。结果是:邮件被发送给所有收件人,他们无法看到 BCC 列表上的其他人。
表情符号
你知道笑脸,那些可爱的小图标(也称为表情符号),你可以用它们来让你的帖子更加生动,并表达一些情感,同时也可以给读者一个提示,了解如何对你的文本做出反应。好消息是:phpBB 默认自带一套笑脸包,并且足够灵活,允许你添加、编辑和删除成员在帖子中使用的笑脸。
点击通用管理选项组中的笑脸,将弹出笑脸编辑工具。

编辑或删除笑脸非常简单。只需使用每个笑脸旁边的相应链接即可。你还可以添加新图标,甚至可以添加包含在特殊文件(.pak)中的新图标批量。更多相关信息请参阅第五章。
使用词汇屏蔽过滤词汇
phpBB 允许你屏蔽成员在帖子中使用的词汇。屏蔽意味着用一个不那么糟糕的词汇替换一个糟糕的词汇。实际上,这不必是一个单词本身;它可以是一个单词的一部分或一个短语。
行动时间——创建词汇过滤器
-
点击导航菜单上的词汇屏蔽链接。
-
在新屏幕中,点击添加新词汇。将出现一个新的表单:
![行动时间——创建词汇过滤器]()
-
在词汇字段中输入The Dude Sucks。
-
在替换字段中输入The Dude Rocks!。
-
点击提交。
发生了什么
你为发布文本引入了一个新的词汇替换过滤器。现在你可以前往论坛前端测试这个功能的效果。
一些附加信息:
-
你选择屏蔽的词汇不仅会在发布文本中屏蔽,还会在帖子/主题标题、私信、用户名、投票答案和投票问题中屏蔽。
-
词汇替换仅在显示时进行。在数据库中,phpBB 存储原始文本。所以如果你决定移除词汇屏蔽,原始文本将开始显示。
-
你可以使用 ***** 通配符来匹配部分单词。在之前的例子中,如果你选择匹配并替换 The Dude su*,这将匹配所有类似短语,如 The Dude sukz, The Dude sux 等,并且所有这些都将被替换。
用户管理简介
管理用户是一项你可能经常做的活动。有时用户会遇到资料问题、忘记密码、不再能访问旧电子邮件账户等问题。这时,你需要介入帮助用户。
如标题所示,本节是一个介绍,只包含你可能会频繁使用或不太常用的功能。更高级和较少使用的功能将在第五章中讨论。
编辑用户资料
要编辑用户资料,点击用户管理选项中的管理链接。

您已经熟悉基于用户名选择用户的屏幕。如果您不确定用户名的拼写,请使用查找用户名功能。

在您输入(或找到)用户名后,点击查找用户按钮将显示用户资料。编辑资料的表单与用户在论坛前端看到的相同,只是增加了一个仅管理员可见的特殊字段部分:

选项相当直观:
-
您可以停用用户,这样用户就无法再登录了。
-
您可以禁止此用户使用私人消息或头像。禁止使用 PM 意味着用户不能发送 PM,但可以接收其他用户的 PM。
-
您可以为用户分配一个等级(等级和头像将在后面进一步讨论)。
-
您可以删除此用户。
删除用户
要删除用户,按照上述说明操作,然后在编辑表单底部勾选删除此用户?复选框,并点击提交。删除用户是永久的;您无法撤销。然而,删除用户并不意味着删除用户发布的所有帖子。当用户被删除时,该用户的所有帖子都变为“访客”帖子。此时,用户名被回收并可用于新的注册。
权限
设置用户权限的界面可以通过在用户管理导航组中的权限链接访问:

您将再次看到熟悉的选择用户表单。选择要编辑的用户后,您将看到用户权限控制屏幕:

在这里,您可以选择将此用户设为管理员,这将自动给用户访问管理面板的权限,并将用户设为所有论坛的版主。简而言之,这意味着用户将拥有与您完全相同的权限。
另一个选项是按论坛选择性地将用户设置为版主。您已经这样做过了;还记得您是如何在版主体验部分开始时将 The Dude 设为版主的吗?
在这里,简单权限列是空的。如果您点击高级模式,详细权限也是如此。这是因为这些选项仅适用于私人论坛,并且列出的论坛中没有私人论坛。私人论坛和详细权限将在书中进一步描述。
禁止用户
是的,这不是一项愉快的任务,淘汰用户。但你能怎么办?这就是生活,事情就是这样发生的。世界上有各种各样的人,有时隐藏在网络的匿名性背后,有些人开始做一些他们通常不会做的事情。比如使用糟糕的语法。或者忘记在星期四发帖。当然,只是开个玩笑。
无论如何,想法是,由你来定义你特定社区的不当行为,但到了最糟糕的时候,你最好知道你的选择。
要访问禁止控制界面,请使用左侧导航菜单中的用户管理下的禁止控制链接。

禁止用户的界面一开始可能有些令人困惑,但实际上它有助于快速了解当前定义了哪些类型的禁止。表单由三个包含两个表单字段每组的三组组成。这三组代表禁止用户的三种方式,两个字段分别用于添加和移除禁止。表单本身包含有关可用选项的一些帮助信息。

当你使用任何三种方法之一禁止用户,并且用户尝试访问论坛时,他们将看到以下消息:

禁止用户
虽然你可以在造成损害之后禁止用户,但禁止某些用户名是一种预防措施。当一个用户名(或其一部分)被禁止时,它不能用于注册。因此,这个功能在用户名被占用之前使用,以防止其被占用。禁止用户名的表单包含添加和移除规则的界面。该表单可通过左侧的禁止名称链接访问。

以下示例展示了如何禁止以 Mod(如版主)或 Admin 开头的一切,以防止冒名顶替者使用暗示他们不仅仅是普通用户,而是拥有特殊社区权力的用户名。

摘要
概述 phpBB 的基本功能是一项漫长的旅程。这是真的,因为 phpBB 是一个功能丰富的公告板系统,为所有用户类型——普通成员、版主和管理员——提供了很多灵活性。从哲学的角度来看,理论上和实践上都知道,更大的灵活性往往伴随着复杂性的增加。但对于 phpBB 的大多数功能来说,情况并非如此,因为它们真的很直观且易于使用。
如果你完成了本章中的行动时间部分,你现在应该对你在新的 BB 上如何运作有一个相当好的了解。如果你没有做练习部分,现在是你回去做它们或者只是把书放一边,开始尝试使用你最喜欢的公告板系统 phpBB 的时候了。
第四章:自定义您的论坛
现在你已经安装了 phpBB 并在管理控制面板中积累了一些经验,你准备好开始改变论坛外观和功能的更高级方面了。改变这些 phpBB 区域对于给你的论坛赋予一个独特的身份,使其在在线论坛中脱颖而出至关重要。论坛的外观主要受 phpBB 的样式系统控制,该系统管理论坛的颜色、图像和视觉布局。可以通过安装从 phpBB 相关网站下载的修改脚本来添加、删除或更改功能。
到本章结束时,你将了解以下内容:
-
phpBB 2.0 样式的基础
-
编辑 phpBB 文件的正确方法
-
如何添加和删除样式
-
常见的样式安装问题
-
自定义样式的途径
-
创建和修改样式的益处
-
更改论坛图像的方法
-
如何添加新的论坛功能
phpBB 样式
如果你查看几个不同的 phpBB 论坛,你可能会注意到每个论坛都有一些差异。它们可能使用不同的颜色和图像,以不同的顺序显示功能,或者完全省略某些功能。通过使用不同的 phpBB 样式,可以实现这些多种效果。phpBB 的样式是由布局、颜色和图像的组合创建的论坛外观。当你安装 phpBB 时,默认样式 subSilver 也被安装了。subSilver 是在 phpBB 论坛上最常用的样式,但已经公开发布了超过两百种不同的样式。论坛通常提供多个样式供用户选择。
注意
在处理 phpBB 时,你有时会看到术语样式、主题和模板被互换使用。在本章中,主题和模板被定义为整体样式的两个较小方面,以减少混淆。这是在 phpBB 的代码和管理控制面板中最常使用这些术语的方式。即使后者有时也会用主题代替样式。
样式的结构
为了有效地自定义样式,你必须首先了解构成该样式设计的各个部分。样式,就像房子一样,是由更小的组件构成的,这些组件共同工作以形成一个框架。这个框架,就像房子的墙壁一样,为显示论坛的内部内容提供了一个结构。这些框架可以是非常复杂的创作,所以在我们进入样式的实际自定义之前,让我们看看这些基本部件是如何组合和存储的。
样式元素
样式由三个主要的样式元素组成,或更小的部分,它们共同工作以创建样式的整体视觉外观。这些是模板、主题和图像集元素。每个样式都是自包含的,并包含所有必要的样式元素以正确运行。
风格的第一部分也是最重要的部分是模板元素。模板元素是一组包含用于生成论坛视觉布局的全部标记的文本文件。标记主要由超文本标记语言(HTML)和 phpBB 自己的特殊模板功能组成,但也可以包括客户端脚本语言,如 JavaScript。模板文件用于安排论坛显示的大部分信息。你可以通过查看文件名来识别模板文件;所有模板文件都以tpl结尾。一些例子包括index_body.tpl、viewtopic_body.tpl和message_body.tpl。尽管这种情况很少见,但多个风格使用一组模板文件,具有不同的主题和/或图像集是可能的。
论坛风格的主题元素是一组用于定义论坛视觉装饰的格式化规则。主题最常见的用途是指定字体、颜色、背景颜色和页面元素的边框。主题元素可能难以定位,因为它们可以存储在三个不同的位置。大多数风格将主题数据存储在一个或多个层叠样式表(CSS)文件中,例如subSilver.css和formIE.css。CSS 文件的名字会随着每个论坛风格的不同而变化,但很多时候,至少会有一个以论坛风格命名的 CSS 文件。一些风格将它们的 CSS 格式化规则放在overall_header.tpl模板文件中,而不是单独的 CSS 文件中。其他可能结合使用overall_header.tpl技术和某些值的数据库存储。subSilver 风格使用组合方法,但也包括一个可以在手动更改后使用的 CSS 文件。
图像集元素包括构成某种风格的全部图像。一些例子包括文件夹图像、投票结果条形图以及“回复”和“新主题”等特定语言的按钮。还有一些图像主要用于装饰目的,例如背景或页眉图像。装饰图像有时被视为主题的一部分,而不是图像集的一部分。
除了已经讨论过的模板文件之外,模板元素还可以包含与主题和图像集元素相关的两个特殊配置文件。主题配置文件theme_info.cfg用于保存与模板关联的主题数据库数据。这些保存的数据可以在以后导入到另一个论坛的数据库中。在大多数情况下,你很少需要编辑此文件。它通常是自动生成或按需提供的。第二个配置文件包含模板配置数据。在大多数情况下,这仅仅是一个列表,列出了风格图像集中的图形文件。这些模板配置文件的名字基于它们匹配的模板,例如subSilver.cfg。
风格存储
论坛上所有可用的样式细节都存储在论坛的 SQL 数据库中。数据库仅包含已安装样式的列表、每个样式的相关模板元素名称以及一些有限的主题数据。不会在您的数据库中存储图像集数据。
另一方面,样式元素存储在论坛文件系统的 templates 目录中。templates 目录包含唯一命名的子目录,每个子目录对应一组模板文件。templates 的每个子目录将包含一个或多个样式的模板、主题、图像集和配置文件。在安装或创建新样式之前,templates 中唯一的子目录将是 subSilver。
在大多数情况下,templates 目录将包含另外两个子目录:admin 和 images。admin 子目录将包含用于显示管理控制面板的模板文件。images 子目录将包含样式使用的图像集,并且可能包含以语言命名的子目录,例如 lang_english 或 lang_dutch,用于显示不同语言的文本。一些更高级的样式可能包含除 admin 和 images 之外的其他目录。
编辑 phpBB 文件
在本章中,您将学习并使用一项新的技能,这对您作为 phpBB 论坛管理员来说非常有用。您已经了解了一些通过管理控制面板可用的强大配置和功能,但还有很多更多,这些功能只能在编辑 phpBB 的文件时访问(或在某些情况下添加)。在更改文件时,您必须小心遵循适当的程序,因为 phpBB 是一组精致且复杂的脚本。这样做可以节省您很多麻烦,正如许多人亲身体验的那样。
注意
您将在本书的几个后续部分再次提醒这些程序。在手动编辑任何文件之前,尽量遵循这些程序,即使没有提醒。这一点非常重要,因为这些程序在处理问题时可以节省您大量时间。
在编辑任何文件之前,您应该做的最重要的事情是备份该文件。这仅仅意味着创建文件当前状态的副本。如果您在编辑后遇到问题,可以使用备份替换已编辑的文件。这将有效地将您的论坛恢复到文件预编辑状态。在您的 phpBB 体验中,您肯定会需要使用文件的备份。每个人在某个时候都会犯错误,这没有什么可羞愧的。在其他时候,事情可能根本不起作用。无论原因如何,如果您在执行任何操作之前进行备份,那么对 phpBB 论坛来说,很少有错误是永久致命的。
当你编辑 phpBB 文件时,使用正确的程序类型非常重要。phpBB 使用三种类型的文件:图形文件、包含程序代码的文本文件和包含显示代码的文本文件。图形文件是你在任何网站上都会看到的标准图像文件,应该使用 Jasc Paint Shop Pro、Adobe Photoshop 或其他能够处理它们的任何程序进行编辑。然而,文本文件是特殊的。在图形文件中犯错误不会损坏你的论坛,但在显示代码文件或程序代码中犯错误可能会轻易地破坏你的论坛。
phpBB 的所有程序代码文件都包含操作和显示 phpBB 论坛和网站所有方面的必要脚本。它们是 phpBB 的骨架。这些文件可能有.php、.inc或.cfg的文件名扩展名,并且是在 Unix 文本文件格式中创建的纯文本文件。这主要意味着在编辑文件时,你需要使用能够理解 Unix 文本格式的程序。大多数简单的文本编辑软件都不会有问题。Microsoft Notepad,可能是 Microsoft Windows 操作系统中最常用的文本编辑器,无法完全理解 Unix 格式。它将 Unix 文本文件的所有内容显示在一行上,所以 Notepad 不是 phpBB 管理员的最佳选择。WordPad 编辑器,也包含在 Microsoft Windows 中,能够无任何问题地读取 Unix 文件。大多数专门的 phpBB 程序员使用具有与 PHP 编程语言相关的特殊功能的更高级的文本编辑程序。一些流行的例子是 EditPlus、TextPad 和 PHPEdit,但还有更多可供选择。然而,对于这里的示例,你可能不需要比 WordPad 更复杂的任何东西。
显示代码文件是模板元素的.tpl文件和之前我们了解过的主题元素的.css文件。像程序代码文件一样,这些是保存为 Unix 文本文件格式的纯文本文件。对于本章的示例,我们再次选择 WordPad 来编辑这些文件。有一些专门的 HTML 编辑程序,如 Dreamweaver MX,可以用来编辑模板文件。这些程序往往会产生与解决的问题一样多的问题,所以你可能现在想避免使用它们,除非你非常熟悉你选择的程序。
最后,关于编辑程序和显示代码文件还有一个注意事项。在保存这些文件时,你需要确保以正确的文件格式保存。这些应该是纯文本文件,所以你必须以那种格式保存。要在 WordPad 中保存编辑后的 phpBB 文件,只需点击保存工具栏图标或从文件菜单中选择保存。WordPad 应该自动正确保存文件。如果你必须选择另存为,确保在保存类型选择列表中选择文本文件。
注意
Microsoft WordPad 可能能够读取 Unix 文件格式,但它不会以该格式保存文件。相反,它以 个人电脑(PC)格式保存文件。
安装新样式
修改您论坛外观的最简单方法之一是下载并安装一个新的 phpBB 样式。基于色彩方案、热门电影、电视节目、爱好、运动等主题,已经创建了数百种不同的样式。这些样式中,大多数可以免费下载和使用,尽管也有一些商业样式和样式设计师。提供样式下载的一些网站还提供演示论坛,您可以在不下载任何内容的情况下预览任何样式。下载 phpBB 样式的两个最佳网站是:
-
phpBB 样式数据库:
-
phpBBHacks 模板数据库:
www.phpbbhacks.com/templates.php。注意
记住,一些在线社区在提到一个完整的样式时,使用的是“模板”或“主题”这样的术语,而不是样式元素的名称。phpBBHacks.com 通常就是这样使用“模板”一词的。
确保选择与您使用的 phpBB 版本兼容的样式。上述两个网站将列出每个样式的兼容 phpBB 版本,但其他网站可能不会。此外,请记住,一些其他网站携带用于与内容管理系统(如 PHP-Nuke)一起使用的特殊移植版本的 phpBB 样式。这些样式将不与原始口味的 phpBB 论坛兼容,反之亦然。
一旦您选择了并下载了新的样式,您需要将样式安装到您的论坛上。如果一切准备妥当,安装过程并不困难。但如果过程或样式的创建处理不当,您可能会觉得有些令人畏惧。
大多数下载将以 ZIP 文件格式提供。在您能够安装下载的样式之前,您需要解压缩 ZIP 文件。您可以使用各种软件程序来完成这项任务。如果您以 ZIP 文件格式下载了 phpBB,您可能已经熟悉了解压文件的过程。即使您不熟悉,也有许多解压软件程序可供下载。其中一些更著名的名称包括 WinZip、WinAce 和 WinRAR。其中一些,如 ZipGenius (www.zipgenius.it/) 或 XAce,是免费的。WinZip 有一个向导模式,非常易于使用,所以我们在这里不会详细讨论解压过程。
创建副本样式
为了说明目的,本章将讨论一个名为 subBook 的示例样式的使用。这个样式不是下载和解压的,而是作为 subSilver 样式的快速重命名副本创建的。如果您想创建自己的 subBook 样式以便跟随,请按照以下简单说明操作。
行动时间——创建副本样式
-
复制
templates/subSilver目录。该复制应包含在subSilver下找到的所有相同文件。 -
将复制目录的名称更改为
subBook。 -
将
subSilver.cfg和subSilver.css文件分别重命名为subBook.cfg和subBook.css。 -
打开
theme_info.cfg文件进行编辑。在这个文件中,您将看到subSilver被多次使用。将每个实例更改为subBook。请注意,不要删除或更改文件中的其他任何内容。记住要遵循您之前学到的正确编辑程序。 -
subSilver 样式的名称在您的
subBook目录中的模板文件内大约有四十到五十行被引用。确切文件和次数取决于您使用的 phpBB 2.0 版本。当我们从 subSilver 创建新样式时,我们需要将这些引用更改为新样式的名称(在我们的例子中是 subBook)。显然,这一步骤将花费一些时间。这不会影响我们的安装或卸载示例,因此您现在可以跳过大部分内容。一些高级文本编辑器具有特殊的搜索和替换功能,可以帮助您更快地完成这项工作。至少,您应该在overall_header.tpl文件上执行这些步骤。 -
保存并关闭所有打开的文件。
发生了什么?
phpBB 可用的所有样式都是以存储在 templates 目录中的一组文件为基础的。创建新样式的最简单方法是将其他样式的文件复制过来,并对其中一些复制的文件进行一些修改。这些文件是配置文件,例如 subSilver.cfg 和 theme_info.cfg,phpBB 使用这些文件来安装和管理样式。在这种情况下,层叠样式表文件 subSilver.css 也被重命名了。因此,overall_header.tpl 中对 subSilver.css 的引用也必须更改为该文件的新名称。完成这些步骤后,您将获得一个新样式,您可以随意编辑它,而不会影响您论坛的其他样式。
逐个安装元素
一旦您有了要安装的新样式,无论是从下载还是复制 subSilver,您都需要将此样式的目录和文件放入您论坛的 templates 目录中。phpBB 的管理控制面板可以自动检测放入此目录的所有样式。如果您的论坛位于远程服务器上,就像大多数论坛和网站一样,那么您将必须通过您的网络托管公司支持的一种方法将目录和文件上传到该服务器。这通常是通过 文件传输协议 (FTP)、SSH 或其他设置。一旦您将文件复制或放入 templates,您已经完成了样式安装的三分之二:

将新样式的文件放置在您的论坛文件系统中后,您现在可以通过 phpBB 的管理控制面板安装样式。使用管理员账户登录到您的论坛,并进入控制面板。在导航菜单框架中,滚动到样式管理部分。这里有几个选项;目前我们只对添加链接感兴趣。点击此链接进入样式管理页面。
样式管理页面列出了 phpBB 在您的templates目录中检测到的所有未安装的样式。您可能会注意到这个页面既使用主题也使用样式来指代样式。这种混淆源于我们只是通过将它们放置在templates目录中来安装了图像集和模板样式元素。剩下的只是安装主题元素,从而完成样式的安装。要安装主题,只需点击列表中条目旁边的安装链接。现在,phpBB 将在用户资料和 phpBB 配置页面中找到的下拉选择列表中显示该样式:

故障排除
phpBB 是一套复杂的脚本,所以即使是像安装样式这样简单的事情也可能给您带来问题。这些问题有很多原因,从设计师的错误到文件复制错误,但所有这些问题都很容易解决。让我们来看看论坛管理员在过去遇到的一些更常见的问题。
样式未出现在管理中
如果您已经将样式复制到templates目录中,但在样式管理页面中看不到该样式,通常是因为样式目录中应该存在的theme_info.cfg文件有问题。请确保此文件已被复制,并且文件名没有更改。如果文件存在且命名正确,那么问题可能出在文件内部。一些样式在分发时此文件中存在错误。
打开theme_info.cfg进行编辑。它应该类似于下图中显示的 subSilver 文件。请注意,每一行都以$subSilver[0]开头,后面跟着其他字符。subSilver部分非常重要,必须与样式的templates目录的名称完全相同,并且不能包含任何空格。当然,每个模板的名称都会不同。phpBB 会将所有这些视为完全不同的事物:
-
subSilver -
sub Silver -
Subsilver -
SubSilver -
subsilver

这张截图显示了一个未修改的 subSilver theme_info.cfg的部分。在这种情况下,只有我们的第一个选项subSilver是正确的。检查theme_info.cfg的每一行,并对文件进行必要的更正,或者如果需要,重命名样式的templates目录。在某些情况下,后者将是纠正问题的更简单方法。其他样式将在目录和theme_info.cfg中使用不同的名称,但这两个地方的名字必须相同。
配置文件无法打开
有时 phpBB 可能难以找到模板元素的配置文件。当这种情况发生时,无论是安装期间还是正常论坛操作期间,论坛都会向用户显示一个严重错误消息,如以下图所示,提到模板的名称。这个名称是错误消息的一个重要部分,因为它告诉你 phpBB 使用了什么名称来查找配置文件。当模板名称显示为 subSilver 时,phpBB 在templates/subSilver目录中找不到名为subSilver.cfg的文件。同样,名称 subBook 意味着 phpBB 在templates/subBook目录中查找subBook.cfg。这里的模式应该是清晰的:

为了修复这个错误,你需要确保 phpBB 可以找到相关的文件。就像样式在“样式管理”中未出现时的错误一样,实际文件和目录的名称必须与错误信息中的名称完全相同。Subbook不等于subBook。首先,在templates目录中查找,并确保存在一个具有模板名称的子目录。接下来,在该子目录内查找模板配置文件。如果目录或文件名称错误,将它们重命名为正确的拼写应该可以修复错误。
如果没有名为templates的子目录,或者即使接近正确名称的子目录,有两种方法可以暂时修复错误。第一种方法是重命名另一个子目录(以及其中的模板配置文件)为 phpBB 试图找到的名称。在这样做的时候,一定要记下原始名称,以便稍后快速更改回来。第二种方法更好,即复制另一个模板并重命名它。这个步骤与本章前面“创建副本样式”部分中的步骤相同,只是你不需要编辑theme_info.cfg文件。在暂时修复了问题后,你可以尝试卸载有问题的样式,或者找到更持久的解决方案,比如替换样式的templates文件。
删除已安装的样式
在某个时候,你可能会决定要从你的 phpBB 论坛中删除你添加的风格。与安装风格相比,这是一个更简单的过程。删除风格有两个步骤:从数据库中删除风格和主题信息,以及删除风格的templates目录。
在管理控制面板中,将导航菜单向下滚动到风格管理部分。点击管理链接将加载一个风格管理页面,列出论坛上当前安装的风格。它看起来与你已经见过的安装页面非常相似。通过点击某个风格旁边的删除链接,你将从论坛的 SQL 数据库中删除与该风格相关的所有信息。在真正删除之前,你会被要求确认删除。任何在个人资料中选择了风格的用户,在删除该风格后,他们的选择将自动更改。他们的个人资料设置将被更改为管理控制面板常规配置页面上的板默认风格。
注意
如果你论坛上只安装了一种风格,你就无法删除它。你也不能删除板默认风格

删除风格的第二个方面需要删除该风格相关的子目录,该子目录位于templates目录中。这通常是通过与安装时将风格复制到templates目录相同的方式进行。由于可能有多个风格使用单个模板或图像集元素,并且具有不同的主题,你应该确保删除这些文件不会损坏你在管理控制面板中未删除的任何风格。
创建或定制
到目前为止,我们只看了安装已经存在的新的风格。然而,这只是我们改变 phpBB 外观的众多方法之一。我们的其他两种选择是创建一个全新的风格或定制已经安装的风格,比如 subSilver。这两种选择都有一些优点和缺点。
创建一个新风格真的可以为论坛注入活力。如果你的论坛外观独一无二,你的访客更有可能记住它。你可能记得自己过去访问过的某些独特外观的网站。此外,你不必花时间浏览数百种现有的风格来寻找你喜欢的或与论坛主题搭配得好的风格。有时你可能甚至找不到适合你主题的风格!自己创建风格的诱惑很大。
另一方面,创建一个新的风格是件很费劲的工作!对于正常的 phpBB 操作,需要许多图形,你可能想要用你自己的图形替换它们中的大部分。你可能甚至想要创建新的图形并修改模板文件以创建新的视觉效果。本质上,你将设计一个完整的网站。如果你不是经验丰富的网页设计师或图形艺术家,你可能觉得这项任务超出了你当前的技术水平。
当你自定义现有的风格时,与创建一个新的风格相比,你会节省很多时间。现有的结构将已经完整,除了你想要做的任何更改。你可以快速替换任何图像或颜色来改变论坛的氛围,正如你将在本章后面看到的那样。原始风格创建者的工作将作为指导,帮助你发展知识。然而,如果你自定义了一个风格,那么相同的现有结构将限制你,除非进行大幅度的更改。很可能自定义的风格将与原始风格有相似之处,许多人会一眼就能看出。
那么,哪种方法更好?这实际上取决于你想要改变论坛外观的程度。有很大可能性,你可以找到一个现有的风格来自定义,它不会对你限制太多。然而,如果你看了足够多的风格,你会发现其中许多至少部分基于原始的 subSilver 风格。对于独特的东西,你必须创建一个新的风格。
在本章的剩余部分,我们将学习如何自定义现有的风格。然而,示例将使用本章早期创建的 subBook 风格。这种方法将允许我们保留论坛的原始 subSilver 风格,同时对我们选择的 subBook 副本进行任何更改。
在第六章中,我们将详细讨论设计一个全新的风格。
注意
如果你之前没有创建和安装 subBook,或者没有替换 subBook 模板文件中所有 subSilver 名称的使用,你现在可能希望这样做。如果你喜欢,你可以使用 subSilver,但这可能会导致你的论坛在后续章节的示例和截图中看起来与它们大不相同。
通过样式表进行自定义
修改论坛外观的最快方法是更改其颜色、字体和其他视觉(但非图形)装饰。当我们之前查看风格的基元素时,我们了解到主题通过层叠样式表(CSS)的格式化规则定义和控制这些概念。CSS 格式化规则向使用 HTML 等标记语言结构的文档添加风格数据,例如字体、颜色、大小、边框和间距的规范。由于 phpBB 创建此类文档以显示论坛,因此更改论坛外观这些部分的推荐方法是 CSS。
CSS 规则可以存储在三个不同的位置:在外部 CSS 文件中,例如 subBook.css,在 overall_header.tpl 中,或者将 overall_header.tpl 方法与一些数据库存储相结合。subSilver 使用组合方法,因此 subBook 也将采用相同的方法。
在管理面板中编辑样式表
我们可以先看看组合方法中的数据库存储部分。它允许我们通过管理控制面板编辑样式表的一些方面。输入到管理功能中的值被放入 SQL 数据库中,稍后用于 phpBB 显示的每一页。
要访问样式编辑工具,请访问管理控制面板的 样式管理 部分,并点击 管理 链接。这将加载您在探索删除已安装样式时看到的相同的 样式管理 页面。然而,我们现在对 编辑 链接而不是 删除 链接感兴趣。点击 编辑 将加载 编辑主题 页面,该页面提供了一个简单的表单,用于更改颜色、字体、文本大小以及一些其他主题方面。
行动时间——编辑样式表
-
在页面上找到标记为 背景颜色 的行。
-
在这一行有一个包含文本 E5E5E5 的表单字段。删除该文本。
-
在表单字段中输入 CC0000。使用数字零,而不是大写字母 O。
-
滚动到页面底部并点击 保存设置 按钮。
-
在下一页,点击文本 点击此处返回样式管理 中的 Here 字样。这将带您回到 样式管理 页面,您的更改将在此处反映。
刚才发生了什么?
如其名所示,编辑主题 页面允许您更改论坛主题的一些方面。每个可更改的方面都有一个匹配的表单字段,例如论坛页面背景色的 背景颜色。通过将 E5E5E5 替换为 CC0000,您将页面背景颜色从浅灰色更改为红色。如果您将 CC0000 替换为 E5E5E5 并再次 保存设置,更改将被撤销。
编辑其他主题组件
您不仅可以更改页面的背景颜色。编辑主题 页面的前两个选项实际上允许您修改样式的两个方面,尽管它们的标签中可能使用了 主题。对 主题名称 的更改将在板风格选择列表和 样式管理 中反映。选择一个新的 模板 可以更改论坛的整体布局,同时保持当前的配色方案。您论坛的 templates 目录中的所有模板都将列在这个选择框中,即使它们目前没有被安装在某个风格中使用。
剩下的三十八个选项以三列格式呈现。第一列,主题元素,描述了单个设置,而第二列则包含当前值。当你安装一个新的样式时,一些值可能自动提供,也可能不提供;这因样式而异。这两列与你的需求最为相关。
第三列,简单名称,可以包含一些关于这些设置用途的额外描述信息。如果你查看 subSilver 的编辑主题页面,你可以在实际操作中看到这一点。不幸的是,phpBB 在安装新样式时没有导入简单名称数据的方法,因此这列通常会被忽略。你可以输入自己的简短描述,但除此之外,只有 subSilver 会使用这一列:

由于这个页面有如此多的选项,让我们集中讨论可以输入的值类型、最常用的设置以及你最可能想要更改的设置。许多设置是其他设置的替代版本,因此详细查看每一个都不是必要的。所有选项都列在本节末尾的表中。
注意
并非所有模板都会以相同的方式使用每个设置。一些模板甚至不会使用提供的所有设置。你应该将这里提供的描述视为设置可以使用的通用指南,而不是必须使用的指南。这里有很大的灵活性,一些模板正是利用了这一点。
允许的值
可以输入几种类型的值,并且大多数设置只接受一种类型。那些限制为一种类型的值可以归入文件名、颜色、字体大小和字体样式设置。所有其他设置接受文件名、颜色和 CSS 类名值,但在这些设置的每个组中只能使用一种类型的值。
文件名设置——CSS 样式表和背景图片——应仅用于样式templates目录中现有文件的名称。虽然可以使用不在templates子目录中的文件,但这通常需要编辑多个模板文件。一些样式,包括 subSilver,在首次安装时可能不会使用这对中的一个或两个。无论如何,请确保为CSS 样式表填写一个值,因为你可能以后会需要它。背景图片是可选的。
颜色设置需要十六进制颜色代码。十六进制颜色代码,有时也称为 HTML 颜色代码,是由六个字母和数字组成的组合,代表一种颜色,通常以井号符号(#)开头。许多网站提供了显示这些代码示例的图表和列表。当将十六进制颜色代码输入到本页面的颜色设置中时,你必须不包括井号符号。颜色设置只接受六个字符值,因此包括井号将导致代码的最后一位被截断!这可能会导致一些奇怪的颜色效果。你可能想为颜色设置输入一个颜色名称,如红色或绿色。如果你这样做,你将得到一些奇怪的结果。许多网站上有不同的十六进制代码列表。两个好的列表可以在www.htmlgoodies.com/tutors/colors.html和webmonkey.wired.com/webmonkey/reference/color_codes/找到。
字体大小设置仅限于简单的整数,如 9、10 或 15。这些通常与像素或点测量的字体大小相关,但测量类型可能因样式而异。由于某些样式也可能使用百分比测量,你可能想在确定样式表中使用的单位类型之前不修改这些设置。
最后一个受限值设置——字体样式——接受逗号分隔的字体名称列表。一个良好的值示例是Verdana, Arial, Helvetica, sans-serif。如果你想在一个列表中包含一个由多个单词组成的名称,请将其放在单引号或双引号内:例如,‘Verdana’,‘Trebuchet MS’。你也可以使用单个名称,但使用列表会更好。当提供列表时,将使用查看者计算机上安装的第一个字体。
更灵活的设置允许你使用文件名、颜色或 CSS 类名作为值,正如之前所述。文件名值受到与文件特定设置相同的限制。颜色值可以是十六进制颜色代码,包括这次使用的井号符号,或者简单的名称,如蓝色。CSS 类名是层叠样式表(Cascading Style Sheet)格式化规则的名称。它们通常是由全部小写字母和数字组成的简短名称。将被命名的格式化规则将用于控制主题元素控制的所有内容的显示。
常用和修改过的元素
你已经在上一节中学习了几个设置,例如字体大小和样式。现在让我们来检查一下在编辑主题页面中的一些更有用的选项。
表格单元格颜色
表格单元格颜色 1、表格单元格颜色 2、表格单元格类 1 和 表格单元格类 2 元素很有趣,因为它们可能是最常用的。phpBB 中任何显示表格行数据的方面,如成员列表、论坛和主题,都可以使用这些元素来实现交替行颜色效果。为了与 phpBB 的内部编码兼容,表格单元格类 1 通常具有 row1 的值,而 表格单元格类 2 则有 row2 的值。这是一种不成文的标准,但并不总是被使用。
字体颜色
许多论坛管理员喜欢更改的两个选项,但经常在没有帮助的情况下找不到,是 字体颜色 2 和 字体颜色 3。所有字体颜色设置都用于为各种文本着色,但这两个用于论坛中几个位置(如在线用户列表)上管理员和版主用户名的特殊颜色。字体颜色 3 分配管理员名称的颜色,而 字体颜色 2 则详细说明了版主名称的颜色。
再次强调,这些颜色也在其他地方使用,所以如果您更改它们,请确保在论坛周围查看。很容易将名称颜色更改得很好,却发现您的表格标题或 BBCodes 代码变得难以阅读。
一旦您已将元素编辑到您的偏好,您应该在 编辑主题 页面的底部点击 保存设置 按钮以将新值存储到数据库中。您将看到一个确认消息,表明设置已更新,并且新的设置应该在消息之后加载的任何页面上反映出来。
以下表格列出了主题元素的名称并定义了它们:
| 主题元素名称 | 描述 |
|---|---|
| CSS 样式表 | 附加到级联样式表文件的文件名。 |
| 背景图片 | 作为论坛背景使用的图片。在 subSilver 中不使用。 |
| 背景颜色 | 页面背景的颜色。 |
| 文本颜色 | 所有页面的默认文本颜色。 |
| 链接颜色 | 所有未访问链接的默认颜色。 |
| 已访问链接颜色 | 所有已访问链接的颜色。 |
| 活动链接颜色 | 点击链接时,它将改变颜色。在 subSilver 中不使用。 |
| 悬停链接颜色 | 当鼠标指针移到链接上时,它将变为这种颜色。 |
| 表格行颜色 1 | 表格行的背景颜色,通常非常浅。 |
| 表格行颜色 2 | 另一种通常中等的表格行背景颜色。 |
| 表格行颜色 3 | 第三行背景颜色,很少使用,通常是 darkest。 |
| 表格行类 1 | 表格行的 CSS 类名。在 subSilver 中不使用。 |
| 表格行类 2 | 第二组行的类名。在 subSilver 中不使用。 |
| 表格行类 3 | 第三行集合的类名。在 subSilver 中不使用。 |
| 表格标题颜色 1 | 表格标题的颜色。在 subSilver 中也用于页面边框。 |
| 表格标题颜色 2 | 第二个标题颜色。也用于 subSilver 中的表格边框。 |
| 表格标题颜色 3 | 第三个标题颜色。也用于 subSilver 中的内部表格边框。 |
| 表格标题类 1 | 表格标题单元格的 CSS 类名。 |
| 表格标题类 2 | 第二组表格标题单元格的类名。 |
| 表格标题类 3 | 第三组标题的类名。 |
| 表格单元格颜色 1 | 各种常见表格单元格的背景颜色。 |
| 表格单元格颜色 2 | 可选的表格单元格背景颜色。 |
| 表格单元格颜色 3 | 另一个表格单元格的背景颜色。在 subSilver 中未使用。 |
| 表格单元格类 1 | 表格单元格的 CSS 类名。常用于交替行颜色。 |
| 表格单元格类 2 | 第二个单元格类名。常用于交替行颜色。 |
| 表格单元格类 3 | 第三种可能的类名。在 subSilver 中未使用。 |
| 字体样式 1 | 大多数文本的默认字体样式。 |
| 字体样式 2 | 第二种字体样式,有时用于主题标题。 |
| 字体样式 3 | 第三种字体样式。常用于代码 BBCode 标签。 |
| 字体大小 1 | 最小字体大小。 |
| 字体大小 2 | 中等字体大小。 |
| 字体大小 3 | 最大的字体大小,用于大多数文本,包括帖子。 |
| 字体颜色 1 | 引用 BBCode 文本颜色。 |
| 字体颜色 2 | 代码 BBCode 文本颜色。也是版主用户名颜色。 |
| 字体颜色 3 | 表格标题单元格的文本颜色。也是管理员用户名颜色。 |
| Span 类 1 | 用于 HTML span 标签的 CSS 类名。在 subSilver 中未使用。 |
| Span 类 2 | 另一个用于 span 标签的类名。在 subSilver 中未使用。 |
| Span 类 3 | 第三个用于 span 标签的类名。在 subSilver 中未使用。 |
通过更改 CSS 样式来改变您网站的外观
组合样式表存储方法的第二部分处理模板 overall_header.tpl 文件中放置的 CSS 格式化规则。这些格式化规则,或 CSS 类,控制论坛显示的许多方面。通过直接编辑 CSS 类,您可以创建比通过 编辑主题 工具可能实现的更广泛的设计更改。|
第一步是定位 templates/subBook/overall_header.tpl 中的 CSS 类。在 WordPad 中打开该文件,并向下滚动到包含 <style type="text/css"> 的行。所有的 CSS 类都位于此行和包含 </style> 的另一行之间。每个类有两个主要部分:一个类名,也称为选择器,和一个声明块。
类名是一个简短且描述性的名称,将用于将单个类与论坛页面上的元素关联起来。名称可能与 HTML 标签的名称相同,例如 body, td, hr 或 font,或者以点开头的作者创建的名称,例如 .postbody 或 .quote。两种名称的组合,如 td.row1,也是可接受的。你还会看到包含以逗号分隔的名称的类;这是将一个类应用于所有命名元素的一种快捷方式。
声明块由一个或多个用大括号括起来的声明行组成。每条声明行包含一个属性名和值,由冒号分隔,并以分号结束。实际上,可以在一行文本中放置多条声明行,只要每条声明以分号结束,你将在文件中看到几个这样的例子。属性名和值指定了实际的格式化特性,如颜色、边框等。以下是一个用于下划线文本的示例行:
text-decoration: underline;
大多数样式的样式表也会包含以 /* 开头和以 */ 结尾的注释行,这些注释行解释了每个类将影响论坛的哪些显示元素。注释行本身不影响任何布局特性。一个完整的类可能类似于这个示例。
td.row2
{
color: black;
/* White Background */
background-color: #FFFFFF;
}
在你达到需要为你的论坛添加新功能的地步之前,你通常不需要非常频繁地更改类名,如果需要的话。另一方面,编辑声明块将让你几乎可以做任何事情。通过检查文件中的现有条目,你可以很好地了解通过在各个类中添加或删除声明行可以做什么。
注意
存在着成千上万种属性名称和值的组合。还有一些类型的类名在这里没有涵盖,或者没有在 subSilver 和 subBook 中使用。关于超出本书范围的可层叠样式表(CSS)的更多信息,请查看以下资源:
184 手动选择的样式表资源:www.cbel.com/style_sheets/
W3Schools CSS 教程:www.w3schools.com/css/
css-discuss Wiki css-discuss.incutio.com/
在 overall_header.tpl 中,你会看到许多包含特殊 模板变量(如 {T_BODY_BGCOLOR})的声明行。模板变量是 phpBB 的一个特殊功能,用于将数据替换到从模板文件生成的布局中。模板变量的可识别特征包括以大括号开头和结尾,并且只包含字母、数字、下划线和点。你不会看到名称包含分号、冒号或大多数其他特殊字符的模板变量。样式表中的任何模板变量都将被“编辑主题”工具的“主题元素”值替换;它们是数据库和 overall_header.tpl 结合发挥作用的地方。有关模板变量及其匹配的主题元素名称的列表,请参阅本节末尾的表格。
模板变量也可以应用于其他类型的主题元素的类。例如,查看 subBook 的 overall_header.tpl 中的第一个类。这个 body 类影响 HTML <body> 标签,从而影响整个网页,在与滚动条相关的声明行中使用了几个表格颜色元素。如果浏览器支持这些元素,这些行将改变浏览器滚动条中某些部分的颜色。滚动条属性不是标准 CSS 功能的一部分,并且仅在特定浏览器中起作用,例如微软的 Internet Explorer。Netscape 和 Mozilla 浏览器忽略滚动条属性。
要找到一个有趣的例子,说明你可以如何改变论坛的外观,找到 .bodyline 类。这将在 body 类下方大约八行的地方。在行尾附近,你可以看到 border 属性,它管理论坛页面的边框。它目前应该有创建一个实心、一像素宽、浅蓝色边框的值,颜色可以在 编辑主题 中更改。现在,将单词 solid 替换为 dashed。保存此更改并查看论坛的索引页面——现在它有一个虚线边框。你也可以尝试 dotted, ridge 和 groove 以获得其他效果。通过改变同一区域 1px 代码的数字部分,你可以增加和减少边框的宽度。尝试 10px 和 dotted 一起使用,以获得一个不寻常的视图。
注意
在 subBook/overall_header.tpl 中找到的样式表代码在 subBook/simple_header.tpl 中重复,并在 subBook/admin/page_header.tpl 中经过一些修改后重复。如果你想在论坛的所有部分保持相同的样式,对其中一个文件所做的任何更改也应应用于其他文件。
使用外部样式表
通过在overall_header.tpl中放置样式表,phpBB 通过“编辑主题”页面给你提供了很多控制,但这也带来了代价。样式表必须在每个页面上重新加载,这可能会使非常繁忙的论坛变慢。一个替代方案是使用外部样式表文件,例如subSilver.css和subBook.css。网络浏览器不会像刷新内部样式表那样频繁地刷新外部样式表,这会导致页面尺寸更小,加载时间更快。然而,这种类型的样式表不支持“编辑主题”实用程序,因此该实用程序几乎变得无用。“编辑主题”仍然控制管理员和版主用户名颜色,以及根据样式,行类和颜色。
要为 subBook 启用外部样式表,请在templates/subBook/overall_header.tpl中找到以下行:
<!-- link rel="stylesheet" href="templates/subBook/{T_HEAD_STYLESHEET}" type="text/css" -->
这一行是一个 HTML 注释行,由于开头和结尾附近有!--和--字符序列。就像层叠样式表注释行一样,它对页面布局没有影响。通过删除注释字符,可以使这一行成为外部样式表文件的引用。这一行应该看起来像这样:
<link rel="stylesheet" href="templates/subBook/{T_HEAD_STYLESHEET}" type="text/css">
你还应该删除overall_header.tpl中的所有 CSS 类,否则它们将覆盖外部样式表中的相同类。如果你对那些 CSS 类做了任何更改,在从overall_header.tpl中删除代码之前,在subBook.css中做出相同更改。你将在subBook.css中找到相同的类,但你不能在外部样式表文件中使用模板变量。如果你在simple_header.tpl和admin/page_header.tpl中做出这些相同的更改,你可以通过单个样式表文件控制整个论坛的外观。注意,admin/page_header.tpl中的最后一行将略有不同。你需要在这行中的templates之前添加../,以便样式表在使用此文件的页面上正确显示。这些页面通常是管理控制面板页面,只有你可能看到(除非你给其他用户管理员权限)。admin/page_header.tpl的最后一行是:
<link rel="stylesheet" href="../templates/subBook/{T_HEAD_STYLESHEET}" type="text/css">
下表列出了模板变量和相关主题元素:
| 模板变量 | 主题元素名称 |
|---|---|
{T_HEAD_STYLESHEET} |
CSS 样式表 |
{T_BODY_BACKGROUND} |
背景图片 |
{T_BODY_BGCOLOR} |
背景颜色 |
{T_BODY_TEXT} |
文本颜色 |
{T_BODY_LINK} |
链接颜色 |
{T_BODY_VLINK} |
已访问链接颜色 |
{T_BODY_ALINK} |
活跃链接颜色 |
{T_BODY_HLINK} |
悬停链接颜色 |
{T_TR_COLOR1} |
表格行颜色 1 |
{T_TR_COLOR2} |
表格行颜色 2 |
{T_TR_COLOR3} |
表格行颜色 3 |
{T_TR_CLASS1} |
表格行类 1 |
{T_TR_CLASS2} |
表格行类 2 |
{T_TR_CLASS3} |
表格行类 3 |
{T_TH_COLOR1} |
表格标题颜色 1 |
{T_TH_COLOR2} |
表格标题颜色 2 |
{T_TH_COLOR3} |
表格标题颜色 3 |
{T_TH_CLASS1} |
表格标题类 1 |
{T_TH_CLASS2} |
表头类 2 |
{T_TH_CLASS3} |
表头类 3 |
{T_TD_COLOR1} |
表格单元格颜色 1 |
{T_TD_COLOR2} |
表格单元格颜色 2 |
{T_TD_COLOR3} |
表格单元格颜色 3 |
{T_TD_CLASS1} |
表格单元格类 1 |
{T_TD_CLASS2} |
表格单元格类 2 |
{T_TD_CLASS3} |
表格单元格类 3 |
{T_FONTFACE1} |
字体样式 1 |
{T_FONTFACE2} |
字体样式 2 |
{T_FONTFACE3} |
字体样式 3 |
{T_FONTSIZE1} |
字体大小 1 |
{T_FONTSIZE2} |
字体大小 2 |
{T_FONTSIZE3} |
字体大小 3 |
{T_FONTCOLOR1} |
字体颜色 1 |
{T_FONTCOLOR2} |
字体颜色 2 |
{T_FONTCOLOR3} |
字体颜色 3 |
{T_SPAN_CLASS1} |
段落类 1 |
{T_SPAN_CLASS2} |
段落类 2 |
{T_SPAN_CLASS3} |
段落类 3 |
通过图片进行自定义
论坛外观的另一个重要部分是通过图片来创建的。论坛图片可以分为两大类:一类是仅用于外观的,另一类则具有某种功能。前者可能包括论坛的标志或菜单链接图片,而后者可能包括新帖子指示器和发帖按钮。通过替换这些图片中的任何一个,您可以创建一个新的用户界面,并同时调整论坛的设计。如果您是一位图形艺术家或对创建自己的图片有经验,您可以创建一些令人惊叹的图片来活跃您的论坛。
当然,您也可以从 phpBB 社区下载新的图形。正如之前提到的,phpBB.com 和 phpBBHacks.com 提供风格下载,同时也提供一些图形集。他们的一些图片下载包括排名和表情符号图片,但您也可以找到正常论坛按钮的套装。一些风格作者还制作了特殊的 PSD 图像套装,这些套装可以使用 Adobe Photoshop 和其他图像编辑器来创建新图像。如果您安装的风格有 PSD 套装,那么在以后添加论坛新功能时可能会很有用。
安装新图片以改变您网站的外观
在 phpBB 论坛中安装新图片有两种方式。第一种是替换现有图片。替换图片需要找到或创建一个图片,将其重命名为与论坛上已使用的图片相同的文件名,删除现有图片,并将新图片放在相同的位置。这是一种快速将新图形添加到论坛的方法,但它将限制您只能使用之前放置的相同类型的图片。如果您有一个像数码照片一样的 JPEG 图片,想要用于 subSilver 或 subBook 中的 新主题 按钮,您将不得不将其转换为 GIF 图片,在这个过程中会损失一些图片质量。对于这种情况,使用安装新图片的第二种方法:添加一个具有新文件名的图片会更好。
然而,为了使 phpBB 能够检测到新的文件名,你可能必须编辑你安装新图片的样式的模板配置文件。如果你还记得本章前面的内容,这些文件的名字与 templates 子目录的名字相匹配,例如 subSilver.cfg 或 subBook.cfg,并列出了论坛上找到的许多图形。列表中的条目通常类似于以下示例:
$images[‘name’] = "$current_template_images/image.gif";
$images[‘name’] = "$current_template_images/{LANG}/image.gif";
如果你用 WordPad 打开 subBook.cfg,你应该会看到几行这种格式的文本。一般来说,你应该只编辑一行中最后一个反斜杠之后和最后一个引号之前的部分,例如示例中的 image.gif。如果你的新图片不在样式的 images 子目录中,比如 templates/subBook/images,那么你需要将 $current_template_images 替换为指向图片的正确路径。通常,将新文件直接放入样式的 images 目录中会更简单。特殊的 {LANG} 占位符允许 phpBB 使用支持多种语言的图片的不同版本。
你可能预期在配置文件中找到的一张图片——论坛的 phpBB 标志——实际上并不在那里。要更改标志的文件名,你必须编辑 overall_header.tpl。标志的 HTML 图像标签如下所示:
<img src="img/logo_phpBB.gif" border="0" alt="{L_INDEX}" vspace="1" />
注意,phpBB 的标志是 logo_phpBB.gif 文件。大多数人希望快速更改标志,所以这是一个很好的文件来尝试替换或重命名。
Hacking phpBB
仅通过 phpBB 修改论坛的外观只是你可以执行的自定义操作的一个方面。对于一些有趣的变化,你很可能会想给你的论坛添加一些全新的功能。你也可能想移除一些你计划不使用的功能。为了添加新功能、移除现有功能或以其他方式更改 phpBB 论坛的能力,你必须编辑构成 phpBB 核心的 PHP 脚本文件。你可能还需要编辑或添加新的模板文件到论坛上安装的样式中。进行这类更改的过程被称为 修改 或 hacking phpBB。
MODs 和 Hacks
在线 phpBB 社区中提供了许多更改 phpBB 功能的说明。这些下载可能包括更改核心 phpBB 文件或 SQL 数据库的步骤说明,添加新的论坛文件,或这三个类别的任何组合。这些下载通常被称为 MOD 或 Hacks。Hacks 是在 phpBB 1 时代使用的原始术语,并且在一些 phpBB 社区中仍然广泛使用。随着 phpBB 2.0 的推出,从“modifications”一词的缩写形式来的 MODs 术语也变得流行起来。为了避免混淆,本章中将使用 修改 一词。
phpBB 修改
修改究竟包括什么?这取决于修改的范围。非常简单的修改通常包括一个包含更改现有 phpBB 文件说明的文本文件。更复杂的修改可能还包括要添加到 phpBB 的新文件和一个特殊的安装程序文件。一些极其复杂的修改通常包括所有这些,以及已经编辑过的原始 phpBB 文件的副本。所有这些文件都将一起放入一个压缩文件中,通常是 ZIP 格式。
虽然是一群开发者创建了 phpBB,但修改通常是需要修改效果的个别 phpBB 用户的工作。phpBB 是开源的,并按照 GNU 通用公共许可证发布,因此它及其任何衍生作品(如修改)可以免费提供给他人。修改作者将他们的作品提供给他人,希望其他论坛管理员能从中受益,并最终回馈给更大的 phpBB 社区。因此,存在大量不同编码方法和写作风格的修改。一些修改也处于开发阶段,你应该小心使用。它们通常包含可能导致你的论坛访客烦恼的错误、安全漏洞或不完整的特性。
找到大量 phpBB 修改下载的最佳位置是:
-
phpBBHacks.com:
www.phpbbhacks.com/ -
phpBB 官方网站:
www.phpbb.com/
许多修改作者也会在自己的网站或其他 phpBB 社区上发布他们的作品。如果可能的话,确保你只下载描述为与你的 phpBB 版本兼容的修改。有许多 phpBB 1 和 phpBB 2 的版本,但并非所有修改都适用于每个 phpBB 版本。现在主要在phpBBHacks.com找到的 phpBB 1 修改将无法在任何 phpBB 2 版本上运行。一些 phpBB 2 修改可能只与 phpBB 2.0 的早期或后期版本兼容。
安装一个修改
当你找到并下载你想要安装的修改时,你需要遵循一系列步骤,将新代码放入你的论坛并完全激活它。像许多其他事情一样,所需的精确步骤因每个修改而异。然而,所有修改都存在一种通用的标准方法。首先,让我们安装这个简单的修改。它为每个用户的帖子添加了一个按钮,允许其他人快速搜索该用户的所有帖子。
#
#-----[ OPEN ]------------------------------------------
#
templates/subSilver/viewtopic_body.tpl
#
#-----[ FIND ]------------------------------------------
#
//--></script><noscript>{postrow.ICQ_IMG}</noscript></td>
#
#-----[ IN-LINE FIND ]------------------------------------------
#
</noscript>
#
#-----[ IN-LINE AFTER, ADD ]------------------------------------------
#
{postrow.SEARCH_IMG}
#
#-----[ SAVE/CLOSE ALL FILES ]------------------------------------------
#
# End
行动时间——安装一个小修改
-
定位你论坛的
templates/subSilver/viewtopic_body.tpl文件。使用你的文本编辑程序打开此文件。 -
使用文本编辑程序的搜索功能在文件中找到此行文本。在许多程序中,此功能可以通过菜单访问或通过在 Windows 系统上按Ctrl+F来访问。
//--></script><noscript>{postrow.ICQ_IMG}</noscript></td> -
现在,找到该行中的文本
</noscript>。 -
在
</noscript>之后,输入一个空格和文本{postrow.SEARCH_IMG}。该行的最终版本应类似于以下示例://--></script><noscript>{postrow.ICQ_IMG}</noscript> {postrow.SEARCH_IMG}</td> -
保存并关闭文件。如果需要,将其上传到您的网站,替换那里的现有文件。如果您愿意,可以使用
templates /subBook/viewtopic_body.tpl文件重复所有这些步骤。 -
前往您的论坛并查看任何帖子。您应该在帖子下方看到一个新的搜索图像。
刚才发生了什么?
恭喜,您刚刚安装了您的第一个 phpBB 修改版!大多数修改版包含一系列与上一页类似的说明。作者希望您将这些说明作为将修改版添加到 phpBB 文件的基本指南。通过在您的viewtopic_body.tpl文件中放置一小段新代码,您已经启用了可以与论坛帖子一起显示的搜索按钮。
安装下载的修改版
下载并希望安装的修改版后,您必须首先解压缩下载的文件,如果它是 ZIP 文件或其他存档文件格式。这样做时,将创建一个或多个新文件,以及可能包含更多文件的目录。当只有一个文件时,它通常是一个简单的文本文件,您可以在 WordPad 中打开它。文件的名称通常是readme.txt, install.txt, install.mod或类似的东西。为了举例,让我们使用install.txt。
注意
如果修改版包含一个install.mod文件,您可能无法通过双击它来打开它,就像其他文件一样。.mod文件扩展名已经由一种流行的音乐文件格式使用了多年,所以像 WinAMP 这样的音乐播放器通常会尝试打开双击的.mod文件。在这些情况下,您必须通过 WordPad 的文件 | 打开菜单打开文件。
install.txt将包含安装修改版更改的所有说明,以及作者的致谢和关于更改的注释。较大的修改版可能包括一个readme.txt和一个install.txt文件。在这种情况下,通常在执行任何其他操作之前检查readme.txt是个好主意,因为它可能包含install.txt中未找到的特殊说明。
一些修改以段落形式简单列出,但大多数使用一个常见的模板,包括标题和称为操作的简单命令。修改标题将包含基本信息,例如修改的名称、版本号、作者、描述以及安装难度和时间的估计。有关修改及其历史的注意事项也可能在这里找到,因此请务必仔细阅读标题。操作描述了使用包含简短描述性名称的标题以及一条或多条代码的修改安装步骤。
下面是一个操作标题的示例,它可能出现在指令文件中。
#
#-----[ ACTION NAME ]------------------------------------------
#
每个操作的名称将替换文本ACTION NAME。有许多种类的操作,每种操作都有不同的含义。当在一系列指令中使用时,操作名称通常全部大写。
注意
在对任何文件进行任何操作之前,请务必备份您被指示更改的任何文件。如果您需要刷新记忆,请参考本章前面的编辑 phpBB 文件部分。
复制操作
这个标记为复制的操作是指将文件放置到某些新的位置。通常,要复制的文件是修改的一部分,必须上传到您的论坛。有时它们已经在论坛中,只需移动即可,但这样的特殊情况应在修改说明中注明。
#
#-----[ COPY ]------------------------------------------
#
db_update.php to db_update.php
functions_new.php to includes/functions_new.php
templates/*.* to templates/subSilver/*.*
上面的示例是一个典型的复制操作。每一行列出要复制的文件在左侧,以及复制的目标在右侧。除非另有说明,否则目标路径将与论坛的主要目录相关。在示例中,您将db_update.php放置在主目录中,与viewtopic.php和profile.php以及functions_new.php一起位于includes/目录中,以及修改的templates/目录中的所有文件都位于论坛的templates/subSilver/目录中。特殊表示法*.*是一种快速表示“此目录中所有文件”的方法。
SQL 操作和编辑数据库
当黑客添加新功能时,它们通常以某种方式通过论坛的 SQL 数据库进行跟踪。为了使这正常工作,您需要修改数据库。修改作者将使用三种方法之一或多个来包含这些更改。第一种方法,并且在最近创建的修改中最为流行,是包含一个安装脚本文件。安装文件是具有.php文件扩展名的特殊文件,可以为您更改数据库。它们通常命名为install.php或db_update.php,但名称可以有所变化。要使用这些文件,通常只需将它们放置在论坛的目录结构中(复制操作会处理这一点)并运行该文件。
这一部分可能对您来说有些难以理解。学习如何安装修改的人经常问,“运行 文件是什么意思?” 要运行 .php 文件,您需要像访问普通网页一样在您的网络浏览器中访问它。一个很好的比较是思考您的论坛的 viewtopic.php,它显示所有主题。每次您在论坛中阅读一个主题时,您就是在运行 viewtopic.php 文件。仅仅访问您上传的 db_update.php 文件就会开始编辑数据库的过程。一些复杂的安装程序可能会引导您完成几个步骤。
注意
许多安装脚本在您在运行文件之前使用管理员账户登录到论坛之前将不会工作。始终确保首先登录,并在运行后立即删除安装文件!保留安装脚本可能会带来重大的安全风险!
包含数据库更改的第二种方法是在安装说明中的 SQL 操作部分放置一个 SQL 查询命令列表。第三种方法是将相同类型的列表放置在一个单独的文本文件中,该文件可能被命名为 sql.txt 或 schema.sql。其他名称也是可能的,但重要的是要注意,任何扩展名为 .sql 的文件都是一个包含 SQL 查询的文本文件。当使用这两种方法中的任何一种时,您需要执行以下两项操作之一:创建自己的安装脚本或手动运行更改。
创建自己的安装脚本并不难。实际上,有一些生成器可以为您创建 db_update.php 文件!可以在 www.phpbbhacks.com/forums/db_generator.php 找到这样一个生成器。只需从 SQL 操作或文件中复制 SQL 查询,并将它们粘贴到这个或另一个生成器中,提交表单,您将看到 db_update.php 文件的代码。您可以直接从该页面下载文件,将其放置在您的论坛中,并以您运行作者提供的安装程序相同的方式运行该文件。
注意
一些 SQL 查询可能与 db_update.php 生成器不兼容。这些通常会产生在运行时显示解析错误的安装脚本。如果发生这种情况,请访问友好的 phpBB 支持论坛,并寻求帮助以使查询兼容。
为了手动更改数据库,你可以使用 phpMyAdmin 或其他类似的数据库管理工具。然而,在执行此操作之前,你可能需要编辑 SQL 查询。当你安装 phpBB 时,你有一个选项可以输入一个数据库表前缀。phpBB 使用此选项的值作为所有数据库表名的开头。修改中的每个查询都应该提及一个数据库表名,例如phpbb_posts或phpbb_config。如果你的选择的表前缀是myforum_,在使用查询之前,你需要将表名更改为myforum_posts和myforum_config。安装脚本文件通常会自动进行此更改,所以如果你不熟悉这个过程,你应该考虑生成一个。以下是一些查询,在更改表前缀前后可能看起来是这样的:
CREATE TABLE phpbb_tracker (
tracker_id mediumint(8) DEFAULT ‘0’ NOT NULL,
tracker1 tinyint(1) DEFAULT ‘0’ NOT NULL,
tracker2 varchar(40) NOT NULL,
PRIMARY KEY (tracker_id),
);
CREATE TABLE myforum_tracker (
tracker_id mediumint(8) DEFAULT ‘0’ NOT NULL,
tracker1 tinyint(1) DEFAULT ‘0’ NOT NULL,
tracker2 varchar(40) NOT NULL,
PRIMARY KEY (tracker_id),
);
INSERT INTO phpbb_tracker (tracker_id, tracker1, tracker2)
VALUES (1, 3,’Some text’);
INSERT INTO myforum_tracker (tracker_id, tracker1, tracker2)
VALUES (1, 3,’Some text’);
使用正确的格式编写查询后,打开 phpMyAdmin,如果需要,在左侧列中选择你的数据库。点击SQL标签或查询窗口链接。这两个选项都会加载一个包含大文本框的页面。从修改说明或文本文件中复制 SQL 查询,并将其粘贴到这个框中。点击执行按钮应该会自动在数据库上运行这些查询。
打开操作
这个简单的操作会告诉你需要编辑的文件的名字和位置。你应该在 WordPad 或你喜欢的文本编辑程序中打开这个文件,并准备好对其进行修改。如果你还没有备份文件,现在就备份。所有跟随打开操作的其他操作都应该在这个操作列出的文件上执行,直到你到达说明的末尾或另一个打开操作。
#
#-----[ OPEN ]------------------------------------------
#
includes/functions.php
查找操作
每个查找操作后面都跟着一行或多行代码,这些代码应该包含在最后一个打开操作中的文件内。你的目标是找到这段代码,这应该是一个简单的任务。大多数文本编辑程序,包括 WordPad,都有一个查找或搜索功能,这使得在整个文件中搜索变得快速且简单。查找功能应该可以通过程序的菜单访问,或者在 Windows 程序中,通过按Ctrl+F。
不幸的是,有些问题可能会使查找行变得繁琐。首先,phpBB 已经发布了几个版本。每个版本都有一定的代码更改,所以 phpBB 2.0 将针对早期版本进行一些修改,其中查找代码与最新版本的代码有很大不同。在这些情况下,如果你认为版本之间的相关更改似乎很小,那么通常最好不安装修改。另一个问题是,一些修改试图查找已经被其他修改更改或删除的代码。一些作者试图通过只列出每行的前几个字符来绕过这个问题。这种做法由于对查找指令之后动作的误解,又产生了另一个问题。最后,一些代码行在某些文件中出现了不止一次。你可能只需要编辑特定的出现,或者编辑所有实例。
我们如何解决这些问题?有时这并不容易。如果你找不到某些查找代码,首先尝试的解决方案是搜索代码的小部分。假设你很难找到这个指令的行:
#
#-----[ FIND ]------------------------------------------
#
‘SOME_TPL_VARIABLE’ => $some_php_variable,
寻找行中的关键部分,如SOME_TPL_VARIABLE,即使它已经被其他修改或 phpBB 的某个版本更改,也可能帮助你找到该行。在安装修改时,适应代码行的能力是一项关键技能,你可能需要随着时间的推移发展这项技能。
当处理文件中多次出现的行或代码块时,请记住,大多数修改都是根据从上到下的顺序编写的。比如说,你有一个包含两个查找命令的指令,第二个查找命令的代码在文件中出现了两次。作者通常是指让你在第一个查找命令的代码之后找到第一次出现的位置。
添加操作
有三种方法可以向文件中添加新代码:在...之前,添加;在...之后,添加;和替换为。这些添加操作将始终跟随查找操作,并参照查找操作中的代码。对于在...之前,添加操作,动作之后的代码应该放在文件中查找操作代码之前的一行。对于在...之后,添加操作,代码将放在查找操作代码之后的一行。替换为操作将删除查找操作的代码,并用新代码替换旧代码。
大部分情况下,这些是简单的步骤。关于之前添加和之后添加操作的一个要点非常重要,那就是始终将新代码放在新行上,与其他所有代码分开。正如已经提到的,一些修改作者在他们的查找操作中只包含部分代码行。这种做法的问题在于,修改用户倾向于在查找操作之后立即在同一行上添加新代码。这会将新代码直接放在原始代码的中间,从而产生一系列语法错误,这可能会使论坛无法访问。如果你总是通过在完全新的行上插入代码来在查找代码之前或之后添加代码,你应该能够避免这个问题。
为了说明文件代码应该如何看起来,这里有一些示例动作序列和正确的结果代码。为了这些例子的目的,假设一个包含以下代码的文件已经在打开操作中引用。
<?php
$number1 = $number2 = $number3 = 0;
$number1 = $x + $y;
$number2 = $y + $z;
$total = $number1 + $number2 + $number3;
echo ‘The total is: ‘ . $total;
?>
首先,一个简单的查找和之后添加的组合:
#
#-----[ FIND ]------------------------------------------
#
$number1 = $x + $y;
$number2 = $y + $z;
#
#-----[ AFTER, ADD ]------------------------------------------
#
$number3 = $a + $b;
这个序列应该创建:
$number1 = $number2 = $number3 = 0;
$number1 = $x + $y;
$number2 = $y + $z;
$number3 = $a + $b;
$total = $number1 + $number2 + $number3;
下一个查找和之前添加的组合:
#
#-----[ FIND ]------------------------------------------
#
$number1 = $x + $y;
$number2 = $y + $z;
#
#-----[ BEFORE, ADD ]------------------------------------------
#
$my_array = array(‘a’ => 1, ‘b’=> 2, ‘x’ => 3, ‘y’ => 4, ‘z’ => 5);
while( list($key, $value) = each($my_array) )
{
$$key = $value;
}
应用这个序列后,文件将包含:
$number1 = $number2 = $number3 = 0;
$my_array = array(‘a’ => 1, ‘b’=> 2, ‘x’ => 3, ‘y’ => 4, ‘z’ => 5);
while( list($key, $value) = each($my_array) )
{
$$key = $value;
}
$number1 = $x + $y;
$number2 = $y + $z;
一个查找操作后跟一个替换为操作可能是:
#
#-----[ FIND ]------------------------------------------
#
$total = $number1 + $number2 + $number3;
#
#-----[ REPLACE WITH ]------------------------------------------
#
$average = ($number1 + $number2 + $number3) / 3;
那个序列会将文件的结尾转换为以下代码片段。
$average = ($number1 + $number2 + $number3) / 3;
echo ‘The total is: ‘ . $total;
?>
最后,这里是对之前查找和之后添加序列的另一种版本。这次,查找操作只包含行的一部分。应用该序列的结果应该与给出完整行相同。
#
#-----[ FIND ]------------------------------------------
#
$number1 =
$number2 =
#
#-----[ AFTER, ADD ]------------------------------------------
#
$number3 = $a + $b;
内联操作
尽管你已经了解到在新的行上添加代码的重要性,但有时你需要在同一行内更改一段代码。内联操作用于此目的。这里有四种:内联查找;内联之前添加;内联之后添加;以及内联替换为。理想情况下,你会看到一个带有长段代码的查找操作,然后是一个带有该行短片段的内联查找,接着是其他三个内联操作之一。就像使用它们的正常对应物一样使用它们,但这次不要在单独的行上添加新代码。你实际上会在当前行内插入代码。在几个使用内联操作的修改中,你可能需要在几个不同的地方更改一行。
使用上面相同的简短文件,这里是一个内联替换为动作序列的例子,它编辑了一行中的两个部分。
#
#-----[ FIND ]------------------------------------------
#
echo ‘The total is: ‘ . $total;
#
#-----[ IN-LINE FIND ]------------------------------------------
#
total
#
#-----[ IN-LINE REPLACE WITH ]------------------------------------------
#
average
#
#-----[ IN-LINE FIND ]------------------------------------------
#
$total
#
#-----[ IN-LINE REPLACE WITH ]------------------------------------------
#
$average
那个序列会改变文件的结尾,看起来像这样:
$average = ($number1 + $number2 + $number3) / 3;
echo ‘The average is: ‘ . $average;
?>
最后一个操作
几乎每个修改的说明都以这个动作的某种变体结束:
#
#-----[ SAVE/CLOSE ALL FILES ]------------------------------------------
#
# End
这是说明的最后一步。它作为提醒,要求您保存更改,关闭任何剩余的打开文件,并在必要时将编辑后的文件传输到您的论坛。完成这些操作后,您应该完成修改安装。您应该使用管理员账户、普通用户账户,并在必要时使用版主账户彻底测试安装。许多修改为具有不同权限的账户添加了不同的功能。为了测试目的,最好一次只安装一个修改。如果您同时安装三个或四个修改,并在论坛中遇到错误,您可能很难找到原因。
以下表格提供了修改动作的快速参考:
| 动作名称 | 定义 |
|---|---|
| 复制 | 将一个或多个文件从一个位置复制到另一个位置。 |
| SQL | 在您的论坛数据库上运行一个或多个 SQL 查询。这些通常应该在安装修改的其余部分之前完成。 |
| 打开 | 打开文件以备编辑。从这一步开始直到最后一步或另一个打开操作,所有操作都应在该文件上执行。它后面跟着一个单个的文件名。 |
| 查找 | 这在文件中定位代码,并跟随代码。 |
| 之后,添加 | 在先前的查找操作之后的代码之后放置以下代码,在新的一行上。它始终跟随一个查找操作。 |
| 在之前,添加 | 在先前的查找操作之前的代码之前放置以下代码,在新的一行上。它始终跟随一个查找操作。 |
| 替换为 | 删除先前的查找操作中找到的代码,并在其位置替换以下代码。它始终跟随一个查找操作。 |
| 在行内查找 | 通常跟随一个查找操作。在较长的代码行中定位以下代码。 |
| 在行内之后,添加 | 在先前的行内查找代码之后放置以下代码,在同一行代码上。它始终跟随一个行内查找操作。 |
| 在行内之前,添加 | 在先前的行内查找代码之前放置以下代码,在同一行代码上。它始终跟随一个行内查找操作。 |
| 在行内替换为 | 删除先前的行内查找中的代码,并在同一行上替换为以下代码。它始终跟随一个行内查找操作。 |
| 保存/关闭所有文件 | 表示文件更改的结束,并提醒您保存更改。它是修改的最后一个动作。 |
| 添加 SQL | 这是 SQL 动作的较旧形式,与该动作具有相同的意义。 |
模板的问题
修改安装的一个非常重要的方面仍然存在,就在您以为您已经完成的时候。当您安装修改时,您会发现几乎所有的修改或添加模板文件的说明中只会提到子 Silver 模板。到这时,您应该在您的论坛上至少安装了一个其他模板。由于存在如此多的模板,作者在说明中提及所有这些模板并不实际。由于每个 phpBB 论坛都可能在某个时候安装了子 Silver,并且许多模板都是基于子 Silver 构建的,所以只提到那个模板,并且有一个不言而喻的理解,即它实际上是对所有模板的引用。
模板的问题在于您必须为所有已安装的模板安装每个修改的模板文件更改,即使说明中没有告诉您这样做。此外,如果您安装了修改并后来安装了新的模板,您必须将这些修改应用到那些模板上。如果您忘记修改模板,使用该模板的任何论坛成员将无法访问修改的功能,除非他们切换到您编辑过的另一个模板。
这个领域另一个问题是模板本身的代码。虽然许多模板是从子 Silver 创建的,但相当多的是不是。后者往往在其文件中有一些非常不同的标记语言编码。除非您将其分解为单个模板变量,否则在查找操作中定位代码几乎是不可能的。您可能实际上必须重写新的模板文件或代码以匹配替代模板的外观,这可能会非常头疼。
卸载修改
有时,您可能需要在安装修改后将其移除。也许您发现两个修改相互冲突,或者修改没有达到您的期望。无论原因如何,卸载通常比安装更容易。
有两种方法可以移除修改对您文件所做的更改。由于您在编辑任何文件之前都创建了备份,因此您可以替换当前文件为那些备份副本。这将使论坛的文件恢复到修改安装之前的相同状态。如果您对文件所做的更改除了安装此修改之外,那么您不应该恢复备份文件。在这种情况下这样做会导致您其他更改丢失。
第二种方法是按照安装的说明进行操作,但反转动作命令。例如,如果说明有一个查找动作后跟一个添加动作,您将找到并删除添加动作的代码。在查找和替换组合的情况下,您将搜索替换代码,删除它,并将查找代码放置在那个位置。为了进一步说明这些概念,以下示例删除了在早期修改安装练习中添加到帖子中的搜索按钮。
行动时间——卸载小修改
-
在文本编辑程序中定位并打开您论坛的
templates/subSilver/viewtopic_body.tpl文件。 -
使用文本编辑程序的搜索功能在文件中定位此行文本。再次强调,大多数程序允许通过菜单访问此功能或在 Windows 系统上按Ctrl+F。
//--></script><noscript>{postrow.ICQ_IMG}</noscript> {postrow.SEARCH_IMG}</td> -
现在,定位该行中的文本
{postrow.SEARCH_IMG}。 -
删除此文本及其前面的单个空格。该行应再次看起来像最初的样子:
//--></script><noscript>{postrow.ICQ_IMG}</noscript></td> -
保存并关闭文件。如有必要,将其上传到您的网站,替换那里的现有文件。如果您愿意,也可以用
templates/subBook/viewtopic_body.tpl文件重复所有这些步骤。 -
前往您的论坛并查看任何帖子。您应该看到搜索图片不再显示。
发生了什么?
通过反转您为安装搜索按钮修改所采取的动作,您已经从您的论坛中移除了它。您不是找到原始代码并添加到它,而是搜索了修改后的代码。然后您移除了原始修改添加的额外代码。这恢复了被更改的文件到其原始状态。
移除其他更改
移除新文件和数据库更改的需求是之前示例中审查的两种移除文件更改方法共有的。修改添加的新文件处理起来既快又简单:只需删除它们。移除数据库更改是卸载的一个更复杂的方面;然而,phpMyAdmin 是一个方便的工具,可以简化这一过程。当一个修改添加了一个新表或表中的一列时,您可以在 phpMyAdmin 中找到这个添加项,并点击旁边的删除链接,这通常是一个垃圾桶图标。phpMyAdmin 将要求您确认删除(或称为当处理表或列时的删除,称为删除);这样做,更改就会消失。
示例修改
自 phpBB 首次出现以来,已经发布了数千个针对 phpBB 的修改版本,供公众使用。想想您可能想要添加到或从 phpBB 论坛中删除的任何功能,可能已经至少有一个修改版本。每周都会创建并发布新的修改,因此通过这种方法定制论坛的可能性是无限的。
最受欢迎的修改之一是庞大的文件附件修改模组,包含超过 140 个文件。它为 phpBB 的帖子论坛添加了新功能,允许用户上传文件,这些文件将附加并显示在他们的帖子中。另一个常用的例子是修改个人资料,以前称为“向个人资料添加新字段”。这种修改是一个向用户注册和编辑个人资料表单添加新信息字段的指南。可以添加多种不同类型的字段,从简单的文本输入框到下拉选择列表。新字段中存储的数据也可以在公共个人资料、主题、帖子和其他论坛中的其他地方显示。
数十种修改改变了或添加了新的 BBCodes。用户和管理管理工具、在线游戏、商店、聊天室、最近的主题、下载系统、phpBB 错误修复或升级以及网站门户是一些其他广泛使用的修改示例。
这些列表只是描述可用于您的修改类型的一个表面。如果您花时间查看列出修改的网站,您肯定会找到一些您想在论坛上安装的东西。如果您仔细查看,您可能会发现许多可用于自定义论坛的东西。
移动元素
可以在不花费时间搜索详细修改的情况下对论坛进行一些布局修改。虽然您可以找到这些修改的下载,但修改通常处理布局问题不佳。模板之间的差异,有时是其他修改创建的,经常迫使论坛管理员在没有帮助的情况下重新排列布局。为了移动这样的元素,您至少需要具备基本的 HTML 编码知识。
您可能已经注意到,subSilver 和 subBook 在其论坛索引页面的底部有一些统计数据和一个登录框。您可以做出的一种流行更改是将这些元素中的一个或多个移动到页面的另一个部分。通过在index_body.tpl中找到创建它们的布局代码并将其放置在文件顶部附近,您可以强调用户应该登录或论坛上的用户和帖子数量。
向您的论坛添加新元素
在您的论坛中创建新区域通常需要完整的修改,包括说明。然而,有一些简单的事情可以在不进行修改的情况下完成。其中之一是在论坛的页眉菜单中添加一个新的链接。
行动时间——添加菜单链接
-
定位并打开用于编辑的
templates/subBook/overall_header.tpl文件。如果您喜欢,可以使用subSilver overall_header.tpl文件代替。 -
在此文件中找到包含代码
<!-- BEGIN switch_user_logged_out -->的行。该行的开头将有几个制表符。 -
在你刚才找到的代码之前的新行中插入以下代码:
<a href="{U_VIEWONLINE}" class="mainmenu"><img src="img/icon_mini_members.gif" width="12" height="13" border="0" alt="{L_WHO_IS_ONLINE}" hspace="3" />{L_WHO_IS_ONLINE}</a></span> -
4. 将更改保存到文件并查看您的论坛。你可能需要重新加载或刷新论坛页面,但你应该会看到一个新的在线用户链接,它位于论坛顶部附近的链接之一。
发生了什么?
你的论坛的菜单链接,如个人资料、常见问题解答和搜索,是由存储在overall_header.tpl模板文件中的 HTML 创建的。通过复制创建这些链接的一行或一系列行并稍微修改这一行,你可以创建一个新的菜单链接。在这种情况下,新的链接指向viewonline.php文件,该文件显示当前正在访问论坛的用户列表。如果这些步骤被写成修改,它们可能看起来像这样:
#
#-----[ OPEN ]------------------------------------------
#
templates/subBook/overall_header.tpl
#
#-----[ FIND ]------------------------------------------
#
<!-- BEGIN switch_user_logged_out -->
<a href="{U_REGISTER}" class="mainmenu"><img src="img/icon_mini_register.gif" width="12" height="13" border="0" alt="{L_REGISTER}" hspace="3" />{L_REGISTER}</a></span>
<!-- END switch_user_logged_out -->
#
#-----[ BEFORE, ADD ]------------------------------------------
#
<a href="{U_VIEWONLINE}" class="mainmenu"><img src="img/icon_mini_members.gif" width="12" height="13" border="0" alt="{L_WHO_IS_ONLINE}" hspace="3" />{L_WHO_IS_ONLINE}</a>
</span>
#
#-----[ SAVE/CLOSE ALL FILES ]------------------------------------------
#
# End
添加新语言
论坛管理员常见的另一种修改是安装新的语言文件。如果你计划让许多精通英语以外的语言或无法阅读英语的访客访问,你可能需要从 phpBB.com 的下载部分下载并安装一个语言包。每个语言包都会在用户资料和行政控制面板的板语言下拉列表中添加一个新选项。选择该选项将使论坛以该语言显示。帖子不会翻译,但许多链接和其他默认文本将会翻译。
在添加语言包时,你应该记住你可能需要编辑新的语言文件。一些修改可能包括新的语言文件或编辑语言文件的说明。如果你添加了新的语言而没有将这些更改复制到该语言,那么一些文本将不会出现在你的论坛上。这种情况与修改和模板类似;你必须编辑每种语言,即使修改说明只提到一种。
摘要
phpBB 在许多方面都是一款优秀且功能强大的论坛软件。定制可能性是其中最强有力的。通过你在本章中获得的知识和技能,你可以给你的论坛进行一次彻底的面貌更新,或者扩展其功能,使其超越你想象的任何事物。具体来说,你学习了:
-
phpBB 风格创建论坛的外观
-
编辑样式组件允许你改变外观的任何方面
-
修改是更改 phpBB 功能的说明,通常具有特殊格式
-
如何安装和删除从网站下载的样式和修改
-
编辑 phpBB 文件和解决错误的方法
后续章节将通过讨论创建个人风格和修改的细节来对这些主题进行一些扩展。
第五章。论坛管理
在前面的章节中,您已经了解到您的版面是如何工作的以及如何自定义其外观。一些高级主题被跳过了,这样您可以专注于最重要的和最广泛使用的 phpBB 功能。现在是时候掌握 phpBB,并深入了解将使您成为真正的 power-phpBB-admin 的细节。
在本章中,您将了解:
-
使您的版面多语言化
-
配置头像
-
管理表情符号
-
分配等级
-
论坛权限
-
用户权限
-
用户组和组权限
-
数据库备份和恢复——再次审视
-
人类的一面——版主、网络战争和封禁
使您的版面多语言化
phpBB 是为了支持同一版面中的多种语言而开发的。整个界面(屏幕、消息、按钮、电子邮件等)被翻译成 50 多种语言。翻译者不是 phpBB 团队的成员,而是母语为英语的志愿者,这保证了翻译的正确性和准备好安装到您的版面。因此,您为您的社区提供了更好的服务,为他们提供了一个他们感到更舒适的界面。
行动时间——为您的论坛添加西班牙语支持
-
前往 phpBB.com 下载页面
www.phpbb.com/downloads.php。 -
滚动到语言和图像包部分,找到西班牙语(西班牙语)行:
![行动时间——为您的论坛添加西班牙语支持]()
-
选择您首选的压缩类型——ZIP 或 GZIP,并下载所选格式的两个存档。让我们以 ZIP 格式为例。第一个 ZIP 文件包含 phpBB 界面的文本,第二个包含界面图形,如新帖子、引用等按钮。这些图形仅适用于默认的 subSilver 主题。
-
解压缩第一个文件,
lang_spanish.zip(如果您使用托管服务,请通过 FTP 上传),到您的 phpBB 目录中的language目录。这应该在language目录下创建一个lang_spanish子目录。 -
解压缩第二个文件,
subSilver_spanish.zip,到选定的目录。当您这样做时,您会注意到它有一个嵌套的目录结构,在您的选定目录中,您将有一个subSilver/images/lang_spanish路径。如果您遵循此路径,您将找到许多 GIF 文件。 -
将最后一个目录(
lang_spanish,包含所有 GIF 文件的目录)复制(和/或通过 FTP)到您的相应 phpBB 目录,templates/subSilver/images。
发生了什么?
在您成功解压缩 ZIP 存档并复制其内容后,您的论坛结构将如下截图所示:

现在如果您登录到您的论坛并访问您的个人资料,您会看到版面语言下拉菜单现在有两个值,如图所示:

如果您将偏好设置改为西班牙语,您将看到整个论坛都使用西班牙语界面。¡Hola!

现在您已安装了两种语言,但英语仍然是论坛的默认语言。如果您的社区主要是西班牙语使用者,您可以考虑更改默认语言。为此,您需要前往管理员面板,并在常规管理下遵循配置链接。
头像:启用和配置
头像是那些位于所有帖子用户名下的小图像,在查看用户资料时也会显示。在 phpBB 中它们默认是禁用的,但可以通过管理员面板轻松启用。
使用头像有三个选项,它们不是互斥的;您可以选择其中的任意数量。
-
第一个选项是启用所谓的相册头像:可以作为头像使用的图像由您选择,并托管在 phpBB 运行的同一服务器上。用户只能从提供的图像中选择他们偏好的头像。
-
第二个选项是启用远程头像:头像图像可以托管在互联网上的任何服务器上,用户只需通过图像 URL 地址(以
http://开头)链接到它。 -
第三个选项是允许用户上传头像:用户将他们的图片复制到您的服务器上,phpBB 在显示帖子时会从那里读取它们。
在做出决定时,所有这些选项都有其优缺点需要考虑。
-
远程头像在服务器安全方面是您最安全的赌注;一切都掌握在用户手中,您的论坛不负责托管或管理这些图像。然而,一些用户可能想要使用硬盘上的图像,而这些图像在互联网上无处可寻。此外,由于互联网的动态性,许多页面甚至整个网站可能在一天之内出现和消失。这意味着今天用户选择的图像明天可能就不可用了,并且一些浏览器(如 Internet Explorer)将显示一个损坏的图像图标,这看起来并不美观。或者即使头像可用,但托管在速度较慢的网站上,它可能会减慢整个页面的加载速度。当版主使用不允许热链接的服务器上的头像时,可能会出现问题。此外,您无法控制头像的大小。有人可能会将一个非常大的图片作为头像,从而破坏整个主题的外观。
-
使用相册头像,您可以控制图像的大小,因为您是选择它们的人。缺点是这些图像会增加您的带宽使用量,并且对用户来说过于限制性,因为他们只能从预定义的选择中挑选一个图像。
-
上传的头像可能会导致带宽增加,这对于用户众多的繁忙论坛来说可能是一个问题。另一个问题可能是,一些主机可能不允许您使用文件上传,因为普遍的担忧是用户对服务器所做的任何操作都可能具有潜在的危险性。除此之外,上传的头像还有许多好处,例如定义图像的像素大小和字节数。使用上传的头像,用户可以自由使用他们能找到的任何可能的图像,而不仅仅是互联网上可用的图像。
要配置头像,您需要以管理员身份登录,转到管理员面板,并显示通用配置表:

这是在配置表中的头像部分看起来像什么:

前三个字段代表前面讨论的三个头像选项。接下来的三个字段仅适用于上传的头像,而最后一个字段仅用于相册头像。
要更熟悉头像选项,最好的做法就是启用所有三个选项,并尝试使用头像。之后,您就可以做出选择了。
小贴士
获取相册头像
您可以从www.phpbb.com/styles/获取您相册的头像。点击下载,然后头像。将包解压到配置中指定的avatars目录内的子文件夹中(默认为images/avatars/gallery)。
小贴士
不要忘记权限
如果您启用了头像上传,您必须确保指定的包含图像的目录(默认为images/avatars)是可写的,这意味着 Linux 系统上的chmod 777。在第二章中解释了设置文件权限。
您可以为相册头像设置类别;实际上,您至少需要有一个类别。这意味着您必须将所有相册头像复制到主头像相册目录的子目录中。例如,您会将dog.gif和cat.gif复制到images/avatars/gallery/pets,即使您托管的是一个宠物爱好者网站,而pets将是您永远需要的唯一相册。无论如何,这个功能有助于您保持相册的有序。
管理表情符号
phpBB 自带一组默认的表情符号,但您可以更改默认设置或添加新的表情符号。实际上,您的用户可能要求您添加更多表情符号,因为默认的表情符号可能不足以表达他们的情感。或者,可能只是因为您的某些成员习惯在其他他们访问的论坛中看到不同的表情符号,并怀念您论坛中的那些可爱图形。
如您所知,表情符号和表情图标是同义词。"表情符号"是一个更广泛使用的术语,而"表情图标"可能更准确,因为并非所有的小圆脸都在微笑。另一个有趣的事情是,"smilie"这个词可以拼写成"smilie"和"smiley"。phpBB 更喜欢"smiley",但谷歌搜索结果显示"smilie"的结果更多,所以它显然更常用。在这本书中,我们采用了"smilie"。
phpBB 为您提供以下功能:
-
编辑或删除现有表情符号
-
逐个添加新表情符号
-
使用特殊的
.pak文件批量添加新表情符号 -
使用您当前安装的表情符号创建
.pak文件;如果您已经创建了许多想要与其他 phpBB 管理员分享的表情符号,这是一个好主意。
表情符号的特性
让我们先看看表情符号由什么组成。每个表情符号都有:
-
一个图像:如
和
这样的表情符号图像位于您论坛目录结构的images/smilies目录中。 -
一段代码:代码是发帖者需要输入(或通过点击相应的图像自动输入)的字符序列,以便在帖子中显示所选表情符号。对于前面提到的示例图标,相应的代码是😄和:?。有时一个表情符号可能有多个代码,因此有几种方法可以在帖子中包含相同的图像。您可以使用😄或😄或😁,结果始终是
图像。 -
一种情感:这是表情符号的人类可读表示。它可能(取决于浏览器)在读者将鼠标悬停在帖子表情符号上时显示为工具提示(在 HTML 术语中,它是
img标签的alt属性)。
这里有一对图像展示了示例。左侧插图显示了写作时的帖子;右侧插图显示了在 Internet Explorer 浏览器窗口中(鼠标悬停在表情符号上)显示的帖子。

表情符号管理面板
所有表情符号操作都可以通过管理面板中的表情符号链接在常规管理部分下访问:

点击此链接将显示现有表情符号列表:

这张插图显示了列表被截断在中间。随着新表情符号的添加,列表可能会变得相当长。您可以看到表情符号的所有属性——代码、图像以及它们所代表的情感——以及您可以对其执行的可能操作。
在进行以下练习之前,备份您的images/smilies目录可能是个好主意,以防您想恢复到默认表情符号。
编辑或删除表情符号
要编辑或删除一个表情符号,请使用旁边相应的链接。
在操作时要小心,因为当您点击删除时,将不会有“您确定吗?”的确认;表情符号将被永久删除。删除表情符号意味着它不能再用于帖子中;这也意味着任何使用此表情符号的旧帖子将显示代码,但不会显示图像。
删除表情符号不会从服务器上删除实际图像,因为很可能这个图像也被其他表情符号使用。例如,如果您删除了带有😄代码的表情符号,
的图像不会被删除,因为它也被😄表情符号使用。即使您删除了使用特定图像的所有表情符号,该图像也会留在服务器上,并且可以通过定义新的表情符号稍后使用。
要编辑表情符号,请使用旁边的编辑链接。这将弹出一个包含所有表情符号属性表单,如图所示。

表情图像文件下拉字段列出了您板安装的images/smilies文件夹中找到的所有文件。从下拉菜单中选择一个图像文件会显示此图像在旁边。
添加新表情符号
添加新表情符号最简单的方法是使用现有图像。
行动时间——使用现有图像添加新表情符号
-
在表情符号管理面板中,点击添加新表情符号按钮。显示的表单与编辑表单相同。
-
在第一个字段中,输入:mg:。
-
在第二个字段(下拉菜单)中选择icon_mrgreen.gif。
-
在最后一个字段中,输入Mr. Green。
-
点击提交。
发生了什么?
您使用相同的现有图像创建了一个新的格林先生表情符号。换句话说,您为用户使用此表情符号定义了新的方式。现在用户可以通过两种方式在他们的帖子中显示格林先生:使用默认代码:mrgreen:或新代码:mg:。
现在让我们添加一个全新的表情符号。假设您取了格林先生的图标并将其全部涂成橙色。现在让我们称这位先生为 Mr. Orange
并将文件命名为mr_orange.gif。
行动时间——添加自定义表情符号
-
将
mr_orange.gif文件复制/FTP 到您的images/smilies目录。 -
前往表情符号管理面板并点击添加新表情符号按钮。
-
在第一个字段中,输入:mrorange:。
-
在第二个字段中选择mr_orange.gif。
-
在最后一个字段中,输入Mr. Orange。
-
点击提交。
发生了什么?
您刚刚为您的板添加了一个全新的闪亮表情符号。您现在可以在表情符号列表中看到它。

使用.pak 文件添加表情符号
您可能想知道如何创建像上面示例中使用的 GIF 文件。嗯,这是一个超出本书范围的话题,但您可以在互联网上找到许多工具和教程。如果您不想处理图形,不用担心;对您来说有好事。网上有很多表情符号图像可供下载和使用在您的论坛上。为了简化安装,phpBB 有一个使用.pak文件批量添加表情符号的功能。这个“pak”代表“包”。
如果您访问www.phpbb.com/styles,点击下载,然后表情符号,您将看到一系列可供选择的表情符号包。让我们选择其中一个包下载,名为更多表情符号的包。

如果您下载eusasmiles.zip并解压它,您会看到它包含多个 GIF 文件和一个eusa.pak文件。不要被这个文件未知的扩展名吓到,它只是一个纯文本文件。如果您用任何文本编辑程序(如 Windows 中的记事本或 WordPad)打开它并查看文件内容,您会注意到它只包含表情符号属性,由字符序列=+:用作分隔符。
例如,文件的最后一行说:
eusa_silenced.gif=+:Silenced=+::-#
这意味着:-#是表示静音的表情符号代码,其图标图像名为eusa_silenced.gif。
现在让我们使用提供的.pak文件快速将大量新表情符号添加到论坛中。
行动时间——使用.pak 文件添加表情符号
-
将未压缩的内容(GIF 图像和.pak 文件)复制到您的公告板
images/smilies目录中。 -
前往管理面板中的表情符号管理区域,并点击导入表情符号包按钮。您将看到表情符号包导入表单。
![行动时间——使用.pak 文件添加表情符号]()
-
在下拉菜单中,选择eusa.pak。
-
保持其他字段不变。它们代表您对现有表情符号的处理选项以及如何处理任何冲突。
-
点击导入表情符号。
发生了什么?
您一次添加了大量的新表情符号。您现在可以在表情符号列表中看到它们,就在您在上一个练习中添加的橙先生表情符号之后。新的表情符号列表将看起来像这样:

创建.pak 文件
您可以使用现有的表情符号配置创建一个.pak文件。您可以用它进行备份或分享您的图标。比如说,您不仅创建了橙先生,还创建了白先生、粉先生、棕先生和金发先生,并且按照为橙先生相同的程序手动添加了它们。

现在让我们创建一个.pak文件,该文件将包含您已添加的所有表情符号属性,这样您就可以与其他 phpBB 管理员分享您的表情符号。
注意
本章中使用的图片可在书籍的下载区域 www.packtpub.com 获取。
动手时间——创建 .pak 文件
-
前往表情符号管理并点击 创建表情符号包 按钮。
-
您可以获取有关使用
.pak文件的信息,以及下载为您生成的.pak文件的选择。下载它。默认情况下,该文件名为smilies.pak,但您始终可以将其重命名为其他名称,例如reservoir_dogs.pak等。 -
包含文件包含您论坛上所有表情符号的所有属性,但实际上您只需要您的 五个 自定义表情符号。因此,在文本编辑器中打开
.pak文件,删除所有不必要的行,只留下您的五行。现在.pak文件的内容应该看起来像:mr_orange.gif=+:Mr. Orange=+::mrorange: mr_white.gif=+:Mr. White=+::mrwhite: mr_pink.gif=+:Mr. Pink=+::mrpink: mr_brown.gif=+:Mr. Brown=+::mrbrown: mr_blonde.gif=+:Mr. Blonde=+::mrblonde: -
将这个
.pak文件与五个图片一起压缩。
发生了什么?
您已经创建了一个包含您创建的所有表情符号的 .pak 文件。如果您想安装您自定义的表情符号,您可以将其发送给其他 phpBB 管理员。
分配等级
等级是给予社区成员参与信用的一种另一种方式。默认情况下只有一个等级:网站管理员 等级。您可以创建两种类型的等级:按帖子数量划分的等级 和 特殊等级。第一种类型的等级是自动的,并且随着成员不断发帖而分配。第二种类型不依赖于帖子数量,您可以根据需要使用管理面板中的用户管理功能进行分配。
等级被赋予名称,通常像 新用户、爱好者、论坛迷 等这样的名称。等级可以可选地包含等级图片。当查看用户的帖子时,分配给用户的等级名称将显示在用户名下方,等级图片将显示在等级名称下方,在头像上方。以下是一个分配等级时帖子作者信息区域的外观示例:

在这个示例中,The Dude 是您从上一章中已经知道的用户名,论坛巫师 是等级名称,五个星星是等级图片,而油漆刷点画是用户的头像。
以下示例将帮助您获得一些分配等级的实际经验。为了第一个示例,让我们假设您已经创建了五个等级图片。这些图片是 GIF 格式,分别显示一个、两个、三个、四个和五个蓝色星星,如下所示:
-
rank1.gif:![分配等级]()
-
rank2.gif:![分配等级]()
-
rank3.gif:![分配等级]()
-
rank4.gif:![分配等级]()
-
rank5.gif:![分配等级]()
如果制作 GIF 文件不是您的强项,别担心,您可以从互联网上下载等级图片:当然,一个可以查看的地方是 phpBB.com 网站。访问样式部分,然后点击 下载,接着点击 等级图片。您也可以在 phpBBHacks 网站上找到许多等级图片,网址为 www.phpbbhacks.com/rankimages.php。
行动时间——创建自动等级
-
在您的论坛的
images目录中,创建一个名为ranks的子目录。这将把与等级相关的图片与其他图片分开。 -
将上面列出的文件(
rank1.gif至rank5.gif)复制到新创建的目录中。 -
在管理面板中,点击管理菜单中的 等级 链接(最后一个链接)。
-
点击 添加新等级 按钮。
-
您将看到 等级管理 表单。按照说明填写:
![行动时间——创建自动等级]()
-
点击 提交。
-
重复步骤 4 至 6,直到使用完所有等级图片。最后,您的等级设置将如下所示:
![行动时间——创建自动等级]()
发生了什么?
您已成功设置了一个自动排名系统,该系统将在每个成员的帖子用户名后显示等级名称和等级图片。具体的等级将由 phpBB 根据该成员的总帖子数来确定。
实际上,您可能希望使用更多的帖子数量,但为了测试功能,这已经足够了。
现在我们来看看创建特殊等级的程序以及如何将特殊等级分配给您认为特别成员的方法。
行动时间——创建和分配特殊等级
-
在等级列表中点击 添加新等级。
-
按照说明填写表单:
![行动时间——创建和分配特殊等级]()
-
点击 提交
-
现在,在左侧菜单中,点击 用户管理 部分的 管理 链接。
-
在文本框中输入 The Dude 并点击 查找用户。
-
滚动到用户管理表单的底部。在 等级标题 下拉菜单中,选择 年度达人。
-
点击 提交。
发生了什么?
步骤 1-3:您创建了一个特殊等级,这意味着它与帖子数量无关。最小帖子数 字段留空,因为它不适用于特殊等级。实际上,即使您在其中输入了某些内容,phpBB 也会忽略该值。在这个例子中,您没有创建新的等级图片,而是重新使用了现有的表情图片。
步骤 4-7:您已将新创建的特殊等级分配给用户。如果您现在访问您的论坛前端,并找到 The Dude 的帖子,您将看到新的等级。
理解论坛权限
论坛权限已在 第三章 中讨论,但现在我们将采取更深入的方法,以便我们可以更精确地指定谁可以在您的论坛上做什么。
让我们从定义两个重要术语开始:权限类型和权限级别。
权限类型和权限级别
权限类型和权限级别是处理 phpBB 权限时的重要术语,理解这些将有助于你在考虑如何分配和控制权限时:
-
权限类型是用户在版面上可以执行的操作,如查看、回复、投票等。当你考虑权限类型时,想想“什么”,在“可以做什么?”
-
权限级别反映了关于谁可以执行特定操作的限制。每个用户至少有一个权限级别。当你考虑权限级别时,想想“谁”在“谁可以做到?”
以下列表讨论了存在的权限类型(“什么”),以及它们为用户提供的能力。(你已经知道这些动作的含义,因为它们在前面的章节中已详细描述。)
-
视图:用户可以看到在版面首页存在一个论坛。
-
阅读:用户可以列出论坛主题,阅读帖子,查看成员资料和他们的联系信息。
-
回复:用户可以在现有主题中发表帖子。
-
发帖:用户可以开始新主题。
-
编辑:用户可以编辑自己的帖子。
-
删除:用户可以删除自己的帖子,前提是还没有人回复过它们。
-
置顶:用户可以开始置顶主题。这取决于帖子权限——如果你不能发帖,你当然不能发置顶主题。
-
公告:用户可以开始公告。就像置顶类型一样,帖子权限是一个先决条件。
-
投票:用户可以在投票中投票。
-
创建投票:用户可以为其他人创建投票。
权限级别,或“谁”,也可以被视为用户类型。
这里是可能的权限级别:
-
所有人:访问该版面的人;这包括当前未登录的成员。
-
注册用户:在版面上注册并当前登录的成员。
-
私人:一个单独分配的特殊权限级别。为了使处于此级别的用户能够与其他人私下交流,必须授予该用户对私人论坛的私人访问权限。这是权限中最复杂的一部分,所以如果你还不理解,不要害怕。这里将有一些例子来阐明这个概念。
-
版主:可以对该论坛做任何事情的版主。
-
管理员:版面管理员(就像你这样的人,可以访问管理面板)。
简单和高级模式设置权限
如你所知,有两种设置权限的方式:简单模式和高级模式。简单模式已在第三章中讨论,正如你所知,它为你提供了预定义的权限选项。
如果你访问高级模式,你会看到我们上面讨论的所有可能的权限类型和权限级别。为此,以管理员身份登录,转到管理员面板,在论坛管理部分点击权限,查找任何论坛,然后点击高级模式。以下是你会看到的内容:

此屏幕显示了所有权限类型(显示为表头)和权限级别(这些是下拉框中的值)。上面插图所示的高级权限在简单模式中显示为注册用户,如下面的插图所示:

我们已经看到简单模式是一种更快、更简单的方式来设置权限。现在让我们找出简单模式——公开、注册、私人和版主——的确切含义,以及它们组合了哪些高级权限设置。
关于这些模式的大致想法是,它们定义了谁可以在所选论坛中发帖(例如,所有人都可以在公开论坛中发帖,但只有登录的成员可以在注册用户论坛中发帖,等等)。
除了公开模式外,所有其他简单模式都有一个选项,其名称中包含[隐藏]。这意味着没有足够权限的用户不仅不能发帖,甚至无法看到这样的论坛存在。
这里是对简单模式权限的更详细解释:
-
公开:所有人(权限级别 ALL)都可以查看公开论坛,阅读它,回复话题,并开始新话题。注册并登录的成员(权限级别 REG)甚至可以编辑和删除自己的帖子、投票和创建投票。
-
注册用户:所有人都可以查看和阅读论坛。注册用户(REG)可以发帖、开始话题、编辑和删除自己的帖子、投票和开始投票。
-
注册[隐藏]:与上述相同,但所有人现在都无法查看或阅读论坛——他们必须注册才能这样做。
-
私人:论坛对所有用户可见,仅为了看到它的存在,但它是私人的,只有明确允许访问此论坛的用户才能阅读帖子、发帖、开始话题、编辑和删除自己的帖子、投票和开始投票。本章的下两个部分将解释如何授予用户私人访问权限。关于私人论坛的另一个特定之处在于,私人成员也可以发表粘性帖子。然而,公告仍然是“仅限版主”区域。
-
私人[隐藏]:与上述相同,但所有人现在都无法看到这个论坛的存在。这是一个真正受保护和私人的论坛。
-
版主:与注册用户和私人相同,但只有版主可以阅读、发帖、开始话题、投票等。一个用户必须在这个论坛中是版主才能使用它。在其他论坛中成为版主并不意味着用户可以访问这个论坛。
-
版主[隐藏]:与上述内容相同,除了 ALL 甚至看不到这样的论坛存在。
下表解释了与上述要点相同的内容,但更详细。你会发现这实际上是一种理解权限的好方法。
| x | 公开 | 注册用户 | 注册用户[隐藏] | 私人 | 私人[隐藏] | 版主 | 版主[隐藏] |
|---|---|---|---|---|---|---|---|
| 查看 | ALL | ALL | REG | ALL | PRIVATE | ALL | MOD |
| 阅读 | ALL | ALL | REG | PRIVATE | PRIVATE | MOD | MOD |
| 发布 | ALL | REG | REG | PRIVATE | PRIVATE | MOD | MOD |
| 回复 | ALL | REG | REG | PRIVATE | PRIVATE | MOD | MOD |
| 编辑 | REG | REG | REG | PRIVATE | PRIVATE | MOD | MOD |
| 删除 | REG | REG | REG | PRIVATE | PRIVATE | MOD | MOD |
| 置顶 | MOD | MOD | MOD | PRIVATE | PRIVATE | MOD | MOD |
| 公告 | MOD | MOD | MOD | MOD | MOD | MOD | MOD |
| 投票 | REG | REG | REG | PRIVATE | PRIVATE | MOD | MOD |
| 创建投票 | REG | REG | REG | PRIVATE | PRIVATE | MOD | MOD |
在设置权限时,选择一种简单的模式总是一个好主意。这些模式已经被 phpBB 团队精心挑选,以匹配最常用的论坛类型。如果你觉得你需要不同的东西,你总是可以切换到高级模式。在这种情况下,首先使用简单模式设置和保存权限,然后再编辑它们,并切换到高级模式进行微调。
行动时间——创建和微调私人论坛
-
以管理员身份登录并转到管理员面板。
-
前往论坛管理下的管理。
-
在这个类别中创建一个新的类别名为特殊论坛,然后在这个类别中创建一个新的论坛名为The Dudes 论坛。
-
在论坛管理下点击权限链接。
-
从选择一个论坛下拉菜单中选择The Dudes 论坛并点击查找论坛。
-
您现在位于论坛权限控制区域和简单模式。
-
选择私人[隐藏]并点击提交。
-
重复步骤 5。
-
点击高级模式以切换到更强大的编辑表单。
-
在置顶列中,将 PRIVATE 值更改为 MOD。
-
点击提交以保存设置。
发生了什么
步骤 1-3:您已创建了一个新的类别和一个新的论坛。
步骤 4-7:您已使用简单模式设置论坛权限。您已设置权限,以便只有特殊私人成员可以查看、阅读、发布等,在论坛上。唯一私人成员不能做的事情是发布公告。(当然,如果用户不是版主,他们只能编辑或删除他们自己的帖子,而不能编辑其他私人成员的帖子。)
步骤 8-11:您再次设置了权限,这次使用的是高级模式,并禁止私人成员发布置顶帖子。
现在,如果你访问你的论坛首页,你会看到新的类别和新的论坛(因为你以管理员身份登录,可以查看和做任何事情),但一旦你登出,论坛和整个类别将不再可见。
在接下来的两个部分中,我们将了解如何通过将某些成员设为私有成员,使私有论坛对某些成员可见。
理解用户权限
你已经知道如何使用管理员面板的权限区域将用户设为版主;让我们看看你还能做什么。如果你记得,用户权限可以通过用户管理部分下的权限链接访问:

你可以看到,除了在这里设置版主状态外,你还可以为每个论坛指定用户权限(换句话说,指定仅适用于特定用户的论坛权限)。请注意,您只能为此选项使用私有论坛;对于所有其他类型的论坛,论坛权限将应用,并且用户权限不能覆盖它们。
注意
根据定义,私有论坛至少设置了一种权限类型为私有。
在上一节中,我们将Dudes 论坛创建为一个私有论坛,因此现在在用户权限控制区域,我们可以允许或禁止用户访问私有论坛。允许访问意味着此用户成为私有成员,可以执行私有成员被允许执行的所有操作——用户将拥有论坛管理中为私有级别设置的权限类型(例如阅读、发帖等)。
行动时间——将 Dudes 论坛的 Dude 设为私有用户
-
以管理员身份登录并转到管理面板。
-
在用户管理下选择权限。
-
输入The Dude并点击查找用户。在此阶段,你会看到类似于本节开头所示的上一幅插图。
-
在Dudes 论坛行中,将第一个下拉菜单从禁止访问更改为允许访问。
-
点击提交以保存权限设置。
发生了什么?
你已经允许 The Dude 访问私有 Dudes 论坛。通过这样做,你使 The Dude 成为此论坛的私有成员,并让他享受论坛管理员中设置为私有的所有权限类型。
如果你再次重复步骤 1-4,然后点击高级模式,你会看到一个如下所示的屏幕:

高级模式表单允许你在每个用户的基础上更加精确,通过关闭默认允许私有成员的某些权限类型。在置顶和公告列中,你没有选项,因为这些权限类型在设置论坛权限时被设置为 MOD 而不是私有。
有另一种限制用户权限的方法,这与权限无关——允许或拒绝每个用户的私人消息和头像,以及激活或停用用户的能力。这可以通过在管理员面板(用户管理员部分下的管理链接)中编辑用户的个人资料并使用以下说明中的仅管理员可见的特殊字段来完成:

用户组和群组权限
用户组是您根据认为合适的某些标准创建用户组的一种方式。您不必使用用户组——在默认的 phpBB 安装中,不存在任何组,但这可能是一个有用的功能。
用户可以通过使用用户组
顶部导航菜单图标来访问用户组。作为管理员,您也可以使用此链接;它还为您提供了某些管理选项。当群组管理员访问此链接时,也会弹出管理群组的界面。
每个群组都有一个管理员。这位社区成员负责管理群组,不要与论坛管理员混淆。群组管理员在论坛主题或帖子中没有特殊权限;他们只在管理的群组中拥有特殊权限。他们可以向群组添加和移除成员,可以接受或拒绝成员申请,并可以更改群组类型。
存在哪些类型的群组?一个群组可以是公开的、封闭的或隐藏的。
-
一个公开的群组对每个人都是可见的,并接受新成员。为了成为群组成员,用户需要申请加入。群组管理员可以接受或拒绝申请。他或她还可以在不要求这些成员先申请的情况下添加成员到群组。
-
一个封闭的群组是不接受申请的群组。群组管理员仍然可以添加新成员。
-
一个隐藏的群组就像封闭群组,但不会显示给用户。只有登录的群组成员才能看到它。群组管理员会添加新成员。
行动时间——创建新群组
-
以管理员身份登录并转到管理面板。
-
在群组管理员菜单部分下点击管理链接:
![行动时间——创建新群组]()
-
点击创建新群组按钮。
-
按照所示填写表格:
![行动时间——创建新群组]()
-
点击提交。
发生了什么?
您已成功创建了一个名为测试的新用户组,世界闻名的用户The Dude担任管理员。这个群组是公开的,并接受成员申请。
如果您现在访问论坛的前端,转到用户组,查看测试群组的信息,您将看到以下屏幕:

由于你仍然以管理员身份登录,你可以看到更改组类型和添加/删除成员的组管理员选项。你不会看到会员申请界面,因为没有当前申请。此外,因为你不是这个公开组的成员,你看到的是加入组按钮。
点击加入组按钮申请成为组成员。这将向组管理员发送一封电子邮件,通知有新的待处理申请。管理员登录,进入用户组(上面的屏幕),接受或拒绝此申请。如果申请被接受,你成为组的成员,并会收到一封电子邮件通知这一事实。
行动时间—编辑组
-
你仍然以管理员身份登录;前往管理面板。
-
在组管理员下,点击管理。
-
测试组被选中;点击查找组。
![行动时间—编辑组]()
-
如所示更改组名和描述。同时,将组状态更改为隐藏组。
![行动时间—编辑组]()
-
点击提交以保存更改。
发生了什么?
你已成功编辑了组。这是一件简单的事情,就像创建组一样。但这次你在编辑组表单上有两个额外的复选框:你可以删除组,并且在更改组管理员时,你可以选择前管理员是否作为普通成员留在组中或从组中移除。
组权限
管理员有设置组权限的选项。组管理员无法控制它们。组权限的工作方式与用户权限相同。唯一的区别是你可以为每个组设置一次权限类型,它将适用于组中的所有成员。这可以节省你大量的工作。尽管成员是组的组成部分并且有组权限,但你仍然可以基于每个用户覆盖这些权限。这意味着,例如,你可以指定用户组的所有成员都可以发布公告,但随后禁止组中特定用户这样做。
组权限可通过管理面板导航菜单中的权限链接访问组管理员部分:

你可能想要执行的一个常见任务是创建一个只能由特定用户使用的特殊隐藏论坛(例如,一个供版主使用的论坛,他们可以在不公开讨论的情况下讨论版面或用户相关的问题)。
为了做到这一点,你需要:
-
创建一个私有[隐藏]论坛。
-
创建一个私有组。
-
允许组访问使用私有论坛。
到目前为止,我们已经讨论了前两点。我们已经创建了一个名为 The Dudes 论坛的特殊私有隐藏论坛,并且你有一个名为 The Dudes gang 的隐藏组。现在最后一点:给予 The Dudes gang 访问 The Dudes 论坛的权限。
行动时间—设置分组权限
-
以管理员身份登录,并转到管理面板。
-
在导航菜单的分组管理员部分下选择权限。
-
在下一屏中,选择The Dudes gang并点击查找分组。
-
在分组权限控制表单中,切换到高级模式。
![行动时间—设置分组权限]()
-
将The Dudes 论坛行上的所有下拉菜单从关闭更改为开启。
-
点击提交以保存权限设置。
发生了什么?
您已经为The Dudes gang用户组授予了权限,使其能够在The Dudes 论坛中阅读、发帖、投票等。这里有一些额外的点供您思考并实验。
-
您可以使用高级模式通过选择性地开启/关闭来授予权限;没有必要全部开启或全部关闭。
-
简单模式不能用于设置分组权限,在本书所基于的 phpBB 版本中不能使用。
-
论坛版主和分组版主是完全独立的。The Dude 是 The Dudes gang 的分组版主,但不是 The Dudes 论坛的论坛版主。
-
您可以通过设置组的是否版主状态,使组中的每个人都能成为版主。
-
分组权限是设置权限的一种快速方式,但您仍然可以使用用户权限来更具体地设置。用户权限会覆盖分组权限。
-
您可以拥有几个具有不同论坛访问权限的用户组。例如,您可以设置一个名为“初级 Dudes”的公开组,该组只能阅读****The Dudes 论坛,而古老的The Dudes gang用户组仍然可以发帖。
再次查看数据库备份和恢复
您已经知道如何使用 phpBB 的备份和恢复工具。提到过,如果您有一个非常大的数据库,并且您的托管提供商对服务器资源使用设置了某些规则,它们可能不会按预期工作。所以现在让我们看看使用其他方法来实现相同的结果。MySQL 是本节中使用的 RDBMS;它是运行 phpBB 最流行的。
使用 phpMyAdmin
phpMyAdmin 可用于备份和恢复您的论坛数据库。它有一个导出工具,可以帮助您创建一个表的 SQL 转储或数据库或甚至服务器上所有数据库的 SQL 转储。SQL 转储是一个包含创建表或数据库所需的所有必要 SQL 命令的文本文件。phpBB 的数据库备份和恢复工具使用相同的 SQL 转储。
如果您感到好奇,可以使用文本编辑器打开一个 SQL 转储,您会看到一系列以如下开头的 SQL 命令:
-- phpMyAdmin SQL Dump
-- version 2.6.0-rc2
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Dec 14, 2004 at 10:45 PM
-- Server version: 3.23.47
-- PHP Version: 4.3.0
--
-- Database: ‘forums’
--
-- --------------------------------------------------------
--
-- Table structure for table ‘phpbb_auth_access’
--
CREATE TABLE ‘phpbb_auth_access’ (
‘group_id’ mediumint(8) NOT NULL default ‘0’,
‘forum_id’ smallint(5) unsigned NOT NULL default ‘0’,
‘auth_view’ tinyint(1) NOT NULL default ‘0’,
‘auth_read’ tinyint(1) NOT NULL default ‘0’,
‘auth_post’ tinyint(1) NOT NULL default ‘0’,
‘auth_reply’ tinyint(1) NOT NULL default ‘0’,
‘auth_edit’ tinyint(1) NOT NULL default ‘0’,
‘auth_delete’ tinyint(1) NOT NULL default ‘0’,
‘auth_sticky’ tinyint(1) NOT NULL default ‘0’,
‘auth_announce’ tinyint(1) NOT NULL default ‘0’,
‘auth_vote’ tinyint(1) NOT NULL default ‘0’,
‘auth_pollcreate’ tinyint(1) NOT NULL default ‘0’,
‘auth_attachments’ tinyint(1) NOT NULL default ‘0’,
‘auth_mod’ tinyint(1) NOT NULL default ‘0’,
KEY ‘group_id’ (`group_id`),
KEY ‘forum_id’ (`forum_id`)
) TYPE=MyISAM;
--
-- Dumping data for table `phpbb_auth_access`
--
如果这看起来像是一种外星语言,请不要担心;您不需要了解任何这些。这只是为了给出 SQL 转储看起来像什么的例子。重要的是要知道如何创建它们并使用它们。
phpMyAdmin 的好处在于它允许你创建单个表的 SQL 转储,而不是整个数据库的单个文件。这很好——如果你需要稍后恢复数据库,并且你的托管提供商对上传文件的大小有限制,那么你可能可以通过将可能很大的数据库分割成几个较小的 SQL 转储来绕过上传限制。
让我们看看一个例子,它将帮助你理解使用 phpMyAdmin 进行数据库备份和恢复的流程。为了本例以及本章后面的其他示例,让我们假设包含你的论坛的数据库被命名为 forums,你的数据库用户名为 dbuser,访问数据库的密码是 dbpass。
时间行动——创建 SQL 数据库转储
你目前位于“forums”数据库的前页。它看起来如下所示:

-
点击
标签,将跳转到如下页面:![时间行动——创建 SQL 数据库转储]()
-
你可以在数据库的顶部左侧的导出下看到所有表。在这里,你可以单独选择要转储的表。点击全选以转储所有表。
-
将所有其他字段保留在默认值。请务必检查结构和数据复选框都已选中。
-
选择另存为文件复选框。
-
点击Go。
-
你将弹出一个文件对话框窗口,询问在什么名称和位置保存转储文件。使用 mydump.sql 作为文件名,并保存到你认为最合适的位置(例如,一个用于存放所有备份转储的目录)。
发生了什么?
你已经成功创建了包含你的论坛数据库中所有表和数据的 SQL 转储文件。在步骤 2 中,你看到了如何选择性地选择要包含在转储中的表,从而创建几个较小的转储,这些转储一起包含所有数据库表和数据。
如果你现在点击
标签,你将被带到允许你执行 SQL 查询的页面。

在截图的第二部分,在文本文件位置标题下,你可以上传一个 SQL 转储到你的数据库中执行。这是操作的“恢复”部分。通常在完全不同的服务器和空数据库上完成(例如,当你切换托管提供商并移动你的论坛时)。
在图例中所示的情况下,你可以看到有一个 8192KB(或 8MB)的限制;你不能上传比这更大的备份。如果你的 SQL 备份更大,你必须将其分成更小的块。另一个好选择是向你的提供商解释情况(他们可能会建议你使用 FTP 上传文件,然后他们可以从那里使用像命令行 MySQL 实用程序这样的工具导入它)。
使用 MySQL 命令行工具
如果你可以从命令行访问 MySQL,那么大型数据库就不会成为问题;你应该能够进行备份,并在需要时进行恢复。第二章已经讨论了如何使用mysql实用程序从命令行连接到 MySQL。在这里,我们将讨论另一个实用程序:mysqldump。
使用 mysqldump 创建备份
如其名所示,这是一个用于从 MySQL 数据库创建 SQL 备份的实用程序。它有很多选项,你可以通过使用--help选项调用实用程序来始终调查这些选项,如下所示:
mysqldump --help
你也可以在dev.mysql.com/mysqldump上阅读有关此实用程序的说明,这是 MySQL 在线手册。
这里有一个如何使用此实用程序创建forums数据库备份的示例:
mysqldump -u dbuser -pdbpass forums > mydump.sql
这行普通的英语意思是“创建一个名为 forums 的数据库的 SQL 备份,并将这个备份写入当前目录下名为 mydump.sql 的文件中。为了证明我有权访问这个数据库,我给你我的用户名,它是 dbuser,以及我的密码,它是 dbpass。”请注意,选项-p和密码是粘合在一起的;在-u选项和用户名之间没有空格。
如果你可以在服务器上创建一个计划任务(一个cronjob),你可以让这个命令行每天执行以创建一个新的数据库副本。这个命令可能因服务器而异,主要是在右尖括号后面的部分,其中指定了备份文件名及其位置。
你甚至可以更进一步,通过创建压缩的 SQL 备份并删除原始备份来节省硬盘空间,原始备份可能很大。在 Linux 系统中,你可以使用tar归档程序;你可以作为一个 cronjob 运行的整个命令可能类似于:
mysqldump -u dbuser -pdbpass forums > mydump.sql ; tar cz mydump.sql -f mydump.tgz ; rm f mydump.sql
现在 这 才是真正的系统管理员工作!如果你想要用普通的英语翻译这句话,它意味着“创建我的论坛数据库的 SQL 备份,并将其写入 mydump.sql 文件中。压缩 mydump.sql 并创建 mydump.tgz 文件。现在删除不再需要的 mydump.sql 文件。”
使用 mysql 实用程序恢复数据库
要恢复数据库,意味着从现有的 SQL 备份中创建一个新的数据库。现在我们有一个包含forums数据库所有内容的mydump.sql文件,让我们创建一个名为forums-copy的新数据库,并将内容复制到那里。你可以在 phpMyAdmin 中这样做,但我们将看到如何从命令行操作。
动手时间——从 SQL 备份创建数据库副本
-
在命令行中,输入
mysql -u dbuser pdbpass并按 Enter 键。 -
输入
CREATE DATABASE forums-copy; 按 Enter 键。 -
输入
\u forums-copy. 按 Enter 键。 -
输入
\. mydump.sql按 Enter 键。如果一切正常,你们会看到很多这样的消息:Query OK, 1 row affected (0.00 sec)
发生了什么?
-
你们已连接到数据库服务器。
-
你们创建了一个新的数据库。
-
你们已选择了新的数据库(
forums-copy)用于后续操作。 -
你们已执行了
mydump.sql文件。根据文件所在位置,可能需要调整文件路径。
其他工具
有时候你们可能不会使用命令行 MySQL 工具或 phpMyAdmin。或者托管提供商的限制可能使得 phpMyAdmin 对你们的大规模转储不可用。不要绝望,还有希望!你们可以使用一些专门设计的工具来处理大型数据库。其中一个很好的工具叫做 BigDump,可以从 www.ozerov.de/bigdump.php 免费下载。
它通过分块执行你的转储的小部分内容,直到所有 SQL 命令都执行完毕,来绕过服务器限制。
论坛的人性面:争论战和封禁
让我们暂时放下系统管理的内容,以审视运营在线社区的人性面来结束这一章。你们最有可能遇到的情况,几乎每个论坛管理员都会遇到,所以做好准备或者至少意识到你们并不孤单是很好的。
无论你们的论坛是关于什么的,它很可能开始是一个只有少数几位好伙伴在其中的小型论坛。也许这个论坛将是你们现有网站的一个补充;它的论坛可能会讨论你们网站的内容,在那里你们会回答问题并获得建议。
如果你们有一个内容有趣的网站,你们的社区很可能会逐渐增长。随着越来越多的人加入,会有更多不同的意见被分享。偶尔可能会爆发争论战,其中一些社区成员开始交换敌意。不要慌张!这不是你们、你们的论坛或你们的网站的责任。这只是偶然发生。自从网络通信开始以来,这种情况就一直在发生,在 Usenet 群组、邮件列表等等。争论战是网络社区的一部分;这是人类的行为。
也可能有一些社区成员似乎喜欢挑起新的争论战,看起来他们来到论坛的唯一目的就是让你们社区的成员生活痛苦。这种情况是会发生的。互联网提供的匿名性可能会让一些人表现得与他们真实面目截然不同。你们必须学会接受这个事实。但这并不意味着你们必须容忍这种行为。一些受尊敬和重视的社区成员可能会开始限制他们的参与,甚至因为那些人的不良行为而彻底离开社区。这是你们不希望发生的事情。
在这种情况下很难,没有固定的方法。你必须使用你最好的判断力,你必须像领导者一样行动,并为你的社区树立榜样。在某个时候,你可能最终会写一些像“发帖前请阅读”这样的粘性帖子,类似于使用条款。这是一个好且必要的步骤,因为它设定了基本规则。没有规则就没有对错,每个人都可以对可接受的行为和不可接受的行为有不同的理解。你还需要在撰写这些规则时小心,不要使它们过于严格。这些规则需要被尊重,这就是为什么它们是规则。所以,不要设定不可能实现的目标和愿望清单作为规则;做一个现实主义者。
在某个时候,论坛可能会增长到如此程度,以至于你无法一直跟踪发生的事情。你需要有人来关注它。这就是版主发挥作用的地方。他们是你在论坛上的最佳助手。他们会自愿花时间让论坛成为和平讨论的更好场所。所以,请仔细选择他们。首先,你必须信任你的版主。但可能性是,你甚至从未见过这些人,你怎么能信任他们?再次强调,跟随你的直觉,并使用你最好的判断力。
禁止用户永远不是一件容易的任务。尽可能避免这样做,因为被禁止的用户会找到方法使用虚假 IP 地址一次又一次地重新注册,并且会继续滥用你的社区。而且,被禁止的用户会感到并表现得像受害者。所以,再次强调,尽可能避免禁止。尝试以和平的方式解决任何问题,尝试倾听那个用户的问题,并将禁止作为最后的手段。但当你决定禁止某人时,就要果断执行。
这里有一些可以帮助你进行论坛管理的更多提示。
-
为你的版主创建一个私人[隐藏]论坛。让他们在隐私中讨论论坛问题,并做出集体决策。
-
创建一个私人[隐藏]论坛,作为回收站。不要删除帖子,而是将其移至那里。当只有少数帖子需要删除,但其他方面主题是好的时,将相关的帖子分成一个新的主题,并将这个主题移至回收站。回收站可以帮助你在需要时了解发生了什么。授予你的版主访问回收站的权限,以便他们可以管理移至那里的主题。
-
当一些版主禁止用户时,他们会暂时禁止,然后在比如说一周后解除那些麻烦制造者的禁令。有时候这会有所帮助。
-
用户会对不同的事情进行投诉——你、论坛、其他用户等等。倾听他们的话。但记住:有很多人对论坛、生活以及一切都很满意。这是一种正常的行为——当你感到满意时,你不会写帖子来说你很满意,但当你对某件事感到愤怒时,你会立刻写下来。
-
阅读弗吉尼亚·希尔的《网络礼仪》一书。您可以在
www.albion.com/netiquette/book/在线找到它。这本书写于很久以前,它讲述了 Usenet 群组中的网络战争,而不是在公告板上。因此,看到你不是唯一一个经历这种极端情况的人,你的板块也不是第一个遇到这种情况的,这会让人感到更加安心。你会在其中认出很多社区成员和描述的情况,这肯定会给你带来不少欢笑。比如关于网络战争的类型(“拼写之火”、“生活之火”)等话题,实际上非常有趣。 -
再次强调,这里没有固定的食谱,所有的板块都是不同且独特的,所以请运用你最好的判断力,成为一个领导者。祝你好运!
第六章:创建您的模板
制作自己的模板不仅可能非常有趣,也可能非常耗时。有许多小细节正等着被忽视,这就是为什么我建议您不要急于完成它。慢慢来,最终你会得到回报。
就像许多其他与设计相关的项目一样,创建一个吸引人的 phpBB 模板最具挑战性的事情之一就是得到布局的想法。你可能已经有了主页,并希望应用那个布局,但很多时候我看到人们围绕他们的 phpBB 模板布局构建他们网站的其余部分。
因此,在本章中,我们将从头开始,告诉您如何将基本的布局想法转化为构建整个模板。
让我先说,灵感,以及整个创造性过程本身,并不是少数人拥有的珍贵礼物。这是每个人都可以通过练习和耐心在一段时间内学会的东西。找到一些布局想法,并调整它们,直到你对结果满意;你花在这上面的时间越多,你就越会了解自己:你喜欢什么,不喜欢什么。很快,你就会发展出自己的风格,几乎可以把任何东西变成你想要的。
在寻找您未来的 phpBB 模板布局时,有无数的地方可以开始寻找;杂志、报纸、广告、主页、建筑、艺术,甚至基本的壁纸都只是我找到的有用的一些灵感来源。在咖啡店花半小时,用笔在餐巾纸上画线,可能会揭示最吸引人的布局。这完全取决于你愿意走多远,尽管我怀疑没有人能基于像…茶壶这样的东西构建出一个好的模板布局。
对于 phpBB 模板中需要的布局类型,你应该尝试寻找你可以使用的模式。例如,我们需要能够显示主题和帖子,可能还有空间放置一张图片和一个菜单。
本章中我将要构建的模板是基于我从一份报纸上得到的一个想法。实际上并不复杂:只是一张照片、一个标题和一些文字,我在一张纸上画了个草图以免忘记。我喜欢它的简洁、线条和相当大的图像。即使它第一眼看起来可能不像 phpBB 模板,我仍会尝试,同时向您展示如何克服路上必然会遇到的任何障碍:

绘制布局草图
我要做的第一件事是在 Photoshop 中制作模板的粗略基本布局。它不需要非常精确或准确,但足以获得模板的大致外观。首先需要决定一些重要的事情,从布局的宽度开始。将宽度设置为 100%是 HTML 网站和模板的一个非常流行的选择,但考虑到顶部的图片,这可能不是这个布局的最佳选择。我需要一个固定的大小。此外,为了防止整个布局变得过大,我决定将整个布局的宽度缩小到仅 780 像素。这将给论坛的两侧留下一些“空间”,并且看起来更像基于纸张的布局。在这个宽度下,为那些屏幕分辨率为 800x600 像素的用户分配了 20 像素的滚动条空间。
对于顶部的较大图片,我有一张很久以前为 Photoshop 比赛制作的旧 PSD 图片。我一直想在我的某个项目中使用这张图片,这似乎是一个好机会。图片的格式是 717x231 像素,大小适中,既不太大也不太小。
在图片下方将出现菜单。黑色线条下的论坛表格如果与背景颜色相同看起来不会很好,所以我给它们添加了浅灰色阴影。
由于我的 PSD 图片颜色与模板布局的其他部分不匹配,很难获得良好的色彩感觉。经过尝试新的背景和论坛颜色,以匹配图片,我最终将图片改为一个空白的灰色框,以便与论坛的浅灰色相匹配。然而,我仍然觉得这不是最佳解决方案;它看起来太空了。
通过尝试一些 Photoshop 画笔,我最终找到了一个带有油漆溅洒效果的画笔,用红色颜色我成功地得到了一种看起来像鼻出血的效果。可能有点恐怖,但它看起来相当好,简单且整洁。我用一种我认为适合图片的字体添加了标题“NoseBleed”,使其更具动感。
在这个早期阶段没有必要涉及太多细节;如果你有更好的想法,很容易稍后更改图片和颜色。毕竟,这只是一个草图!
我仍然不确定是否想要一个彩色背景,或者甚至为论坛两侧的白色“空间”添加背景图片,所以我把这个选项留开放。不过,目前我们尽量保持简单;全部为白色。

完成草图后,我将图片剪裁出来并保存为top_image.jpg,这样我们就可以开始创建模板了。
TPL 代表模板
浏览器中的每一页都由三个 .tpl 文件组成,包括 HTML 代码、层叠样式表代码(CSS)和 phpBB 变量。第一个文件始终是 overall_header.tpl,最后一个文件始终是 overall_footer.tpl。这三个 .tpl 文件的中部显示了我们可以在该特定页面上看到的实际内容。例如,如果我们正在查看论坛的索引页,我们看到的是 overall_header.tpl、index_body.tpl 和 overall_footer.tpl 的代码组合。或者如果我们转到登录页,显示的 .tpl 文件是 overall_header.tpl、login_body.tpl 和 overall_footer.tpl,依此类推。这非常方便,因为我们只需要编辑一个 .tpl 文件,即 overall_header.tpl,就可以更改浏览器显示的所有页面的顶部部分。
想象一下,如果你要在一张商务信纸上写一封信。信纸的顶部已经印有公司名称、标志和地址(overall_header.tpl),也许底部还有一行地址(overall_footer.tpl)。你会在中间写上你个人的信息(中间的 .tpl 文件)。无论你写了多少封信,无论信的内容有多不同,你都会始终有相同的页眉和页脚。是中间的 .tpl 文件让 phpBB 论坛变得生动起来。
然而,在我们开始编辑任何文件之前,我们会在 phpBB 模板目录中的 subSilver 文件夹中创建一个副本,并将其命名为 NoseBleed。有了副本,如果出现问题,我们总能回到原始的 .tpl 文件。
创建模板文件夹
为了让 phpBB 识别新的 NoseBleed 文件夹作为一个独特的模板,我们需要编辑一些文件。在文件夹中,有一个名为 subSilver.cfg 的文件,我们将其重命名为 NoseBleed.cfg。我们还把 subSilver.css 重命名为 NoseBleed.css,尽管现在这个文件并不需要。最后,我们需要在 theme_info.cfg 文件中将每个 subSilver 实例替换为 NoseBleed。如果你使用 WordPad 来做这个,你可以按 CTRL+H 来打开 替换所有 窗口,使这个编辑变得快速。
现在,我们可以从管理面板上传和安装新的模板。
.tpl 文档编辑器
在 .tpl 文件中使用的代码基本上,如前所述,是 HTML 代码。如果你已经对基本的 HTML 和 CSS 有一些了解,你无需担心,如果你没有,也不要担心。我们将通过详细的解释来逐步完成这个过程。
对于这一章,我们使用记事本来编辑.tpl文件。我们也可以使用像 Dreamweaver 这样的 WYSIWYG 编辑器进行编辑。它可能有一些优点,比如在编码时能够看到布局的大致视图。然而,我不建议使用这些编辑器可以自动插入的代码,因为 phpBB 可能会与这类代码冲突。我们也可以使用 Word、WordPad 或任何其他文本编辑器,只要我们记得将文档保存为纯 ASCII 代码,因为 phpBB 不能读取富文本格式的.tpl文件。
首先,从NoseBleed文件夹中打开overall_header.tpl文件;这是包含每个页面顶部布局的文件。记住,如果你是第一次使用 HTML,不要紧张;实际上,它并没有看起来那么困难。在代码的顶部,你会找到一个告诉浏览器这是一个 HTML 文档的部分。然后,我们有页面的标题、CSS 代码,然后在底部,我们有将显示我们布局的 HTML 代码。当 phpBB 加载.tpl文件时,它会从数据库中填充 phpBB 变量。这些变量都使用大写字母,并且总是看起来像这样:{PHPBB_VARIABLE}。
在<style type="text/css">和</style>代码标签之间,你会找到所有的 CSS 代码,例如:
/* Name of poster in viewmsg.php and viewtopic.php and other places */
.name { font-size : {T_FONTSIZE2}px; color : {T_BODY_TEXT};}
如果你将代码放在 CSS 中的/*和*/标签之间,浏览器将忽略它。如果你想为自己或他人留下注释,可以使用这个功能。上面特定的 CSS 样式被称为.name。在name前面的点不是一个类型错误,但当你准备添加自己的样式时,你应该注意这一点。一个名为.table的 CSS 样式只会影响你的 HTML 文档中应用了它的区域,例如:
<span class="table">Some text here</span>
然而,一个没有点的名为table的 CSS 样式将对你的 HTML 文档中的每个表格产生影响。
但让我们开始构建我们的模板!
准备,设置,出发!
拿着草图,创建模板的最佳方式是简单地遵循草图,从顶部开始,一直工作到页面底部。如前所述,overall_header.tpl总是包含你在浏览器中看到的每个页面的顶部部分,因此这是我们首先需要工作的部分。在subSilver中,这个文件已经显示了图像和菜单,这是一个很好的方法,我们将保持我们自己的模板中相同的做法。
打开overall_header.tpl文件,并向下滚动到<body>标签开始的地方(这个标签之前的部分是 CSS,我们稍后会讨论)。
我们需要做的第一件事是确保模板在浏览器中完全展开。默认情况下,浏览器会在页面的顶部和左侧添加边距,但我们可以通过将topmargin和leftmargin设置为零来消除这些边距。我们可以通过修改<body>标签来实现这一点:
<body bgcolor="{T_BODY_BGCOLOR}" text="{T_BODY_TEXT}"
link="{T_BODY_LINK}" vlink="{T_BODY_VLINK}"
leftmargin="0" topmargin="0">
在模板中值得注意的下一件事是<a name="top"></a>链接标签。如果我们添加以下链接:
<a href="top">Go to top!</a>
...点击链接后,浏览器会将您带到<a name="top"></a>,在这种情况下,到页面的顶部,它所在的位置。
然后我们有模板的表格结构。第一个表格从以下内容开始:
<table width="100%" cellspacing="0" cellpadding="10" border="0" align="center">
<tr>
<td class="bodyline">
...但它显然没有结束。这不是错误;这是因为这个表格包围了整个论坛,包括在overall_header.tpl之后将加载的内容。
您可以在模板的任何其他地方找到这个表格的结尾:
</td>
</tr>
</table>
...在overall_footer.tpl文件中。
接下来我们改变包围整个论坛的表格的宽度。在 subSilver 模板中,这个宽度设置为 100%,但我们只想让我们的模板宽度为 780 像素。我们还添加了高度 100%,以在浏览器中从上到下拉伸模板:
<table width="780" height="100%" cellspacing="0"
cellpadding="10" border="0" align="center">
<tr>
<td class="bodyline" valign="top">
由于cellpadding的大小,这个表格将使所有内容距离表格边框 10 像素。我们将宽度改为 780 像素而不是 100%,并添加高度 100%,以防我们稍后决定在论坛的每一边添加背景图片或颜色。由于默认情况下,内容在表格中间水平对齐——现在高度是 100%——我们需要将其对齐,使其出现在顶部。我们可以通过在表格的第一个<td>中添加一个valign标签来实现这一点。
在进行这些修改后,我们的表格代码应该看起来像这样:
<table width="780" height="100%" cellspacing="0"
cellpadding="10" border="0" align="center">
<tr>
<td class="bodyline" valign="top">
添加横幅图片
我们现在想要添加top_image.jpg——我们之前制作的横幅图片,我们首先将其上传到NoseBleed/images/模板文件夹。在没有开始更改和编辑已经存在的表格结构——这可能会变成一个编辑地狱的任务——我们简单地添加一个新的独立表格,直接在上一行下面,一个只包含我们的横幅图片的表格:
<table width="717" height="231" border="0" align="center"
cellpadding="0" cellspacing="0">
<tr>
<td>
<div align="center">
<a href="{U_INDEX}">
<img src="img/top_image.jpg" border="0"
alt="{L_INDEX}" vspace="1" />
</a>
</div>
</td>
</tr>
</table>

如您所见,我在图片周围添加了<a href="{U_INDEX}"></a>链接标签,这样它就可以作为链接回到论坛的索引页面。这与subSilver处理其自己的横幅图片的方式类似。基本上,我只是复制了那部分,使用了已经给出的相同的 phpBB 变量。
在整个模板中,我们可以使用许多这样的变量,所有这些变量的列表可以在www.phpbb.com/styles/listvars.php找到。
注意,并非所有变量都适用于所有.tpl文件。大多数是,但有些是为论坛的特定部分设计的,如注册页面、搜索页面等。
添加菜单
接下来我们要做的是在top_image下面添加菜单。我们再次添加一个新的表格,在我们的横幅图片下方,这次添加了一些临时文本,我们稍后会进行修正。现在添加文本是为了在我们开始添加真正的菜单项时使其更清晰。
<table width="715" height="20" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td align="left">
FAQ
Search
Memberlist
Usergroups
Profile
You have no new messages
</td>
<td align="right">
Log in
Register
</td>
</tr>
</table>

留意观察的眼睛可能会注意到,我制作的这个表格宽度只有 715 像素,而不是我们决定的 717 像素。原因只是这样看起来更好,没有其他原因。我最初尝试使用 717 像素,但看起来文本比图片宽。715 像素让它看起来更一致。
为了使菜单工作,我们需要将菜单的每一部分都转换成链接。例如,为了使FAQ成为链接,我们需要在它周围添加<a href="url">和</a>标签,其中url应该替换为我们想要链接到FAQ的文件地址。同样的事情也必须对菜单的其他部分做。
<table width="715" height="20" border="0" align="center"
cellpadding="0" cellspacing="0">
<tr>
<td align="left">
<a href="url">FAQ</a>
<a href="url">Search</a>
<a href="url">Memberlist</a>
<a href="url">Usergroups</a>
<a href="url">Profile</a>
<a href="url">You have no new messages</a>
</td>
<td align="right">
<a href="url">Log in</a>
<a href="url">Register</a>
</td>
</tr>
</table>
要将url替换为我们希望链接指向的实际地址,我们可以简单地查看subSilver模板已经使用的方式。通过查看代码,每个url都可以替换为正确的 phpBB 变量。我们还可以用变量替换菜单文本;这样,使用其他语言的用户就不必被迫使用英文菜单项。替换文本后,我们的表格现在如下所示:
<table width="715" height="20" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td align="left">
<a href="{U_FAQ}">{L_FAQ}</a>
<a href="{U_SEARCH}">{L_SEARCH}</a>
<a href="{U_MEMBERLIST}">{L_MEMBERLIST}</a>
<a href="{U_GROUP_CP}">{L_USERGROUPS}</a>
<a href="{U_PROFILE}">{L_PROFILE}</a>
<a href="{U_PRIVATEMSGS}">{PRIVATE_MESSAGE_INFO}</a>
</td>
<td align="right">
<a href="{U_LOGIN_LOGOUT}">{L_LOGIN_LOGOUT}</a>
<a href="{U_REGISTER}">{L_REGISTER}</a></td>
</tr>
</table>
这里需要注意的一点是,已经登录的用户不应该能够点击注册。为了防止这种情况,我们可以使用<!-- BEGIN switch_user_logged_out -->和<!-- END switch_user_logged_out -->标签。这些标签之间的所有内容只有在用户未登录时才会显示,这正是我们想要的注册菜单的效果。如果我们想只显示用户登录时的内容,我们可以使用<!-- BEGIN switch_user_logged_in -->和<!-- END switch_user_logged_in -->标签代替。
个人认为,未登录的用户不应该看到个人资料和私人消息菜单,所以我打算使用这些标签来防止访客尝试访问个人资料和私人消息菜单。
注意
关于这些标签的一个重要注意事项是,它们只有在代码中单独一行时才起作用;如果它们不在单独一行,phpBB 将无法识别它们。
表格现在应该看起来像这样:
<table width="715" height="20" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td align="left">
<a href="{U_FAQ}">{L_FAQ}</a>
<a href="{U_SEARCH}">{L_SEARCH}</a>
<a href="{U_MEMBERLIST}">{L_MEMBERLIST}</a>
<a href="{U_GROUP_CP}">{L_USERGROUPS}</a>
<!-- BEGIN switch_user_logged_in -->
<a href="{U_PROFILE}">{L_PROFILE}</a>
<a href="{U_PRIVATEMSGS}">{PRIVATE_MESSAGE_INFO}</a>
<!-- END switch_user_logged_in -->
</td>
<td align="right">
<a href="{U_LOGIN_LOGOUT}">{L_LOGIN_LOGOUT}</a>
<!-- BEGIN switch_user_logged_out -->
<a href="{U_REGISTER}">{L_REGISTER}</a>
<!-- END switch_user_logged_out -->
</td>
</tr>
</table>
保存文件并上传它们(除非你在本地测试它们),你会看到它看起来相当不错,也许除了临时文本的字体外:

为了更改模板的字体和颜色,我想向您介绍层叠样式表(CSS)。
CSS
如果你查看原始的 subSilver 菜单,你会注意到所有的链接都被<span class="mainmenu">和</span>标签包围。这是对 CSS 代码的引用,如果你查看overall_header.tpl代码中的 CSS 部分,你可以找到这个(在此重新格式化以供书籍使用):
/* The register, login, search etc links at the top of the page */
.mainmenu { font-size : {T_FONTSIZE2}px;
color : {T_BODY_TEXT}
}
a.mainmenu { text-decoration: none;
color : {T_BODY_LINK};
}
a.mainmenu:hover { text-decoration: underline;
color : {T_BODY_HLINK};
}
在这里,我们可以更改关于菜单显示方式的任何内容。被/*和*/标签包围的第一行只是一个帮助我们评论的注释,不会被浏览器使用。第二行确定文本(在这个例子中)应该如何显示,最后两行描述了如果文本是链接,应该如何显示。变量是在论坛的管理面板中设置的。我个人喜欢添加链接已被访问时的 CSS 代码,这样我可以确保我不会突然得到不同的颜色或字体大小。这个代码被称为a.mainmenu:visited,可以单独一行插入,或者作为已编写代码的一部分,用逗号分隔,如下所示:
/* The register, login, search etc links at the top of the page */
.mainmenu { font-size : {T_FONTSIZE2}px;
color : {T_BODY_TEXT}
}
a.mainmenu,a.mainmenu:visited { text-decoration: none;
color : {T_BODY_LINK};
}
a.mainmenu:hover { text-decoration: underline;
color : {T_BODY_HLINK};
}
如果我们想要定义当有人点击链接时链接应该看起来如何,我们也可以为a.mainmenu:active添加一个定义。
对于我们的菜单样式定义,表格看起来是这样的:
<table width="715" height="20" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td align="left">
<a href="{U_FAQ}" class="mainmenu">{L_FAQ}</a>
<a href="{U_SEARCH}" class="mainmenu">{L_SEARCH}</a>
<a href="{U_MEMBERLIST}" class="mainmenu">{L_MEMBERLIST}</a>
<a href="{U_GROUP_CP}" class="mainmenu">{L_USERGROUPS}</a>
<!-- BEGIN switch_user_logged_in -->
<a href="{U_PROFILE}" class="mainmenu">{L_PROFILE}</a>
<a href="{U_PRIVATEMSGS}" class="mainmenu">{PRIVATE_MESSAGE_INFO}</a>
<!-- END switch_user_logged_in -->
</td>
<td align="right">
<a href="{U_LOGIN_LOGOUT}" class="mainmenu">{L_LOGIN_LOGOUT}</a>
<!-- BEGIN switch_user_logged_out -->
<a href="{U_REGISTER}" class="mainmenu">{L_REGISTER}</a>
<!-- END switch_user_logged_out -->
</td>
</tr>
</table>
我们现在几乎完成了菜单。唯一看起来不太好的是菜单项之间太靠近。在 HTML 中,多个空格只会显示为一个空格,但解决这个问题的一种方法是用 代码代替,实际上它就是一个空格。它的优点是可以添加任意数量的连续空格。
我们在每个菜单项之间添加两个空格,以及mainmenu类,以便使空格的大小与菜单中使用的字体大小相同。
完成的表格看起来是这样的:
<table width="715" height="20" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td align="left" class="mainmenu">
<a href="{U_FAQ}" class="mainmenu">{L_FAQ}</a>
<a href="{U_SEARCH}" class="mainmenu">{L_SEARCH}</a>
<a href="{U_MEMBERLIST}" class="mainmenu">{L_MEMBERLIST}</a>
<a href="{U_GROUP_CP}" class="mainmenu">{L_USERGROUPS}</a>
<!-- BEGIN switch_user_logged_in -->
<a href="{U_PROFILE}" class="mainmenu">{L_PROFILE}</a>
<a href="{U_PRIVATEMSGS}" class="mainmenu">{PRIVATE_MESSAGE_INFO}</a>
<!-- END switch_user_logged_in -->
</td>
<td align="right" class="mainmenu">
<a href="{U_LOGIN_LOGOUT}" class="mainmenu">{L_LOGIN_LOGOUT}</a>
<!-- BEGIN switch_user_logged_out -->
<a href="{U_REGISTER}" class="mainmenu">{L_REGISTER}</a>
<!-- END switch_user_logged_out -->
</td>
</tr>
</table>
我们现在完成了overall_header.tpl中的表格,可以删除剩余的原始 subSilver 表格代码。
现在是时候进入管理面板了;我们需要修复菜单上的文本颜色,这里事情可能会开始变得有些复杂。
让我先说,我们不需要使用论坛的管理面板设置来更改布局;我们同样可以直接编辑 CSS 代码,而不使用变量。例如,如果我们想要菜单中的文本稍微小一点,黑色,并且当鼠标悬停在其上时,仍然是黑色但带有下划线。实现这一点最简单的方法就是将 CSS 更改为:
/* The register, login, search etc links at the top of the page */
.mainmenu { font-size : 11px;
color : black
}
a.mainmenu { font-size : 11px;
text-decoration: none;
color : black;
}
a.mainmenu:visited { font-size : 11px;
text-decoration: none;
color : black;
}
a.mainmenu:hover { font-size : 11px;
text-decoration: underline;
color : black;
}
然而,这样我们每次想要更改内容时,都必须编辑overall_header.tpl。这可能对你个人来说是个不错的解决方案,但如果你打算公开发布模板,可能就不是那么好的主意了。并不是每个人都觉得编辑 CSS 代码很舒服,而且,如果我们有从管理面板更改这些选项的选项,我们最好还是这样做。
在管理面板中,通过选择样式管理下的模板并编辑它,你会找到 CSS 中使用的变量。例如,{T_FONTSIZE2}指的是字体大小 2:,设置为11。如果你想让.mainmenu有更小的字体,在这里将其更改为10。然而,这意味着 CSS 中所有其他地方出现的{T_FONTSIZE2}都会是字体大小10——这并不是我们想要的。
相反,使用 CSS 中的 {T_FONTSIZE1} 更容易,它指的是在管理面板中的 字体大小 1:已经是字体大小 10。
在管理面板中的 文本颜色: 被设置为 000000,这在像这样的白色背景上可能有点太暗了。因此,我们将它改为 111111 的值,以稍微柔和一下。
链接颜色: 被设置为 006699,我们将它更改为红色,值为 9F0002,与 top_image.jpg 中的画笔颜色相同。我们还将使用这个值来设置 '已访问'、'激活' 和 '悬停' 链接。
目前我们只需要这些,我们可以保存这些设置并返回论坛。
菜单现在使用红色文本,因为它正在使用管理面板的链接变量。如果我们想让它们始终是黑色,我们需要在 CSS 代码中更改以下内容:
/* The register, login, search etc links at the top of the page */
.mainmenu {
font-size : {T_FONTSIZE2}px;
color : {T_BODY_TEXT}
}
a.mainmenu {
text-decoration: none;
color : {T_BODY_LINK};
}
a.mainmenu:hover {
text-decoration: underline;
color : {T_BODY_HLINK};
}
... 到:
/* The register, login, search etc links at the top of the page */
.mainmenu {
font-size : {T_FONTSIZE1}px;
color : {T_BODY_TEXT}
}
a.mainmenu {
font-size : {T_FONTSIZE1}px;
text-decoration: none;
color : {T_BODY_TEXT};
}
a.mainmenu:visited {
font-size : {T_FONTSIZE1}px;
text-decoration: none;
color : {T_BODY_TEXT};
}
a.mainmenu:hover {
font-size : {T_FONTSIZE1}px;
text-decoration: underline;
color : {T_BODY_TEXT};
}
菜单现在是所需的黑色文本。注意,我们在所有的链接定义中添加了 font-size : {T_FONTSIZE1}px; 代码。这通常不是我们必须做的,因为已经在 .mainmenu 中定义了,但我经历过,有时如果用户安装了一个只定义 .mainmenu 中字体大小的 CSS 的新模板,该模板将使用之前安装的模板的字体大小。这听起来很奇怪,但我确实见过,而且并不好看。可能还有其他解决方法,但这种方法对我有效。
论坛的灰色背景颜色和周围的边框似乎与其他部分不匹配。将管理面板中的 背景颜色: 从 E5E5E5 更改为 FFFFFF 解决了第一个问题,但还有一些边框需要去除。如果你遇到这样的问题,最好的办法是回到 .tpl 文件的代码中,找出导致问题的原因。在这种情况下,边框来自第一个表格中的 CSS,称为 bodyline:
<table width="780" height="100%" cellspacing="0" cellpadding="10" border="0" align="center">
<tr>
<td class="bodyline" valign="top">
在 CSS 代码中,我们有:
/* This is the border line & background color round the entire page */
.bodyline {
background-color: {T_TD_COLOR2};
border: 1px {T_TH_COLOR1} solid;
}
虽然这是一个简单的修复,但只需将边框更改为 0px 就可以解决这个问题。

我们现在可以编辑 index_body.tpl 文件了,它显示论坛的索引页面。
在 index_body.tpl 中修改论坛索引
index_body.tpl 文件中的第一个表格看起来是这样的:
<table width="100%" cellspacing="0" cellpadding="2" border="0" align="center">
<tr>
<td align="left" valign="bottom"><span class="gensmall">
<!-- BEGIN switch_user_logged_in -->
{LAST_VISIT_DATE}<br />
<!-- END switch_user_logged_in -->
{CURRENT_TIME}<br /></span><span class="nav">
<a href="{U_INDEX}" class="nav">{L_INDEX}</a></span>
</td>
<td align="right" valign="bottom" class="gensmall">
<!-- BEGIN switch_user_logged_in -->
<a href="{U_SEARCH_NEW}" class="gensmall">{L_SEARCH_NEW}</a>
<br />
<a href="{U_SEARCH_SELF}" class="gensmall">{L_SEARCH_SELF}</a>
<br />
<!-- END switch_user_logged_in -->
<a href="{U_SEARCH_UNANSWERED}" class="gensmall">{L_SEARCH_UNANSWERED}</a>
</td>
</tr>
</table>
它显示了一系列变量:登录用户上次访问的时间、当前时间、用户尚未阅读的帖子链接以及未回答的帖子。我们不希望在索引页面上显示这些变量,所以我们简单地复制整个表格,删除它,并将其粘贴到 .tpl 的底部。这样我们就可以稍后处理它了。
根据布局想法,页面的顶部应该有两条黑色线条,菜单下方有一些文本。这是一个应该在模板中继续的细节,也是我们必须构建到所有 .tpl 文件中的内容。
index_body.tpl 中的下一个表格看起来是这样的:
<table width="100%" cellpadding="2" cellspacing="1" border="0" class="forumline">
<tr>
<th colspan="2" class="thCornerL" height="25" nowrap="nowrap">
{L_FORUM}
</th>
<th width="50" class="thTop" nowrap="nowrap">
{L_TOPICS}
</th>
<th width="50" class="thTop" nowrap="nowrap">
{L_POSTS}
</th>
<th class="thCornerR" nowrap="nowrap">
{L_LASTPOST}
</th>
</tr>
<!-- BEGIN catrow -->
<tr>
<td class="catLeft" colspan="2" height="28">
<span class="cattitle">
<a href="{catrow.U_VIEWCAT}" class="cattitle">{catrow.CAT_DESC}</a>
</span>
</td>
<td class="rowpic" colspan="3" align="right">
</td>
</tr>
<!-- BEGIN forumrow -->
<tr>
<td class="row1" align="center" valign="middle" height="50">
<img src="img/{catrow.forumrow.FORUM_FOLDER_IMG}" width="46" height="25" alt="{catrow.forumrow.L_FORUM_FOLDER_ALT}" title="{catrow.forumrow.L_FORUM_FOLDER_ALT}" />
</td>
<td class="row1" width="100%" height="50">
<span class="forumlink">
<a href="{catrow.forumrow.U_VIEWFORUM}" class="forumlink">{catrow.forumrow.FORUM_NAME}</a>
<br />
</span>
<span class="genmed">
{catrow.forumrow.FORUM_DESC}
<br />
</span>
<span class="gensmall">
{catrow.forumrow.L_MODERATOR} {catrow.forumrow.MODERATORS}
</span>
</td>
<td class="row2" align="center" valign="middle" height="50">
<span class="gensmall">
{catrow.forumrow.TOPICS}
</span>
</td>
<td class="row2" align="center" valign="middle" height="50">
<span class="gensmall">
{catrow.forumrow.POSTS}
</span>
</td>
<td class="row2" align="center" valign="middle" height="50" nowrap="nowrap">
<span class="gensmall">
{catrow.forumrow.LAST_POST}
</span>
</td>
</tr>
<!-- END forumrow -->
<!-- END catrow -->
</table>
这是论坛本身,包括所有主题和分类,这是我们想要出现在顶部的。在第一行,我们可以看到表格有一个class="forumline"属性。这就是创建表格边框的原因,也是我们想要修改的。回到overall_header.tpl的 CSS 代码,我们可以找到:
/* This is the outline round the main forum tables */
.forumline {
background-color: {T_TD_COLOR2};
border: 2px {T_TH_COLOR2} solid;
}
{T_TD_COLOR2}变量指的是表格单元格颜色 2:在管理面板中,目前设置为FFFFFF,一种明亮的白色。{T_TH_COLOR2}是表格标题颜色 2:设置为006699,一种蓝色。我们可以随意更改此代码以适应表格周围的框架,但为了使模板尽可能简单,并使其与布局理念相匹配,我们目前不想有任何边框。最简单的方法就是直接从表格中移除class="forumline"属性,但如果以后我们决定无论如何都需要边框,那就意味着我们必须进入所有的.tpl文件并手动再次添加属性——太麻烦了!相反,我们更改 CSS 如下:
/* This is the outline round the main forum tables */
.forumline {
/*
background-color: {T_TD_COLOR2};
border: 2px {T_TH_COLOR2} solid;
*/
}
现在表格的宽度设置为 100%,我们将它改为 717 以匹配图片。我们还添加了一个align="center"属性,使它在页面上居中。
表格的前一部分现在看起来像:
<table width="717" align="center" cellpadding="2" cellspacing="1" border="0" class="forumline">
<tr>
<th colspan="2" class="thCornerL" height="25" nowrap="nowrap">
{L_FORUM}
</th>
<th width="50" class="thTop" nowrap="nowrap">
{L_TOPICS}
</th>
<th width="50" class="thTop" nowrap="nowrap">
{L_POSTS}
</th>
<th class="thCornerR" nowrap="nowrap">
{L_LASTPOST}
</th>
</tr>
在代码中,我们可以找到名为thCornerL, thTop和thCornerR的类。这些是显示表格第一行蓝色背景和橙色文字的类。在我们的 CSS 代码中,我们在这里找到它们:
/* Header cells - the blue and silver gradient backgrounds */
th {
color: {T_FONTCOLOR3};
font-size: {T_FONTSIZE2}px;
font-weight : bold;
background-color: {T_BODY_LINK};
height: 25px;
background-image: url(templates/subSilver/images/{T_TH_CLASS2});
}
...这里:
th.thHead,th.thSides,th.thTop,th.thLeft,th.thRight,th.thBottom,th.thCornerL,th.thCornerR {
font-weight: bold;
border: {T_TD_COLOR2};
border-style: solid;
height: 28px;
}
...还有这里:
th.thHead,td.catHead {
font-size: {T_FONTSIZE3}px;
border-width: 1px 1px 0px 1px;
}
th.thSides,td.catSides,td.spaceRow {
border-width: 0px 1px 0px 1px;
}
th.thRight,td.catRight,td.row3Right {
border-width: 0px 1px 0px 0px;
}
th.thLeft,td.catLeft { border-width: 0px 0px 0px 1px; }
th.thBottom,td.catBottom { border-width: 0px 1px 1px 1px; }
th.thTop { border-width: 1px 0px 0px 0px; }
th.thCornerL { border-width: 1px 0px 0px 1px; }
th.thCornerR { border-width: 1px 1px 0px 0px; }
这听起来确实挺复杂!但别灰心;实际上比看起来要简单。如果我们从表格的左上角部分开始,即thCornerL类,我们可以沿着 CSS 代码向下追踪:首先,它是th类的一部分,因为我们可以在表格中找到<th colspan="2" class="thCornerL" height="25" nowrap="nowrap">。在th的 CSS 代码中,我们可以找到字体颜色、字体大小、字体粗细、背景颜色、th的高度以及背景图片。
更往下,我们找到了更多关于th.thCornerL的定义,包括边框颜色、边框样式和 28 像素的高度。我们还得到了边框如何显示的确切定义,即th.thCornerL{border-width: 1px 0px 0px 1px; },这是每一边的边框大小,从顶部开始按顺时针方向。
要进行更改,最简单的方法是从底部开始。我们知道我们想要在这个部分上下有黑色线条,因此我们可以先从更改 CSS 开始:
th.thCornerL { border-width: 1px 0px 1px 0px; }
在 CSS 中向上查找,我们发现 border: {T_TD_COLOR2};,在管理员面板中这指的是表格单元格颜色 2,目前设置为FFFFFF。将此颜色更改为黑色将更改 CSS 中所有使用 {T_TD_COLOR2} 的实例。而且,由于我们想要白色表格单元格颜色,我们需要做些不同的事情。将 border: {T_TD_COLOR2}; 更改为 border: {T_BODY_TEXT}; 将给我们之前设置为黑色的文字颜色。这是一个解决方案。但这个方案不好的一点是,如果我们稍后想更改字体颜色,但不更改黑色线条,我们必须回来再次编辑 CSS。相反,我们可以在管理员面板中的 Table Cell Color 3 字段(尚未使用)中添加 111111,并将 CSS 更改为 border: {T_TD_COLOR3};。
沿着 CSS 向上查找,我们发现 th 部分有一个背景图像。如果我们想在表格的这一部分后面添加一个背景图像,我们应该保留这段代码。然而,对于这个模板,我们决定使用白色背景和黑色文字,所以我们再次添加 /* 和 */ 标记在背景图像和背景颜色周围。在更改字体颜色和字体大小后,CSS 现在看起来像这样:
/* Header cells - the blue and silver gradient backgrounds */
th {
color: {T_BODY_TEXT};
font-size: {T_FONTSIZE1}px;
font-weight : bold;
/*
background-color: {T_BODY_LINK};
*/
height: 25px;
/*
background-image: url(templates/subSilver/images/{T_TH_CLASS2});
*/
}
...以及:
th.thHead,th.thSides,th.thTop,th.thLeft,th.thRight,th.thBottom,th.thCornerL,th.thCornerR {
font-weight: bold;
border: {T_TD_COLOR3};
border-style: solid;
height: 28px;
}
...以及:
th.thHead,td.catHead {
font-size: {T_FONTSIZE3}px;
border-width: 1px 1px 0px 1px;
}
th.thSides,td.catSides,td.spaceRow { border-width: 0px 1px 0px 1px; }
th.thRight,td.catRight,td.row3Right { border-width: 0px 1px 0px 0px; }
th.thLeft,td.catLeft { border-width: 0px 0px 0px 1px; }
th.thBottom,td.catBottom { border-width: 0px 1px 1px 1px; }
th.thTop { border-width: 1px 0px 0px 0px; }
th.thCornerL { border-width: 1px 0px 1px 0px; }
th.thCornerR { border-width: 1px 1px 0px 0px; }
将 thTop 和 thCornerR 更改为与 thCornerL 类似的黑色线条是目前需要完成的最后一步,并且这可以在以下位置完成:
th.thTop { border-width: 1px 0px 1px 0px; }
th.thCornerL { border-width: 1px 0px 1px 0px; }
th.thCornerR { border-width: 1px 0px 1px 0px; }

表格的其余部分看起来像这样:
<!-- BEGIN catrow -->
<tr>
<td class="catLeft" colspan="2" height="28">
<span class="cattitle">
<a href="{catrow.U_VIEWCAT}" class="cattitle">{catrow.CAT_DESC}</a>
</span>
</td>
<td class="rowpic" colspan="3" align="right">
</td>
</tr>
<!-- BEGIN forumrow -->
<tr>
<td class="row1" align="center" valign="middle" height="50">
<img src="img/{catrow.forumrow.FORUM_FOLDER_IMG}" width="46" height="25" alt="{catrow.forumrow.L_FORUM_FOLDER_ALT}" title="{catrow.forumrow.L_FORUM_FOLDER_ALT}" />
<img src="img/{catrow.forumrow.FORUM_FOLDER_IMG}" width="46" height="25" alt="{catrow.forumrow.L_FORUM_FOLDER_ALT}" title="{catrow.forumrow.L_FORUM_FOLDER_ALT}" />
</td>
<td class="row1" width="100%" height="50">
<span class="forumlink">
<a href="{catrow.forumrow.U_VIEWFORUM}" class="forumlink">{catrow.forumrow.FORUM_NAME}</a>
<br />
</span>
<span class="genmed">
{catrow.forumrow.FORUM_DESC}
<br />
</span>
<span class="gensmall">
{catrow.forumrow.L_MODERATOR} {catrow.forumrow.MODERATORS}
</span>
</td>
<td class="row2" align="center" valign="middle" height="50">
<span class="gensmall">
{catrow.forumrow.TOPICS}
</span>
</td>
<td class="row2" align="center" valign="middle" height="50">
<span class="gensmall">
{catrow.forumrow.POSTS}
</span>
</td>
<td class="row2" align="center" valign="middle" height="50" nowrap="nowrap">
<span class="gensmall">
{catrow.forumrow.LAST_POST}
</span>
</td>
</tr>
<!-- END forumrow -->
<!-- END catrow -->
</table>
catrow 和 forumrow 决定了数据库中找到的分类和论坛主题;它们使用上面的 HTML 代码来显示分类和主题,直到没有更多可找到,就像一个循环。如果我们从第一行表开始,我们会找到分类名称显示的地方:
<tr>
<td class="catLeft" colspan="2" height="28">
<span class="cattitle">
<a href="{catrow.U_VIEWCAT}" class="cattitle">{catrow.CAT_DESC}</a>
</span>
</td>
<td class="rowpic" colspan="3" align="right">
</td>
</tr>
再次,我们在 CSS 代码中查找使用的类,从 catLeft 开始:
td.cat,td.catHead,td.catSides,td.catLeft,td.catRight,td.catBottom
{
background-image: url(templates/subSilver/images/{T_TH_CLASS1});
background-color:{T_TR_COLOR3};
border: {T_TH_COLOR3};
border-style: solid;
height: 28px;
}
注意,catLeft 并不是这一行中唯一的类。如果我们想让所有其他类都像这样显示,除了 catLeft 类,最简单的方法就是从列表中移除这个类,并将其变成它自己的类。但由于所有这些类都或多或少只关于显示背景颜色和图像,所以我们保留类在原处,并一次性更改它们。
对于这个模板,我们不会从这些课程中用到很多内容,所以我们将其改为:
td.cat,td.catHead,td.catSides,td.catLeft,td.catRight,td.catBottom
{
/*
background-image: url(templates/subSilver/images/{T_TH_CLASS1});
background-color:{T_TR_COLOR3};
border: {T_TH_COLOR3};
border-style: solid;
*/
height: 28px;
}
我们现在保留高度。
我们接下来要查找的类叫做 rowpic。它实际上为我们论坛做的只是显示一个除了 catLeft 之外的背景图像,所以方法是一样的。如果你想在你分类文字后面有一个不同于 catLeft 的图像背景,你可以使用这个。但由于我们不需要任何图像,我们可以从表格中移除这个类。
在完成这些操作后,我们的表格应该看起来像这样:
<tr>
<td class="catLeft" colspan="5" height="28">
<span class="cattitle">
<a href="{catrow.U_VIEWCAT}" class="cattitle">{catrow.CAT_DESC}</a>
</span>
</td>
</tr>
分类描述由 cattitle 类决定,我们可以在 CSS 这里找到它:
/* Forum category titles */
.cattitle {
font-weight: bold;
font-size: {T_FONTSIZE3}px;
letter-spacing: 1px;
color : {T_BODY_LINK}
}
a.cattitle {
text-decoration: none;
color : {T_BODY_LINK};
}
a.cattitle:hover {
text-decoration: underline;
}
这里没有太多需要更改的地方,除了字体稍微有点大;所以单词中每个字母之间的一像素间距必须去掉。我们还可以添加一个 a.cattitle: visited 类。
现在这个类看起来是这样的:
/* Forum category titles */
.cattitle {
font-weight: bold;
font-size: {T_FONTSIZE2}px;
color : {T_BODY_LINK}
}
a.cattitle {
text-decoration: none;
color : {T_BODY_LINK};
}
a.cattitle:visited {
text-decoration: none;
color : {T_BODY_LINK};
}
a.cattitle:hover {
text-decoration: underline;
}

在我们的 .tpl 文件中向下移动,我们找到了论坛行。
<!-- BEGIN forumrow -->
<tr>
<td class="row1" align="center" valign="middle" height="50">
<img src="img/{catrow.forumrow.FORUM_FOLDER_IMG}" width="46" height="25" alt="{catrow.forumrow.L_FORUM_FOLDER_ALT}" title="{catrow.forumrow.L_FORUM_FOLDER_ALT}" />
</td>
<td class="row1" width="100%" height="50">
<span class="forumlink">
<a href="{catrow.forumrow.U_VIEWFORUM}" class="forumlink">{catrow.forumrow.FORUM_NAME}</a>
<br />
</span>
<span class="genmed">
{catrow.forumrow.FORUM_DESC}
<br />
</span>
<span class="gensmall">
{catrow.forumrow.L_MODERATOR} {catrow.forumrow.MODERATORS}
</span>
</td>
<td class="row2" align="center" valign="middle" height="50">
<span class="gensmall">
{catrow.forumrow.TOPICS}
</span>
</td>
<td class="row2" align="center" valign="middle" height="50">
<span class="gensmall">
{catrow.forumrow.POSTS}
</span>
</td>
<td class="row2" align="center" valign="middle" height="50" nowrap="nowrap">
<span class="gensmall">
{catrow.forumrow.LAST_POST}
</span>
</td>
</tr>
<!-- END forumrow -->
CSS 中的 row1, row2 和 row3 类决定了我们模板的背景颜色。它们由 {T_TR_COLOR1}, {T_TR_COLOR2} 和 {T_TR_COLOR3} 定义,这些值再次在管理面板中由 Table Row Color 1, Table Row Color 2 和 Table Row Color 3 定义。根据布局想法,我们已经决定使用浅灰色,以匹配模板的 top_image。我们不需要在 CSS 代码中做任何更改,但从管理面板中,我们添加了新的值 F3F3F3, EBEBEB 和 E3E3E3,第一个颜色与 top_image.jpg 中的颜色相同,其他颜色略深。
在我们的表格中接下来是文件夹图像,由 {catrow.forumrow.FORUM_FOLDER_IMG} 变量定义。我们这里不想做任何更改。在后面的章节中,我们将看到如何创建新的图标和图像。forumlink 类决定了描述论坛的文本的字体应该是什么样子。在 CSS 中,我们找到了以下内容:
/* Forum title: Text and link to the forums used in: index.php */
.forumlink {
font-weight: bold;
font-size: {T_FONTSIZE3}px;
color : {T_BODY_LINK};
}
a.forumlink {
text-decoration: none;
color : {T_BODY_LINK};
}
a.forumlink:hover {
text-decoration: underline;
color : {T_BODY_HLINK};
}
这里没有太多需要更改的地方,除了可能将字体大小从 {T_FONTSIZE3} 更改为 {T_FONTSIZE2},以及将悬停颜色从 {T_BODY_HLINK} 更改为 {T_BODY_LINK}。{T_BODY_HLINK} 是来自管理面板的链接悬停设置,但这里不需要不同的颜色。更改后的类现在看起来是这样的:
/* Forum title: Text and link to the forums used in: index.php */
.forumlink {
font-weight: bold;
font-size: {T_FONTSIZE2}px;
color : {T_BODY_LINK};
}
a.forumlink {
text-decoration: none;
color : {T_BODY_LINK};
}
a.forumlink:visited {
text-decoration: none;
color : {T_BODY_LINK};
}
a.forumlink:hover {
text-decoration: underline;
color : {T_BODY_LINK};
}
如您现在可能已经注意到的,更改 CSS 并不是特别困难,我将尽力在本章的其余部分避免详细描述。
下一步要更改的是将 CSS 中的 genmed 类的大小更改为 {T_FONTSIZE1},使其稍微小一些。
我们现在几乎完成了这个表格,但表格行中的文本离边缘真的很近。我对这一点不太满意,解决这个问题的方法之一是将表格的 cellpadding 值从 2 更改为 4。另一种方法是在 CSS 类中添加一个填充定义,甚至可以创建一个新的类并将其添加到表格中。我们在这里选择了第一种解决方案。
最后,为了使论坛更加生动,我们在表格行上添加了一个悬停效果,这意味着当鼠标悬停时,它会改变颜色,同时整个表格行将作为一个链接工作。
我们现在的表格应该看起来是这样的:
<table width="717" align="center" cellpadding="4" cellspacing="1" border="0" class="forumline">
<tr>
<th colspan="2" class="thCornerL" height="25" nowrap="nowrap">
{L_FORUM}
</th>
<th width="50" class="thTop" nowrap="nowrap">
{L_TOPICS}
</th>
<th width="50" class="thTop" nowrap="nowrap">
{L_POSTS}
</th>
<th class="thCornerR" nowrap="nowrap">
{L_LASTPOST}
</th>
</tr>
<!-- BEGIN catrow -->
<tr>
<td class="catLeft" colspan="5" height="28">
<span class="cattitle">
<a href="{catrow.U_VIEWCAT}" class="cattitle">{catrow.CAT_DESC}</a>
</span>
</td>
</tr>
<!-- BEGIN forumrow -->
<tr>
<td class="row1" align="center" valign="middle" height="50">
<img src="img/{catrow.forumrow.FORUM_FOLDER_IMG}" width="46" height="25" alt="{catrow.forumrow.L_FORUM_FOLDER_ALT}" title="{catrow.forumrow.L_FORUM_FOLDER_ALT}" />
</td>
<td class="row1" width="100%" height="50"
onmouseover="this.style.backgroundcolor=’{T_TR_COLOR2}’;
this.style.cursor=’pointer’;"
onmouseout=this.style.backgroundcolor=""
onclick="window.location.href=’{catrow.forumrow.U_VIEWFORUM}’">
<span class="forumlink">
<a href="{catrow.forumrow.U_VIEWFORUM}" class="forumlink">{catrow.forumrow.FORUM_NAME}</a>
<br />
</span>
<span class="genmed">
{catrow.forumrow.FORUM_DESC}
<br />
</span>
<span class="gensmall">
{catrow.forumrow.L_MODERATOR} {catrow.forumrow.MODERATORS}
</span>
</td>
<td class="row2" align="center" valign="middle" height="50">
<span class="gensmall">
{catrow.forumrow.TOPICS}
</span>
</td>
<td class="row2" align="center" valign="middle" height="50">
<span class="gensmall">
{catrow.forumrow.POSTS}
</span>
</td>
<td class="row2" align="center" valign="middle" height="50" nowrap="nowrap">
<span class="gensmall">
{catrow.forumrow.LAST_POST}
</span>
</td>
</tr>
<!-- END forumrow -->
<!-- END catrow -->
</table>
我们 index_body.tpl 文件中的下一个表格显示了“标记所有论坛”的链接以及论坛的时间和时区:
<table width="100%" cellspacing="0" border="0" align="center" cellpadding="2">
<tr>
<td align="left">
<span class="gensmall">
<a href="{U_MARK_READ}" class="gensmall">{L_MARK_FORUMS_READ}</a>
</span>
</td>
<td align="right">
<span class="gensmall">
{S_TIMEZONE}
</span>
</td>
</tr>
</table>
看起来相当不错;唯一需要更改的是宽度从 100% 更改为 717 像素;此外,我们希望将 CSS 中的 gensmall 类更改为黑色链接,而不是红色,这与我们对 mainmenu 类所做的类似。

这就处理了论坛的主要部分。
index_body.tpl 文件的下一部分是显示谁在线以及其他与论坛用户相关的信息的表格。这个表格只在这个 .tpl 文件中,在我看来,它并不是论坛本身的一部分,而更像是一些额外添加的内容。因此,我们将这部分插入到页面底部,并且在这里添加我们从文件顶部移除的所有额外链接。我们可以将它们全部放在一个表格中,给它添加 thTop 类,这样它上面和下面就会有黑色线条,就像我们处理菜单时那样。
为了在表格周围添加一点空间,我们在表格的开始和结束处插入一个高度为十像素的额外表格行。
新的表格看起来如下:
<table align="center" width="717" border="0" cellspacing="0" cellpadding="0">
<tr height="10"><td>&nsbp;</td></tr>
<tr>
<th colspan="2" class="thTop" height="25" nowrap="nowrap">
<table width="717" cellspacing="0" cellpadding="2"
border="0" align="center">
<tr>
<td align="left" valign="bottom">
<span class="gensmall">
<!-- BEGIN switch_user_logged_in -->
{LAST_VISIT_DATE}
<br />
<!-- END switch_user_logged_in -->
{CURRENT_TIME}
<br />
</span>
<span class="nav">
<a href="{U_INDEX}" class="nav">{L_INDEX}</a>
</span>
</td>
<td align="right" valign="bottom" class="gensmall">
<!-- BEGIN switch_user_logged_in -->
<a href="{U_SEARCH_NEW}" class="gensmall">{L_SEARCH_NEW}</a>
<br />
<a href="{U_SEARCH_SELF}" class="gensmall">{L_SEARCH_SELF}</a>
<br />
<!-- END switch_user_logged_in -->
<a href="{U_SEARCH_UNANSWERED}" class="gensmall">{L_SEARCH_UNANSWERED}</a>
</td>
</tr>
</table></th>
</tr>
<tr height="10"><td>&nsbp;</td></tr>
</table>
现在我们可以删除 .tpl 文件底部的表格(我们最初从顶部移动的那个)。

现在我们可以处理下一个表格了,它显示论坛用户的信息。这里只有几个改动:宽度应该是 717 像素而不是 100%,并且我们需要添加一个 align="center" 标签。
在这个表格下面还有另一个表格,其中有一个变量显示过去五分钟内的活跃用户数量。改变宽度并像上面的表格那样对齐,也能纠正这个表格。
接下来是登录表格,它被 <!-- BEGIN switch_user_logged_out --> 和 <!-- BEGIN switch_user_logged_out --> 标签包围,以确保只有未登录的用户才能看到这个表格。如果你想将登录信息显示在网站顶部,只需将其复制粘贴到你想放置的位置即可。对于这个模板来说,它现在所在的位置是合适的,而且再次强调,必要的更改只有宽度和对齐方式。
这里有一点需要注意:<form...> 元素。在某些浏览器中,添加一个表单后,该元素也会在上部和下部添加一个边距,几乎让人感觉你已经在 HTML 代码的上部和下部添加了一个换行符。为了防止这种情况,请在 CSS 中添加这个类:
/* Form */
form {
margin: 0px;
padding: 0px;
}
现在我们可以手动添加换行符,在表单的上方和下方,并确保它在不同的浏览器中均匀显示。
index_body.tpl 文件的最后一部分显示了论坛的图标。我们将在本章的后面部分回到这个问题,现在保持它不变。下面的截图显示了到目前为止所做的更改后我们的论坛看起来是什么样子:

修改 viewforum_body.tpl 中的论坛主体
我们接下来要编辑的文件是 viewforum_body.tpl 模板。这是显示索引之后的论坛内容的文件。以下是编辑 .tpl 文件之前我们的论坛看起来是什么样子:

viewforum.tpl 中的第一行代码是一个表单对象,我们保持其不变。同样地,与 index_body.tpl 一样,我们将第一个表格移动到文件末尾,这样我们就可以在菜单下方出现黑色线条。在代码的开始部分,我们现在有以下表格:
<table border="0" cellpadding="4" cellspacing="1" width="100%" class="forumline">
<tr>
<th colspan="2" align="center" height="25" class="thCornerL" nowrap="nowrap">
{L_TOPICS}
</th>
<th width="50" align="center" class="thTop" nowrap="nowrap">
{L_REPLIES}
</th>
<th width="100" align="center" class="thTop" nowrap="nowrap">
{L_AUTHOR}
</th>
<th width="50" align="center" class="thTop" nowrap="nowrap">
{L_VIEWS}
</th>
<th align="center" class="thCornerR" nowrap="nowrap">
{L_LASTPOST}
</th>
</tr>
<!-- BEGIN topicrow -->
<tr>
<td class="row1" align="center" valign="middle" width="20">
<img src="img/{topicrow.TOPIC_FOLDER_IMG}" width="19" height="18" alt="{topicrow.L_TOPIC_FOLDER_ALT}" title="{topicrow.L_TOPIC_FOLDER_ALT}" />
</td>
<td class="row1" width="100%">
<span class="topictitle">
{topicrow.NEWEST_POST_IMG}{topicrow.TOPIC_TYPE}
<a href="{topicrow.U_VIEW_TOPIC}" class="topictitle">{topicrow.TOPIC_TITLE}</a>
</span>
<span class="gensmall">
<br />
{topicrow.GOTO_PAGE}
</span>
</td>
<td class="row2" align="center" valign="middle">
<span class="postdetails">
{topicrow.REPLIES}
</span>
</td>
<td class="row3" align="center" valign="middle">
<span class="name">
{topicrow.TOPIC_AUTHOR}
</span>
</td>
<td class="row2" align="center" valign="middle">
<span class="postdetails">
{topicrow.VIEWS}
</span>
</td>
<td class="row3Right" align="center" valign="middle" nowrap="nowrap">
<span class="postdetails">
{topicrow.LAST_POST_TIME}
<br />
{topicrow.LAST_POST_AUTHOR} {topicrow.LAST_POST_IMG}
</span>
</td>
</tr>
<!-- END topicrow -->
<!-- BEGIN switch_no_topics -->
<tr>
<td class="row1" colspan="6" height="30" align="center" valign="middle">
<span class="gen">
{L_NO_TOPICS}
</span>
</td>
</tr>
<!-- END switch_no_topics -->
<tr>
<td class="catBottom" align="center" valign="middle" colspan="6" height="28">
<span class="genmed">
{L_DISPLAY_TOPICS}: {S_SELECT_TOPIC_DAYS} <input type="submit" class="liteoption" value="{L_GO}" name="submit" />
</span>
</td>
</tr>
</table>
同样,我们将宽度从 100% 更改为 717 像素,并使其居中对齐。
在黑色线条下方,论坛开始于灰色行。但为了使其与索引页面更好地匹配,我们添加了一个额外的表格行,包含两个链接:一个用于返回索引页面,另一个用于显示所选论坛的名称。我们不是将第一个链接显示为索引页面的完整名称,而是用 < 符号来保持其简短,我们在代码中使用 < 来添加它。表格的上部分现在应该看起来如下:
<table border="0" cellpadding="4" cellspacing="1" width="717" class="forumline" align="center">
<tr>
<th colspan="2" align="center" height="25" class="thCornerL" nowrap="nowrap">
{L_TOPICS}
</th>
<th width="50" align="center" class="thTop" nowrap="nowrap">
{L_REPLIES}
</th>
<th width="100" align="center" class="thTop" nowrap="nowrap">
{L_AUTHOR}
</th>
<th width="50" align="center" class="thTop" nowrap="nowrap">
{L_VIEWS}
</th>
<th align="center" class="thCornerR" nowrap="nowrap">
{L_LASTPOST}
</th>
</tr>
<tr>
<th colspan="6" align="left" height="28" class="nav" nowrap="nowrap">
<a href="{U_INDEX}" class="nav"><</a>
<a class="nav" href="{U_VIEW_FORUM}">{FORUM_NAME}</a>
</th>
</tr>

表格的下一段看起来如下:
<!-- BEGIN topicrow -->
<tr>
<td class="row1" align="center" valign="middle" width="20">
<img src="img/{topicrow.TOPIC_FOLDER_IMG}" width="19" height="18" alt="{topicrow.L_TOPIC_FOLDER_ALT}" title="{topicrow.L_TOPIC_FOLDER_ALT}" />
</td>
<td class="row1" width="100%">
<span class="topictitle">
{topicrow.NEWEST_POST_IMG}{topicrow.TOPIC_TYPE}<a href="{topicrow.U_VIEW_TOPIC}" class="topictitle">{topicrow.TOPIC_TITLE}</a>
</span>
<span class="gensmall">
<br />
{topicrow.GOTO_PAGE}
</span>
</td>
<td class="row2" align="center" valign="middle">
<span class="postdetails">
{topicrow.REPLIES}
</span>
</td>
<td class="row3" align="center" valign="middle">
<span class="name">
{topicrow.TOPIC_AUTHOR}
</span>
</td>
<td class="row2" align="center" valign="middle">
<span class="postdetails">
{topicrow.VIEWS}
</span>
</td>
<td class="row3Right" align="center" valign="middle" nowrap="nowrap">
<span class="postdetails">
{topicrow.LAST_POST_TIME}
<br />
{topicrow.LAST_POST_AUTHOR} {topicrow.LAST_POST_IMG}
</span>
</td>
</tr>
<!-- END topicrow -->
这个部分将为每个主题循环,在 <!-- BEGIN topicrow --> 和 <!-- END topicrow --> 标签之间。请注意,这些行的背景颜色是 CSS 类 row1, row2, row3 和 row3right。我们可以更改一些事情,首先是行颜色,其次是主题作者的字体大小。这一行比周围的行要暗,看起来不太好,所以我们将其改为 row2 类。至于字体,这一行使用 name span 类,我们在 CSS 中将其更改为 {T_FONTSIZE1}。
主题的红色和粗体字体看起来也不太好,所以我们将其修改为我们在索引页面中也使用的小号和正常默认黑色字体。
这个类被称为 topictitle,在 CSS 中它看起来如下:
/* titles for the topics: could specify viewed link colour too */
.topictitle,h1,h2 {
font-weight: bold;
font-size: {T_FONTSIZE2}px;
color : {T_BODY_TEXT};
}
a.topictitle:link {
text-decoration: none;
color : {T_BODY_LINK};
}
a.topictitle:visited {
text-decoration: none;
color : {T_BODY_VLINK};
}
a.topictitle:hover {
text-decoration: underline;
color : {T_BODY_HLINK};
}
... 我们将其更改为:
/* titles for the topics: could specify viewed link colour too */
.topictitle,h1,h2 {
font-size: {T_FONTSIZE1}px;
color : {T_BODY_TEXT};
}
a.topictitle:link {
text-decoration: none;
color : {T_BODY_TEXT};
}
a.topictitle:visited {
text-decoration: none;
color : {T_BODY_TEXT};
}
a.topictitle:hover {
text-decoration: underline;
color : {T_BODY_TEXT};
}
我们几乎完成了这个部分。值得一提的是,当一个 公告、置顶 或 投票 帖子发布时,它将使用名为 {topicrow.TOPIC_TYPE} 的变量在主题名称前显示匹配的文本。为了匹配链接颜色,我们希望这段文本是红色而不是黑色,但同时又希望它使用 topictitle 类,就像其他文本一样。为了解决这个问题,我们在其周围添加了 <span style="color: {T_BODY_LINK}"> 和 </span> 标签,这将仅更改文本的颜色,而不会更改大小或其他属性。
最后,一旦我们添加了与索引页面相同的悬停效果,这个部分现在应该看起来如下:
<!-- BEGIN topicrow -->
<tr>
<td class="row1" align="center" valign="middle" width="20">
<img src="img/{topicrow.TOPIC_FOLDER_IMG}" width="19" height="18" alt="{topicrow.L_TOPIC_FOLDER_ALT}" title="{topicrow.L_TOPIC_FOLDER_ALT}" />
</td>
<td class="row1" width="100%"
onmouseover="this.style.backgroundcolor=’{T_TR_COLOR2}’;
this.style.cursor=’pointer’;"
onmouseOut=this.style.backgroundcolor=""
onclick="window.location.href=’{topicrow.U_VIEW_TOPIC}’">
<span class="topictitle">
{topicrow.NEWEST_POST_IMG}
<span style="color: {T_BODY_LINK}">
{topicrow.TOPIC_TYPE}
</span>
<a href="{topicrow.U_VIEW_TOPIC}" class="topictitle">{topicrow.TOPIC_TITLE}</a>
</span>
<span class="gensmall">
<br />
{topicrow.GOTO_PAGE}
</span>
</td>
<td class="row2" align="center" valign="middle">
<span class="postdetails">
{topicrow.REPLIES}
</span>
</td>
<td class="row2" align="center" valign="middle">
<span class="name">
{topicrow.TOPIC_AUTHOR}
</span>
</td>
<td class="row2" align="center" valign="middle">
<span class="postdetails">
{topicrow.VIEWS}
</span>
</td>
<td class="row3Right" align="center" valign="middle" nowrap="nowrap">
<span class="postdetails">
{topicrow.LAST_POST_TIME}
<br />
{topicrow.LAST_POST_AUTHOR} {topicrow.LAST_POST_IMG}
</span>
</td>
</tr>
<!-- END topicrow -->

表格的下一段看起来如下:
<!-- BEGIN switch_no_topics -->
<tr>
<td class="row1" colspan="6" height="30" align="center"
valign="middle">
<span class="gen">
{L_NO_TOPICS}
</span>
</td>
</tr>
<!-- END switch_no_topics -->
如果论坛中没有主题,将会显示如下内容。再次强调,字体大小有点太大,有两种方法可以更改它;要么将 <span class="gen"> 改为 <span class="gensmall">,要么更改 gen 的 CSS 以使用不同的字体大小。在这里,我们选择后者,因为这个模板可能始终需要 gen 类使用较小的尺寸。
表格行现在看起来是空的且较窄,因此需要稍微大一点;我们在这里添加一些换行符,这样这个表格部分就完成了:
<!-- BEGIN switch_no_topics -->
<tr>
<td class="row1" colspan="6" height="30" align="center" valign="middle">
<span class="gen">
<br />
{L_NO_TOPICS}
<br />
<br />
</span>
</td>
</tr>
<!-- END switch_no_topics -->

表格的最后部分看起来如下:
<tr>
<td class="catBottom" align="center" valign="middle" colspan="6" height="28">
<span class="genmed">
{L_DISPLAY_TOPICS}: {S_SELECT_TOPIC_DAYS} <input type="submit" class="liteoption" value="{L_GO}" name="submit" />
</span>
</td>
</tr>
</table>
表格不是使用row1、row2或row3的灰色背景颜色,而是使用一个名为catBottom的类。我们在 CSS 中找到它如下:
td.cat,td.catHead,td.catSides,td.catLeft,td.catRight,td.catBottom {
/*
background-image: url(templates/subSilver/images/{T_TH_CLASS1});
background-color:{T_TR_COLOR3};
border: {T_TH_COLOR3};
border-style: solid;
*/
height: 28px;
}
我们在之前移除菜单的背景颜色和图片时已经更改了这段代码。那时我们不需要它,所以我们添加了/*和*/注释标记。这只是为了我们的catLeft和catRight类,而现在我们需要为我们的catBottom做不同的事情。为了解决这个问题,我们必须从这个区域移除catBottom类,并在下面添加它自己的代码:
td.cat,td.catHead,td.catSides,td.catLeft,td.catRight {
/*
background-image: url(templates/subSilver/images/{T_TH_CLASS1});
background-color:{T_TR_COLOR3};
border: {T_TH_COLOR3};
border-style: solid;
*/
height: 28px;
}
td.catBottom { background-color:{T_TR_COLOR3}; }
我们将其背景颜色设置为{T_TR_COLOR3},这与row3相同,是灰色调中最深的。
调整跳转菜单的大小
在这个表格中需要修复的最后一件事情是跳转菜单和旁边的按钮的字体大小。跳转菜单和按钮的属性都在 CSS 中的select和input下:
/* Form elements */
input,textarea, select {
color : {T_BODY_TEXT};
font: normal {T_FONTSIZE2}px {T_FONTFACE1};
border-color : {T_BODY_TEXT};
}
我们只需要更改字体大小为{T_FONTSIZE1}。
我们将td元素向右对齐,而不是保持居中,以便使菜单出现在右侧。
在index_body.tpl文件中,我们在主表之后有一个表格,看起来是这样的:
<table width="717" cellspacing="0" border="0" align="center" cellpadding="2">
<tr>
<td align="left">
<span class="gensmall">
<a href="{U_MARK_READ}" class="gensmall">{L_MARK_FORUMS_READ}</a>
</span>
</td>
<td align="right">
<span class="gensmall">
{S_TIMEZONE}
</span>
</td>
</tr>
</table>
我们再次使用这个,但这次我们将{L_MARK_FORUMS_READ}变量更改为{L_MARK_TOPICS_READ},然后粘贴在这里。
在index_body.tpl中的这个表格之后,是带有上下黑色线条的表格,看起来是这样的:
<table align="center" width="717" border="0" cellspacing="0" cellpadding="0">
<tr height="10"><td></td></tr>
<tr>
<th colspan="2" class="thTop" height="25" nowrap="nowrap"><table width="717" cellspacing="0" cellpadding="2" border="0" align="center">
<tr>
<td align="left" valign="bottom">
<span class="gensmall">
<!-- BEGIN switch_user_logged_in -->
{LAST_VISIT_DATE}
<br />
<!-- END switch_user_logged_in -->
{CURRENT_TIME}
<br />
</span>
<span class="nav">
<a href="{U_INDEX}" class="nav">{L_INDEX}</a>
</span>
</td>
<td align="right" valign="bottom" class="gensmall">
<!-- BEGIN switch_user_logged_in -->
<a href="{U_SEARCH_NEW}" class="gensmall">{L_SEARCH_NEW}</a>
<br />
<a href="{U_SEARCH_SELF}" class="gensmall">{L_SEARCH_SELF}</a>
<br />
<!-- END switch_user_logged_in -->
<a href="{U_SEARCH_UNANSWERED}" class="gensmall">{L_SEARCH_UNANSWERED}</a>
</td>
</tr>
</table></th>
</tr>
<tr height="10"><td></td></tr>
</table>
我们将这个表格从index.tpl复制过来,并粘贴在这里。我们不再使用那里使用的变量,而是使用我们从原始第一个表格(之前移动到文件末尾的表格)中获得的变量。表格看起来如下:
<table align="center" width="717" border="0" cellspacing="0" cellpadding="2">
<tr height="10"><td></td></tr>
<tr>
<th colspan="2" class="thTop" height="25" nowrap="nowrap">
<table align="left" width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="left" valign="top">
<span class="gensmall">
{L_MODERATOR}: {MODERATORS}
<br />
{LOGGED_IN_USER_LIST}
</span>
</td>
<td align="right" valign="top">
<span class="gensmall">
{PAGE_NUMBER}
<br />
{PAGINATION}
</span>
</td>
</tr>
<tr align="left" valign="top">
<td colspan="2">
<span class="nav">
<a href="{U_INDEX}" class="nav">{L_INDEX}</a>
~
<a class="nav" href="{U_VIEW_FORUM}">{FORUM_NAME}</a>
</span>
</td>
</tr>
</table>
</th>
</tr>
<tr height="10"><td></td></tr>
</table>

下一个表格看起来如下:
<table width="100%" cellspacing="2" border="0" align="center"
cellpadding="2">
<tr>
<td align="left" valign="middle" width="50">
<a href="{U_POST_NEW_TOPIC}"><img src="img/{POST_IMG}" border="0" alt="{L_POST_NEW_TOPIC}" /></a>
</td>
<td align="left" valign="middle" width="100%">
<span class="nav">
<a href="{U_INDEX}" class="nav">{L_INDEX}</a> -> <a class="nav" href="{U_VIEW_FORUM}">{FORUM_NAME}</a>
</span>
</td>
<td align="right" valign="middle" nowrap="nowrap">
<span class="gensmall">
{S_TIMEZONE}
</span>
<br />
<span class="nav">
{PAGINATION}
</span>
</td>
</tr>
<tr>
<td align="left" colspan="3">
<span class="nav">
{PAGE_NUMBER}
</span>
</td>
</tr>
</table>
</form>
这个表格包含新建主题按钮和表单的结束标签,但我们实际上并不需要再次使用其他变量,可以将表格缩减为如下:
<table width="715" align="center" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
<a href="{U_POST_NEW_TOPIC}"><img src="img/{POST_IMG}" border="0" alt="{L_POST_NEW_TOPIC}" /></a>
</td>
</tr>
</table>
</form>
然后我们有一个带有跳转框的表格。我们只需要更改宽度和对齐方式,但在这里我们再次添加一个高度为十像素的额外表格行,只是为了在不同区域之间获得一些空间。
最后一个表格显示图标和用户可以在该主题中执行的操作列表,我们目前只需要修复宽度。

这就带我们来到了viewforum_body.tpl文件的末尾。
故事继续
其余的.tpl文件需要类似的编辑:在 CSS 中定位类,尽可能从先前编辑的文件中复制表格,并使用针对你正在处理的.tpl的特定 phpBB 变量。现在你应该对如何做有相当好的了解,因此,我们将在本章的其余部分总结它们的功能。
从NoseBleed文件夹的第一个文件开始:
agreement.tpl
这是当访客想要注册时遇到的第一个页面。它解释了注册协议条款并检查访客的年龄。
bbcode.tpl
这是 phpBB 用来显示引用和代码、电子邮件链接、帖子中的图片、URL 等文件的文件。例如,如果你不喜欢引用的显示方式,这就是你需要编辑的文件。
confirm_body.tpl
如果用户需要通过“是”或“否”来确认某些内容,此文件将被显示。
error_body.tpl
此文件显示错误信息。
faq_body.tpl
此文件显示常见问题解答部分。
forumIE.css
这是用于附加 CSS 代码,包含针对 IE 的特定格式定义。
groupcp_info_body.tpl
此文件显示用户组信息和成员。
groupcp_pending_info.tpl
此文件显示给用户组版主,以便他们允许或禁止待定用户加入用户组。
groupcp_user_body.tpl
此文件显示所有用户组的概述,以及用户属于哪个用户组。
index.htm
此文件显示模板设计者制作的一个图像。它被包含并显示,以防止网站访客查看文件夹中的文件。
index_body.tpl
这是论坛的主页。
jumpbox.tpl
此文件显示跳转框。
login_body.tpl
此文件显示当有人想要登录时论坛的外观。
memberlist_body.tpl
此文件显示论坛的注册用户。
message_body.tpl
此文件显示 phpBB 向用户显示的确认消息;例如,在更改个人资料并点击提交按钮后,你会看到此文件,以确认你的个人资料已被更新。
modcp_body.tpl
当版主想要审核一个帖子时,使用此文件。
modcp_move.tpl
当版主想要移动一个主题时,使用此文件。
modcp_split.tpl
当版主想要分割一个主题时,使用此文件。
modcp_viewip.tpl
当版主想要查看所选帖子的用户的 IP 地址时,使用此文件。
subSilver.tpl
这是模板的配置文件,应重命名为模板的名称,例如NoseBleed.tpl。它告诉 phpBB 在哪里可以找到模板的不同图像和图标。
subSilver.css
这是模板的 CSS 文件,如果您想重新使用它,应将其重命名为模板的名称。默认情况下,它没有被使用;相反,CSS 代码位于overall_header.tpl文件的开始处。在本书的“最终润色”部分,您将看到如何将 CSS 移动到其自己的文件中,如果您试图节省带宽,您可能想要这样做。
overall_footer.tpl
此文件几乎在所有页面的底部显示。它包含指向管理员面板和 phpBB 版权注明的链接。
overall_header.tpl
此文件几乎在所有页面的顶部显示。默认情况下,它在文件开头包含 CSS 代码。
posting_body.tpl
当用户发布新帖子时,此文件会显示。它还包含用于弹出窗口的 JavaScript 代码,当用户想要查看他们可以在帖子中使用的所有表情符号时使用。
posting_poll_body.tpl
此文件显示如何将投票添加到帖子中,并且通过posting_body.tpl中的变量{POLLBOX}加载。
posting_preview.tpl
此文件显示帖子预览的外观,并且通过posting_body.tpl中的变量{POST_PREVIEW_BOX}加载。
posting_smilies.tpl
此文件在弹出窗口中显示用户可以在其帖子中使用的所有表情符号。此文件使用simple_header.tpl和simple_footer.tpl而不是overall_header.tpl和overall_footer.tpl。
posting_topic_review.tpl
此文件在posting_body.tpl中的 iframe 中显示,使用{TOPIC_REVIEW_BOX}变量。此文件使用simple_header.tpl和simple_footer.tpl而不是overall_header.tpl和overall_footer.tpl。
privmsgs_body.tpl
此文件显示您所有的私人消息。
privmsgs_popup.tpl
当用户收到新的私人消息时,当用户访问论坛时,会弹出一个小的弹出窗口告诉他们有关消息的内容。
此文件使用simple_header.tpl和simple_footer.tpl而不是overall_header.tpl和overall_footer.tpl。
privmsgs_preview.tpl
此文件显示您的私人消息预览,通过posting_body.tpl中的变量{POST_PREVIEW_BOX}加载。
privmsgs_read_body.tpl
当用户阅读私人消息时,此文件会显示。
profile_add_body.tpl
当访客注册时,此文件会显示,并用于收集诸如用户名、密码、位置等信息。如果用户想要更改其个人资料设置,此文件也会显示。
profile_avatar_gallery.tpl
此文件显示用户可以选择添加到其个人资料设置中的头像列表。
profile_send_email.tpl
当用户向论坛中的另一位用户发送电子邮件时,此文件会显示。
profile_send_pass.tpl
此文件显示如何找回遗忘的密码。
profile_view_body.tpl
此文件显示已注册用户的个人资料。
search_body.tpl
当用户搜索帖子或主题时,此文件会显示。
search_results_posts.tpl
此文件仅显示包含搜索到的单词或表达式的帖子列表。
search_results_topics.tpl
此文件仅显示包含搜索到的单词或表达式的主题列表。
search_username.tpl
此文件在搜索用户名时显示一个弹出窗口。它通过变量{U_SEARCH_USER}从posting_body.tpl加载。此文件使用simple_header.tpl和simple_footer.tpl而不是overall_header.tpl和overall_footer.tpl。
simple_footer.tpl
此文件替换了弹出窗口和 iframe 中的overall_footer.tpl。
simple_header.tpl
此文件替换了弹出窗口和 iframe 中的overall_header.tpl。有时,只需从overall_header.tpl复制 CSS 并将其粘贴到simple_header.tpl中,就可以使弹出窗口和 iframe 的外观与模板的其余部分相匹配。
theme_info.cfg
这是模板的配置文件。第一次安装时,模板使用此文件中默认的颜色、字体等值。如果您计划将模板发布给其他人,请确保此文件中有正确的值。您不需要手动输入所有这些值。如果您转到管理员面板,在样式管理下选择导出,phpBB 将创建一个新的theme_info.cfg文件,其中包含管理员面板中的所有字体和颜色设置。您可以下载并使用此文件。
viewforum_body.tpl
此文件显示所选论坛中的主题列表。
viewonline_body.tpl
此文件显示论坛上的用户和访客列表。
viewtopic_body.tpl
此文件显示您论坛上的主题。
viewtopic_poll_ballot.tpl
此文件显示主题中的投票表决。它通过{POLL_DISPLAY}变量从viewtopic_body.tpl加载。
viewtopic_poll_result.tpl
此文件显示主题中的投票结果。它通过{POLL_DISPLAY}变量从viewtopic_body.tpl加载。
管理员文件夹
模板中admin文件夹中的文件控制管理员面板的显示方式。它们使用page_header.tpl和page_footer.tpl而不是overall_header.tpl和overall_footer.tpl。有时,只需从overall_header.tpl复制 CSS 并将其粘贴到page_header.tpl中,就可以使管理员面板与模板的其余部分相匹配。
图标和图片
模板中所有的图标和图片都位于images文件夹中。此文件夹包含另一个文件夹,其中包含特定语言的图片。这里有一点需要注意:删除的图标是通用的,并且仅通过图像中的X显示。如果我们想使我们的图像显示实际文本,如删除,我们应该将图像放置在特定语言文件夹中,在这种情况下是lang_english文件夹。由于 phpBB 不会在语言文件夹中查找删除图像,我们需要编辑NoseBleed.cfg文件。在代码中向下查找,我们发现如下内容:
$images[‘icon_delpost’] = "$current_template_images/icon_delete.gif";
这是 phpBB 使用此图像的路径。添加 {LANG} 语言变量,我们可以指定新的路径:
$images[‘icon_delpost’] = "$current_template_images/{LANG}/icon_delete.gif";
制作所有新的图片和图标可能会吓跑很多人,但这也有一线希望:我们不必从头开始。
在 www.phpbb.com/downloads.php#subSilver 可以下载原始 SDK 文件,然后使用 Photoshop、GIMP、Paint Shop Pro 和其他程序进行编辑。如果我们只想更改字体颜色、字体大小或背景,这是一个简单的解决方案。
对于 NoseBleed 模板,此文件被下载,图标字体和背景被更改,但语言按钮的小图标保持不变。
为了进一步简化图标和图像的使用,所有用于无新主题的图标都被更改为空白 GIF 文件;只有新主题会有图标。我们还从 index_body.tpl 和 viewforum_body.tpl 文件说明中移除了无新主题图标,因为它们现在只是空白图标。
最后的润色
模板现在基本完成,剩下要做的就是测试错误并优化它。请记住检查指向 subSilver 目录的链接,因为这些需要更改为我们新的模板文件夹。
我们还可以通过在管理员面板中使用字体颜色 2和字体颜色 3来更改索引页上的管理员和版主颜色。
优化模板的一种方法是将 CSS 放在自己的文件中,这样我们可以节省带宽并使论坛加载更快。为此,在您的浏览器中打开论坛,在网站上右键单击某个位置,然后选择查看源代码(在 IE 中)或查看 | 源代码或源代码(在其他浏览器中)。复制 <style type="text/css"> 和 </style> 标签之间的所有 CSS 代码,并将其粘贴到模板的 CSS 文件中。上传新的 CSS 文件,并从 overall_header.tpl 中删除 CSS 代码。在 overall_header.tpl 的顶部,您会找到:
<!-- link rel="stylesheet" href="templates/subSilver/{T_HEAD_STYLESHEET}" type="text/css" -->
...需要更改为:
<link rel="stylesheet" href="templates/NoseBleed/{T_HEAD_STYLESHEET}"
type="text/css">
{T_HEAD_STYLESHEET} 变量使用 CSS 文件的默认名称,在本例中为 NoseBleed.css。如果您想将 CSS 文件命名为其他名称,请将此变量替换为您想要使用的 CSS 文件名称。
摘要
我们已经介绍了很多内容,但我们才刚刚开始。本章中解释的 HTML、JavaScript 和 CSS 代码仅仅是一个狭窄的介绍。随着持续的工作,您将发现新的技巧并获得更多的知识,从而实现更好的编码。然而,我希望到现在您已经获得了制作自己模板的基本技能和勇气。这可能看起来是一项艰巨的任务,毫无疑问,完成它需要一些时间,但当你开始时,你会发现它并不那么困难。
在几个活跃的模板开发社区中,你总能找到帮助、评论以及测试你模板的人;无论是位于www.phpbb.com/phpBB/的 phpBB 社区,还是www.phpbbhacks.com/forums/的 phpBBHacks.com 支持论坛,都是充满非常有帮助的人的地方。
第七章:创建新的 MOD
随着你的社区成长,你可能会发现你需要扩展论坛的功能。你可能需要引入新的 BBCode 标签、文件附件、照片画廊或一些新的管理工具。几乎任何你需要的功能都可以通过安装修改来实现,正如你在第四章中学到的。这里的关键词是“几乎”。最终,你可能需要某个功能,但发现自己找不到现有的修改。当这种情况发生时,你有两个选择:请求某人帮助寻找修改,或者自己创建一个新的。在本章中,你将学习:
-
修改是什么
-
创建修改所需的技能和工具
-
如何创建一个简单的修改
-
使你的修改可供其他 phpBB 用户使用的方法
MOD 和 Hack 介绍
如你所回忆的第四章,修改最常见的是被称为 MOD 或 Hack,包含添加、删除或更改 phpBB 论坛功能的文件。你还学到了有数千种修改可供下载以及如何在你的论坛上安装修改。这些内容是从修改 用户 的角度向你展示的,但现在你需要从 MOD 或 Hack 作者 的角度来审视它们。
标准修改的最基本形式是一个包含编辑论坛文件指令的简单文本文件。这些指令通常使用修改模板进行格式化,包括标题和动作列表。稍微复杂一些的修改也在同一文件中包含编辑论坛数据库的命令,或者一个 SQL 查询安装程序,如 db_update.php 文件。更复杂的修改还包括新的论坛文件。所有文件都放在一个压缩的存档文件中(通常是 ZIP 文件),并在万维网上提供下载。
在开始之前
要创建一个修改,你需要一些技能和工具来简化修改的开发和测试。你的具体需求将取决于你开发的修改的范围和目的。较小的修改通常需要更基本的设置,但大型修改有时最好留给专业人士。
构建你的技能集
正如你所知,phpBB 是基于四种编程语言的组合:PHP:超文本预处理器,结构化查询语言(SQL),超文本标记语言(HTML)和 JavaScript。如果你之前从未听说过这些,不要担心!你不需要是一位经验丰富的程序员就可以开始创建修改。实际上,很多人都是通过使用 phpBB 来学习编程基础的。随着你开发修改,你会更加熟悉 phpBB 和这些语言。本质上,你可以(并且会)在过程中学习。
PHP: Hypertext Preprocessor,通常简称为 PHP,是 phpBB 中用于几乎所有任务的主体编程语言。正如你可能已经注意到的,phpBB甚至是以这种语言命名的。你论坛中所有以.php结尾的文件都包含 PHP 代码,还有一些其他文件也是如此。了解 PHP 是创建修改时最基本技能之一,因此你可能想要花时间查找并阅读一些关于基本 PHP 编程的教程。你还会想要将位于www.php.net/manual/的在线 PHP 手册加入书签。手册也可以下载,适用于离线工作。花时间阅读手册的前三章到四章。它们重点介绍了你将反复看到的代码语法等重要细节。
结构化查询语言(Structured Query Language,简称 SQL)是一种用于访问 SQL 数据库的编码。你的论坛的 PHP 文件使用SQL 查询(或用 SQL 编码编写的命令)将信息存储在几个数据库表中,并在之后从这些表中检索信息。如果你想创建一个跟踪某些数据的修改,比如页面点击计数器,你需要知道如何编写一些 SQL 查询。你应该尝试找到你网站数据库软件的手册,以学习查询的正确结构。大多数软件将支持官方的 SQL 标准形式,但可能会添加一些独特的扩展。MySQL 手册,作为 phpBB 最受欢迎的数据库选择,可在www.mysql.com/找到。
超文本标记语言(Hypertext Markup Language,简称 HTML)实际上并不是一种编程语言。正如其名所示,HTML 用于标记文档的显示。在这种情况下,这些文档是论坛页面。你在第四章中了解到,用于显示您的论坛的 HTML 代码或另一种标记语言的代码存储在如templates/subSilver之类的目录中的模板文件中。你可以找到的与 HTML 相关的最接近的指南是万维网联盟的 HTML 4.01 规范,位于www.w3.org/TR/html401。然而,任何主要搜索引擎都可以找到大量更容易理解的 HTML 教程。
最后,JavaScript是一种客户端脚本语言,phpBB 用于某些类型的用户交互。客户端脚本语言是运行在远程用户计算机上的编程语言,尽管代码位于你的网站上。JavaScript 代码将在查看者的网络浏览器中运行,因此这不是你可以始终依赖的东西。
大多数现代网络浏览器都有允许禁用 JavaScript 或某些 JavaScript 操作的功能。一些较旧的浏览器根本不支持 JavaScript。大多数修改版不使用 JavaScript 代码,但有些完全基于 JavaScript。就像 HTML 一样,有许多在线教程和网站专门用于教授这种语言的相关方面。
除了编程语言之外,你还需要对每个 phpBB 文件的目的有一个基本的了解。这是你在与 phpBB 合作过程中一定会形成的技能之一,但 phpBB 社区中也有一些在线资源会有所帮助。在这些社区中,你还会找到经验丰富的 MOD 和 Hack 作者成员。他们中的一些人经常能就与这些主题相关的广泛问题提供有用的建议,所以如果你需要帮助,不要犹豫去寻求帮助。
适合工作的正确工具
任何人都可以创建一个新的修改版,但如果你有合适的材料和工作环境,这会容易得多。大多数作者使用提供许多有用功能的专用工具。如果你计划创建许多修改版,你应该获取几种类型的资源。
第一个也是最重要的资源是 phpBB 本身。许多作者会创建第二个 phpBB 安装,有时是在自己的电脑上,用于测试和开发代码。这种方法的优点是,在开发过程中出现的问题不会影响人们目前正在访问的实时网站。通常,对测试环境的更大控制也是作者们偏好的另一个因素。
在自己的电脑上创建 phpBB 安装的缺点是,你可能首先需要安装几件其他软件。这些包括一个网络服务器程序,例如 Apache,PHP 语言,一个 SQL 数据库包,以及可能的其他软件。一些作者会使用包含这些软件中一个以上的包。例如,来自www.easyphp.org的 EasyPHP 可以安装并管理 Apache、PHP 和 MySQL。安装了这三个之后,你应该能够安装 phpBB。
总是保留一个完全未修改的 phpBB 副本用于备份和参考是个好主意。你应该确保你正在使用 phpBB 2.0 的最新版本,以确保你有最安全和最新的代码。另一方面,请记住,并非所有社区都基于最新的 phpBB 版本。phpBB 2.0 已经发布了超过十一次更新,有些人没有时间在每个版本发布时都进行升级。
如果你将修改版公开发布,一些论坛管理员可能会尝试使用它,如果在那个 phpBB 版本中遇到问题,他们可能会向你寻求帮助。出于这些原因,你可能还想保留一些较旧版本的 phpBB 副本,即使你不在那些版本上测试你的修改。每个 phpBB 的版本都可以从以下网页下载:
-
SourceForge 上的 phpBB 项目文件列表:
sourceforge.net/project/showfiles.php?group_id=7885 -
phpBBHacks phpBB 下载:
www.phpbbhacks.com/phpbbinfo.php
在开发你的修改时,确保你使用的是未经修改的 phpBB 安装。如果你在一个已经安装了其他修改的论坛上创建修改,那些修改可能会对开发过程产生不利影响。它们可能会添加代码,导致你的修改行为与没有这些修改时不同。由于你无法预知其他人的论坛上已经安装了哪些修改,因此在一个被黑掉的 phpBB 安装上开发的修改可能会引起问题。你也可能不小心在自己的修改安装文件中包含了另一个修改的代码。这可能会导致各种意外的反应。
注意
有可能你需要开发一个需要另一个存在才能工作的修改,比如一个传送门附加块。在这种情况下,只有绝对必要的修改应该安装在你的测试论坛上。
另一个非常重要的工具是用于编辑 phpBB 文件的优秀程序。对于像第四章中那样的简单修改安装工作,Microsoft WordPad 就足够了。你可以继续使用 WordPad 来完成这一章,但如果你打算开发多个修改,你可能需要一个具有更广泛有用功能的程序。
有许多文本编辑程序具有语法高亮功能,这使得编码变得容易得多。有了语法高亮,代码的不同方面会以不同的颜色显示。这个功能可以让你通过查看文件中使用的颜色来发现错误的代码。其他功能,如多行搜索、查找和替换或代码自动完成,也可以节省时间。你可以在 PHP-Editors 网站上找到具有这些功能的许多文本编辑程序的列表和评论,www.php-editors.com/。
注意
Microsoft WordPad 将足以完成本章中展示的示例。
创建一个简单的 MOD:一个新的 BBCode 标签
学习的最佳方式之一是通过实际操作,因此现在是你创建你的第一个 phpBB 修改的时候了。随着你在这个部分的学习,你将完成创建修改的整个过程。由于这是你的第一个修改,重点将放在添加一个简单但实用的新功能上:一个新的 BBCode 标签。此类修改自 phpBB 的早期版本以来一直在开发中。你将遵循多年来传统上用于创建许多 BBCode 标签的过程。如果你从网站上下载了这个修改,它将只是一个包含指令的单个文件,没有其他文件或数据库更改。
第一步——确定你的目标
任何项目的第一步是明确你打算实现的目标。也许你想要重新排列主题的显示方式。或者可能是在注册表中添加一个新的条目。无论你选择什么,在你真正动手之前,你需要知道你试图做什么。
正如你所知,这次修改的目标将是向你的论坛添加一个新的 BBCode 标签。通过安装 BBCode 修改,你为论坛成员提供了新的格式化帖子的方式。phpBB 在首次安装时包含了粗体、斜体和下划线文本、文本颜色和大小、图片、项目符号和编号列表以及其他几种格式化选项。你可以下载数十种不同的新标签的修改。一些例子包括发光、阴影、高亮、移动和闪烁的文本。我们将添加到论坛中的[s] BBCode 标签创建的是删除线文本,它是一系列带有每个字符中间横线的普通单词。Strike BBCode 的效果可以在以下屏幕截图中看到:

第二步——规划你的数据库更改
当创建跟踪某种新信息的修改时,你通常需要通过 SQL 查询编辑或创建数据库表。Strike BBCode 不需要任何数据库更改,但这仍然是修改创建的一个重要部分,因此仍需解决。作者决定进行的数据库更改类型通常决定了修改的剩余结构。
在大多数修改中,通常使用三种类型的数据库更改:添加新的数据库表列、添加整个数据库表以及向表中添加新数据。您将进行哪些更改将非常取决于修改的内容。如果您只是向用户注册和资料中添加新字段,您将向用户数据库表添加新列,通常称为phpbb_users。为了记录人们在到达您的论坛之前访问的网站信息,您需要一个新数据库表。当您的修改具有应在管理控制面板中更改的配置功能时,向phpbb_config表添加新数据是预期的。
您可以使用 phpMyAdmin 或类似的数据库管理软件对数据库的所有更改进行操作。您可以通过 phpMyAdmin 的 SQL 标签编写自己的 SQL 查询并执行它们,或者通过 phpMyAdmin 提供的点选操作系列完成相同的目标。
第 3 步—选择您的文件
您的修改需要编辑 phpBB 文件,并可能需要添加新的文件,以实现您的目标。在此阶段,您需要决定哪些文件是最佳编辑对象,并对这些文件进行备份。如果您的修改需要添加新文件,您需要决定每个文件的命名以及它在 phpBB 目录结构中的位置。某些类型的新文件需要放置在特定的位置。例如,如果您需要向管理控制面板添加新部分,您将不得不在 phpBB 的admin目录中添加至少一个文件。本书的附录包括对 phpBB 文件和目录的描述,这些描述将有助于此步骤。
要添加 BBCode 标签,包括我们的删除线 BBCode,只需要编辑两个文件:includes/bbcode.php和templates/subSilver/bbcode.tpl。这些文件管理 phpBB 中的所有 BBCode 操作。bbcode.tpl包含每个 BBCode 标签的 HTML 代码,并采用特殊格式,而bbcode.php将 BBCode 标签替换为该 HTML 代码,并在帖子中使用。后一个文件还执行任何必要的特殊处理,以正确格式化文本。
然而,我们还将编辑一些其他文件。如果您在任何 phpBB 论坛上发过帖,您无疑已经注意到发帖表单包含特殊按钮,点击这些按钮会将 BBCode 标签插入到发帖表单中。论坛成员喜欢这些按钮,因此我们将为删除线 BBCode也添加一个。为此需要编辑三个其他文件:posting.php、language/lang_english/lang_main.php和templates/subSilver/posting_body.tpl。以下截图显示了添加删除线按钮后的最终发帖表单版本:

第 4 步—文件编辑和创建
最后,是好的部分。在这一步中,你应该编辑之前步骤中选择的现有 phpBB 文件,并创建任何需要的新文件。新文件将包含创建修改所需的各种效果的代码。由于 Strike BBCode 不需要任何新文件,我们可以专注于第 3 步中列出的文件。正如你将看到的,即使是简单的修改,这一步也可能相当长。要创建 Strike BBCode,你需要执行以下操作:
-
开发代码以处理帖子中的 BBCode 标签
-
修改将替换帖子中标签的现有 HTML 代码
-
为发布表单构建一个按钮,并包含鼠标悬停工具提示
-
学习每个步骤是如何包含进来的以及为什么包含
-
检查创建 Strike BBCode 的一些替代方法
注意
在创建或编辑 PHP 文件时,遵循 phpBB 的编码标准是个好主意。这样做可以使你的代码更容易被他人阅读和使用。这些指南的副本包含在 phpBB 下载中,也可以在网上找到,网址为
area51.phpbb.com/docs/guide-coding.html。
首先要编辑的文件是includes/bbcode.php,它在将帖子插入数据库之前和每次显示帖子时都会处理 BBCode 标签。这里使用了几个PHP 函数来完成这项任务。函数是用于执行任务的代码片段,通常是需要经常重复执行或在多个不同地方使用的任务。一个基本的函数可能看起来像以下示例:
function do_some_thing($string)
{
// Lines of code inside the function perform some task
$string = ‘Some random text’;
return $string;
}
这是一个名为do_some_thing()的非常简单的函数。它仅仅将单词Some random text存储在名为$string的变量中,然后将$string的值返回给使用该函数的代码。你可以通过代码的第一行来识别函数,它总是以单词function开头。接下来是函数的名称,然后是一组可能包含参数(如果有)的括号。变量是数据或其他某种值的名字。变量总是以美元符号$开头。bbcode.php中的某些函数包括load_bbcode_template()、prepare_bbcode_template()、bbencode_second_pass()、bbencode_first_pass()和make_clickable()。许多函数前面都有注释行,这些注释行描述了代码的目的,但实际上并不影响任何内容。
bbencode_second_pass() 和 bbencode_first_pass() 函数包含必须扩展以添加任何 BBCode 标签的代码。bbencode_first_pass() 必须在将消息放入论坛数据库以供以后检索之前,为每个帖子中的每个 BBCode 标签添加一个特殊、唯一的标识字符串。bbencode_second_pass() 将更改后的 BBCode 标签替换为存储在 bbcode.tpl 中的匹配 HTML。你需要添加一些代码,以便每个函数都能识别删除线 BBCode。由于 bbencode_second_pass() 实际上在文件中列在 bbencode_first_pass() 之前,你应该首先编辑 bbencode_second_pass()。这并不是一个真正的要求,但按“从上到下”的方式编辑文件通常是良好的实践。
行动时间——第一次编辑
-
在
includes/bbcode.php文件的bbencode_second_pass()函数中找到以下行。这是这些行在文件中一起出现的唯一位置:// [u] and [/u] for underlining text. $text = str_replace("[u:$uid]", $bbcode_tpl[‘u_open’], $text); $text = str_replace("[/u:$uid]", $bbcode_tpl[‘u_close’], $text); -
高亮(或选择)这些行。复制它们,并将复制的一组行粘贴到现有行下面的文件中。代码现在应该看起来像这样(在我们的复制之后):
$text = str_replace("[/b:$uid]", $bbcode_tpl[‘b_close’], $text); // [u] and [/u] for underlining text. $text = str_replace("[u:$uid]", $bbcode_tpl[‘u_open’], $text); $text = str_replace("[/u:$uid]", $bbcode_tpl[‘u_close’], $text); // [u] and [/u] for underlining text. $text = str_replace("[u:$uid]", $bbcode_tpl[‘u_open’], $text); $text = str_replace("[/u:$uid]", $bbcode_tpl[‘u_close’], $text); // [i] and [/i] for italicizing text. -
在第一行复制的行中,将
[u] and [/u] for underlining标签替换为[s] and [/s] for strike out。 -
在第二行复制的行中,将
[u:$uid]更改为[s:$uid],并将u_open更改为s_open。 -
将第三行复制的
[/u:$uid]更改为[/s:$uid],并将u_close更改为s_close。你的复制行在完全编辑后应该看起来像以下示例:// [s] and [/s] for strike out text. $text = str_replace("[s:$uid]", $bbcode_tpl[‘s_open’], $text); $text = str_replace("[/s:$uid]", $bbcode_tpl[‘s_close’], $text);
发生了什么?
你现在已经完成了对 bbencode_second_pass() 函数进行更改,以便与你的删除线 BBCode 标签一起工作所需的更改。完成此操作后,让我们花一点时间看看你更改的行以及它们的一些重要点。
你复制的行是下划线 BBCode 标签的一部分。复制这些行允许你在更改第二组行以创建删除线的同时,保持一个可工作的下划线 BBCode。删除线 BBCode 实际上与下划线非常相似,因此你将使用相关的代码行作为许多即将到来的文件更改的基础。每一行都将成为删除线 BBCode 的一个独特部分,因为它通过你所做的更改而转变。
你首先复制然后编辑的第一行是:
// [u] and [/u] for underlining text.
这一行开头的两个正斜杠 // 标记了这是一条注释行。这条特定的注释行说明接下来的两行处理的是开启和关闭下划线 BBCode 标签,即 [u] 和 [/u]。你将注释中的 [u] and [/u] for underlining 标签替换为 [s] and [/s] for strike out。现在注释行已经更新,以反映后续其他复制行的更改。
其他两行是用于在帖子显示在论坛之前处理帖子的 PHP 代码,因此它们可能相当微妙。确保你的最终行与给出的示例完全匹配。如果你以错误的方式编辑这些行,你可能会在论坛上看到错误消息。在编辑这些行时,特别小心双引号和单引号以及$uid变量。在编辑这些行时,这些不应该做任何更改。
[s:$uid]和[/s:$uid]的编辑与允许用户访问 Strike BBCode([s]和[/s])的 BBCode 格式相关。在编辑这些行时,这可能并不明显,但现在你应该看到这种关联。s_open和s_close的编辑也很重要,但它们的精确目的最好在编辑bbcode.tpl时再进行考察。
行动时间——第二次编辑
-
在
includes/bbcode.php文件中的bbencode_first_pass()函数内找到以下行。再次强调,这些行在这个文件中只以这种顺序出现。// [u] and [/u] for underlining text. $text = preg_replace("#\u\\[/u\]#si", "[u:$uid]\\1[/u:$uid]", $text); -
以与之前的行动时间相同的方式重复相同的行。
-
找到与之前代码中相同的注释行。以之前行动时间示例中描述的方式编辑它。完成此操作后,你的文件应该类似于以下内容。
$text = preg_replace("#\b\\[/b\]#si", "[b:$uid]\\1[/b:$uid]", $text); // [u] and [/u] for underlining text. $text = preg_replace("#\u\\[/u\]#si", "[u:$uid]\\1[/u:$uid]", $text); // [s] and [/s] for strike out text. $text = preg_replace("#\u\\[/u\]#si", "[u:$uid]\\1[/u:$uid]", $text); // [i] and [/i] for italicizing text. -
在这里重复的第二个行中,将
[u\]改为[s\],[/u]改为[/s],将[u:$uid]\\1[/u:$uid]改为[s:$uid]\\1[/s:$uid]。现在这些行已经完全修改,如下所示:// [s] and [/s] for strike out text. $text = preg_replace("#\s\\[/s\]#si", "[s:$uid]\\1[/s:$uid]", $text);
发生了什么?
完成对bbencode_second_pass()的更改后,你现在已经转向了bbencode_first_pass()函数。在这里,我们再次使用下划线 BBCode 的现有代码作为你的 Strike BBCode 的基础。你看到了与文件中第一组更改中相同的另一个注释行,并且以与其他相同的方式进行了修改。
在这里只编辑了一行其他内容,并且这一重要行会在帖子存储到论坛的 SQL 数据库之前处理包含 Strike BBCode 标签的帖子。这一行的主要目的是为了添加$uid变量以便后续引用。你不需要对此过于担心,但请注意,这是 phpBB 众多内置安全措施之一。当显示帖子时,phpBB 会将这里未添加$uid的帖子视为纯文本。
这是在includes/bbcode.php中需要的最后一个更改。现在你准备好继续编辑第二个文件,即templates/subSilver/bbcode.tpl。这个文件包含创建每个 BBCode 视觉效果的 HTML 代码片段。存储在includes/bbcode.php中的函数读取此文件并将 BBCode 标签如[s]和[/s]替换为代码片段。
行动时间——编辑 BBCode HTML
-
在
templates/subSilver/bbcode.tpl中找到以下行:<!-- BEGIN u_open --><span style="text-decoration: underline"><!-- END u_open --> <!-- BEGIN u_close --></span><!-- END u_close --> -
复制这些行并将副本集粘贴到文件中,就像你之前对
includes/bbcode.php所做的那样。 -
将第一行重复出现的
u_open替换为s_open。 -
在同一行,将
underline替换为line-through。 -
在第二行,将两个
u_close都更改为s_close。 -
最终的完整代码应该是:
<!-- BEGIN s_open --><span style="text-decoration: line-through"><!-- END s_open --> <!-- BEGIN s_close --></span><!-- END s_close -->
发生了什么?
要创建将显示在删除线 BBCode 的[s]和[/s]标签位置的 HTML,我们再次使用了下划线 BBCode 的现有代码。如果你花点时间查看这个文件中的其他代码片段,你可能会注意到它们大多数都以一些文本开始,比如<!-- BEGIN u_open -->,并以类似<!-- END u_close -->的文本结束。这些是 HTML 注释,由<!--和-->字符序列标记。phpBB 使用这些注释来标记每个 BBCode 标签的代码片段的开始和结束。对于下划线 BBCode,[u]被替换为u_open代码,[/u]被替换为u_close代码。你可能还记得在includes/bbcode.php文件中编辑了u_open和u_close,分别将它们更改为s_open和s_close。因此,s_open和s_close也必须在这里的 HTML 注释中使用。
这里还需要一个额外的更改,这实际上产生了引人注目的效果。下划线 BBCode 使用一个名为text-decoration的层叠样式表属性来在文本下方画线。这个代码是text-decoration: underline。text-decoration 属性还支持一个值为line-through的值,它会在文本中间水平画一条线。所以,通过将s_open行中的underline更改为line-through,你创建了删除线 BBCode。
这就完成了使用删除线 BBCode 所需的所有更改;你现在可以在论坛上使用[s]和[/s]标签发帖。然而,你必须手动输入这些标签。许多,如果不是大多数,论坛用户更喜欢在发帖表单中点击按钮的便捷性,而不是手动输入 BBCode 标签,所以现在你应该为删除线 BBCode 创建一个新的按钮。
首先,我们可以看看 BBCode 按钮的组成部分。每个按钮做两件事:当点击时,将 BBCode 标签插入到消息体中,当鼠标指针悬停时,在 BBCode 控件和消息区域之间显示一行帮助文本。这些任务的代码大部分在templates/subSilver/posting_body.tpl中,但帮助文本部分设置在language/lang_english/lang_main.php和posting.php中。后两个文件有非常小的更改,所以最容易先编辑它们。
行动时间——添加语言字符串
-
在你的论坛的
language/lang_english/lang_main.php文件中找到以下行。像之前示例中的其他行一样复制它:$lang[‘bbcode_f_help’] = ‘Font size: [size=x-small]small text[/size]’; -
将行中的
bbcode_f_help部分更改为bbcode_st_help。 -
将最后两个单引号之间的文本替换为:
删除线:[s]划过文本[/s] (alt+t)。 -
修改后的行现在看起来是这样的:
$lang[‘bbcode_st_help’] = ‘Strike out: [s]Line through text[/s] (alt+t)’;
发生了什么?
大多数在 phpBB 论坛的公开部分显示的内置文本存储在 language/lang_english/lang_main.php 文件中。此文件是 phpBB 多语言支持的一部分,这也是 phpBB 在全球范围内非常受欢迎的因素之一。所有 BBCode 按钮的帮助文本是你在 lang_main.php 中可以找到的许多事物之一。你刚刚找到并复制的行包含的是字体大小 BBCode 的帮助文本。其他帮助文本行都在这一行之上,而你将新的帮助文本放在了字体大小 BBCode 的下面一行。
注意
论坛上安装的每种语言都有一个 lang_main.php 文件。如果你想在一个非英语语言的文件中找到这一行,搜索该行的 $lang[‘bbcode_f_help’] 部分。
如果你将这一行与其他帮助文本行进行比较,你会注意到一些明显的差异。bbcode_f_help 中的 f 在其他行中被替换成了不同的字母。这一部分是用于稍后引用帮助文本的名称,因此它需要与其他所有名称唯一。已经存在一个名为 bbcode_s_help 的行,所以你不能在这里使用那个字母。相反,我们可以使用字母 st。我们没有必要将自己限制在只有一个字母。每行第二对单引号之间的文本是将在发帖表单上显示的实际文本。现有的任何一行都不适合字体大小 BBCode,所以你可以在新行中重写这段文本。帮助文本内容的唯一限制是它们不能包含单引号或双引号。
我们接下来要查看的下一个文件是 posting.php,它处理论坛发帖的许多方面。目前,我们只关心其中之一:创建发帖表单。表单是通过 phpBB 的语言和模板系统的组合来创建的。我们已经将帮助文本添加到语言系统中,所以现在我们需要将其纳入模板系统。
行动时间——添加模板变量
-
在
posting.php中找到以下行并复制以进行编辑:‘L_BBCODE_F_HELP’ => $lang[‘bbcode_f_help’], -
将
bbcode_f_help替换为bbcode_st_help以匹配你在语言文件中做的更改。 -
将
L_BBCODE_F_HELP中的F修改为匹配的ST。 -
最终包含这些修改的行是:
‘L_BBCODE_ST_HELP’ => $lang[‘bbcode_st_help’],
刚才发生了什么?
在这个最后的例子中,你添加了一个新的模板变量。它将代表字体大小 BBCode 的帮助文本,并将该文本提供给模板系统。phpBB 使用如下类似的行将信息发送到模板系统:
$template->assign_vars(array(
‘L_INFO’ => $l_info,
‘MESSAGE’ => $message,
‘MORE’ => $more)
);
此代码的第一行和最后一行,以及‘MORE’行的关闭括号,对于文件的功能是必需的,所以你应该保留它们。如果你需要在尚未这样做的情况下向模板系统发送数据的文件中添加代码段,你需要在编辑文件时包含这些行。幸运的是,posting.php已经包含了这些行,所以我们继续到其他行,这些行指定了要发送的实际信息。L_INFO行是一个很好的例子。它将变量的值,在这个例子中是$l_info,通过名称L_INFO发送到模板系统。这告诉模板系统,在模板文件中所有{L_INFO}的实例都应该替换为变量的值。{L_INFO}被称为模板变量,因为它被模板系统替换为某个值。L_INFO是模板变量的名称。
注意
这是一个公认的习惯,大多数模板变量及其名称都是全部大写字母、数字或下划线,不包含其他字符。这大多数情况下不是必需的,但你不应在模板变量的名称中使用点。点在模板变量名称中被认为是特殊、保留的字符。
我们需要修改的第三个文件以添加 BBCode 按钮,templates/subSilver/posting_body.tpl,也是最复杂的。在你之前编辑的文件中只需添加一行,但这次有多个更改(其中一些相当尴尬)。这是 phpBB 中未考虑到易于扩展的几个部分之一。关于在此文件中正确添加新 BBCode 按钮的许多观点存在,但大多数都需要替换此文件的大部分内容或先安装另一个修改。
行动时间——添加帖子表单按钮
-
打开
templates/subSilver/posting_body.tpl文件,找到以下行。像往常一样复制它。但是,这次,将复制的行放在现有代码之前。行的顺序并不重要,但它将在本章后面的部分创建一个有用的示例。f_help = "{L_BBCODE_F_HELP}"; -
在复制的那一行中,你应该将模板变量替换为用于 Strike 帮助线的变量。同时删除行首的小写
f,并用st替换它。这是此文件中最简单的更改。结果行将是:st_help = "{L_BBCODE_ST_HELP}"; f_help = "{L_BBCODE_F_HELP}"; -
现在找到以下(相当长)的代码行。根据你的文本编辑器的设置,当显示在屏幕上时,它可能被折行到两行或多行。尽你所能找到整个行。
bbtags = new Array(‘[b]’,’[/b]’,’[i]’,’[/i]’,’[u]’,’[/u]’,’[quote]’,’[/quote]’, ‘[code]’,’[/code]’,’[list]’,’[/list]’,’[list=]’,’[/list]’,’[img]’, ‘[/img]’,’[url]’,’[/url]’); -
在你刚刚找到的
bbtags行之后添加以下行。// Begin further bbtags indexing at 22 to avoid font size/color conflicts. bbtags[22] = ‘[s]’; bbtags[23] = ‘[/s]’; -
修改后的代码现在看起来像:
bbcode = new Array(); bbtags = new Array(‘[b]’,’[/b]’,’[i]’,’[/i]’,’[u]’,’[/u]’,’[quote]’,’[/quote]’,’[code]’,’[/code]’,’[list]’,’[/list]’,’[list=]’,’[/list]’,’[img]’,’[/img]’,’[url]’,’[/url]’); // Begin further bbtags indexing at 22 to avoid font size/color conflicts. bbtags[22] = ‘[s]’; bbtags[23] = ‘[/s]’; imageTag = false; -
在文件中找到并复制以下 HTML 代码:
<td><span class="genmed"> <input type="button" class="button" accesskey="w" name="addbbcode16" value="URL" style="text-decoration: underline; width: 40px" onClick="bbstyle(16)" onMouseOver="helpline(‘w’)" /> </span></td> -
将复制的行修改成以下样子。
<td><span class="genmed"> <input type="button" class="button" accesskey="t" name="addbbcode22" value="Strike" style="text-decoration: line-through; width: 44px" onClick="bbstyle(22)" onMouseOver="helpline(‘st’)" /> </span></td>
发生了什么?
现在,你已经将实际的按钮添加到发帖表单中,并完成了对删除线 BBCode 修改的文件更改。由于这个最后的“行动时间”示例很长,现在需要详细查看这些更改,从长bbtags行之后的添加开始。
那个特定的行是许多作者开始以不同方式修改文件的地方。其中一些替代方案将在稍后进行考察,但现在在这行之后简单添加可以使删除线 BBCode 尽可能简单。使用这种方法有几个优点和缺点,这些将在本章稍后讨论。
在添加了那段代码之后,你继续对这个文件进行最后的修改:添加实际的按钮!你之前所做的与按钮相关的每一个更改都是为了使按钮工作,而不是改变按钮本身。你复制并编辑了 URL 按钮的代码,这是在发帖表单按钮行中的最后一个按钮。这些行是 HTML 代码,中间一行是用于可点击表单按钮的 HTML 代码。
在这里没有必要更改第一行或最后一行。然而,中间一行需要做几个修改,以使其与其他按钮不同。按钮的 HTML 包含几个属性,形式为name="value"对。在你完成时,除了前两个属性button和class之外,所有这些属性都发生了变化。现在让我们详细分析这些更改。
你可能首先注意到的是accesskey属性。访问键是一种允许用户在不实际触摸按钮的情况下“点击”按钮的方法。通过按下定义的访问键的特殊键(在 Windows 上是Alt键,在 Macintosh 系统上是 Apple 键)与字母键的组合,用户可以触发按钮的效果。当你的论坛上的用户在发帖表单中按下Alt+B时,就会插入粗体 BBCode 标签,就像他们点击了该 BBCode 的表单按钮一样。在添加新按钮的过程中,你应该将此属性的值更改为发帖表单上尚未使用的字母或数字。在未经修改的论坛上,“t”是一个很好的选择,因此accesskey="w"被更改为accesskey="t"。
接下来是name属性。它为按钮提供了一个唯一的名称,可以在 JavaScript 代码中引用。这个文件顶部有大量的 JavaScript 代码,它与按钮和消息正文一起添加 BBCodes,跟踪消息中打开的 BBCodes 标签,并更改按钮上显示的文本。name属性的值用于访问按钮,尤其是在更改文本时。当用户点击 BBCodes 按钮插入一个开标签,例如[b],按钮上会添加一个星号以提醒你该标签已打开。这个属性的值对于所有的 BBCodes 按钮都是相似的——addbbcodeXX,其中XX是某个偶数。如果你还记得,我们在之前添加与bbtags行相关的代码时使用了22。这是它第一次发挥作用(这个数字的重要性我们稍后会讨论)。这个按钮的名称必须是addbbcode22,所以name="addbbcode16"被更改为name="addbbcode22"。稍微跳过一点到onClick属性,16再次被替换为22。
第三个属性value是 BBCodes 按钮上显示的文本。由于你正在创建一个删除线 BBCodes,"删除线"似乎是一个合理的显示选择。因此,value="URL"被替换为value="删除线"。
style属性允许你将特定的层叠样式表属性应用到具有该属性的 HTML 元素上。对于 BBCodes 按钮,style通常用于演示 BBCodes 的效果并控制按钮的宽度。你将text-decoration属性从underline更改为line-through,就像你在bbcode.tpl中做的那样。将width属性从40px(四十像素)增加到44px也是推荐的,以确保添加删除线按钮时星号可见。
最后一个属性onMouseOver会触发帮助行文本的显示。完整的属性是onMouseOver="helpline('w')",但在编辑这个属性时需要小心。只有单引号内的w应该被更改。如果你回想一下其他与帮助行相关的更改,你可能记得你经常将字母f替换为st。这是相同的情况,但现在你正在替换一个w。
最后,你已经完成了所有必要的文件编辑,以使用你新的删除线 BBCodes!恭喜你走到了这一步。
删除线 BBCodes 方法的优缺点
如前所述,我们在编辑posting_body.tpl时使用的一些方法有一些优点和缺点。一些更改可以用几种不同的方式完成。为了更好地理解 BBCodes 按钮的工作原理以及为什么有创建 BBCodes 的不同方法,让我们看看一些替代方案。
在创建类似删除这样的 BBCode 修改时,许多作者会要求首先在论坛上安装另一个修改,即多 BBCode MOD。这个修改替换并扩展了 posting_body.tpl 和其他文件中的大部分 BBCode 系统,目的是使额外的 BBCode 更容易安装。实际上,如果作者希望在 phpBB 的官方网站上分发 BBCode 修改,那么这个修改必须依赖于多 BBCode MOD。你刚才完成的过程的一个缺点是它是独立于多 BBCode 设计的。因此,产生的修改可能与其他修改不兼容。
你所学的另一种可能的方法集中在文件顶部的 bbtags 代码附近。在这段代码之后,你添加了两行新代码,但长期以来,有一种非常不同的方法被视为编辑这个区域的标准方式。这种方法要求在那一行内编辑 bbtags 代码。通过这种类型的修改,bbtags 行将被删除 BBCode 改变为以下内容:
bbtags = new Array(‘[b]’,’[/b]’,’[i]’,’[/i]’,’[u]’,’[/u]’,’[quote]’,’[/quote]’,’[code]’,’[/code]’,’[list]’,’[/list]’,’[list=]’,’[/list]’,’[img]’,’[/img]’,’[url]’,’[/url]’,’[s]’,’[/s]’);
代码行 bbtags 创建了一个数组,或者说是数据堆栈,包含了所有可能的 BBCode 标签——除了大小和颜色标签——以及它们的闭合标签对应项,按照行上列出的顺序编号。编号从 0 开始;[b] 将是编号 0,[/b] 将是编号 1,以此类推。在此次方案中,删除 BBCode 的 [s] 变成了编号 18。
然而,这会产生一个问题。记住你使用 addbbcode22 作为 HTML 中删除按钮的 name 属性值吗?使用刚才描述的方法,你需要使用 addbbcode18。如果你在 posting_body.tpl 中搜索,你会找到 addbbcode18 已经被用于字体颜色下拉列表的名称,而 addbbcode20 同样被用于字体大小。由于 name 的值必须是唯一的,直接编辑 bbtags 行迫使你也要更改字体颜色和大小列表的 name 属性。如果你添加了多个 BBCode,这将是一项相当多的重复工作。
当你在 bbtags 行之后添加 [s] 和 [/s] 的新行时,新行将删除标签分配给编号 22 和 23。本质上,你跳过了编号 18 到 21,这些编号被大小和颜色 BBCode 使用。
这消除了编辑大小和颜色 HTML 的需要。如果你想要使用本章中介绍的方法添加新的 BBCode,你的代码可能看起来像这个示例。注意每一行上的数字是如何递增的。
bbtags[22] = ‘[s]’;
bbtags[23] = ‘[/s]’;
bbtags[24] = ‘[flash]’;
bbtags[25] = ‘[/flash]’;
bbtags[26] = ‘[hide]’;
bbtags[27] = ‘[/hide]’;
第 5 步——拆分并修复
在完成您的第一个修改的更改后,下一步是测试您的更改。在测试过程中,尽可能做一切可能导致修改出现问题的操作。任何出现的问题都需要在其他人发现之前修复。缺乏适当的测试可能非常危险,在某些情况下可能会在您的论坛中创建新的安全漏洞。
尝试测试 Strike BBCode 的每个方面。尝试创建一个新主题,预览帖子,甚至回复和编辑包含 BBCode 的帖子。检查发布表单的每个方面,从按钮到帮助行。如果您在论坛上安装了多个风格,请确保您已经编辑了每个风格的模板文件,并在所有风格上测试 BBCode 和按钮。当存在多种语言时,也要进行测试!
您不应该在 Strike BBCode 中遇到任何问题,因为它是一个非常简单的修改。然而,即使是简单的修改也需要彻底的测试。有很多地方,缺少一个逗号就可能导致论坛的部分内容无法访问。
让您的 MOD 面向全球
一旦您创建了一个修改,您可能希望将其分发给其他 phpBB 论坛运营商。许多修改的作者将其免费提供给全球 phpBB 社区,作为一种回馈。当然,并非所有修改都是免费的,但那些免费的通常可以在几个网站上找到,甚至可能被翻译成其他语言。
您可以通过几种方式分发一个修改。您可能需要写一篇论文或教程,描述安装时所做的更改,这可能与本章前面的页面类似。最广泛使用的方法是创建一个安装文件,它使用简单的说明,就像在第四章(ch04.html "第四章。自定义您的论坛")中讨论修改安装的部分所解释的那样,引导用户完成更改。
您也可以选择将修改内容发布在一个或多个网站上。多个修改的作者通常有自己的网站,专门用于展示他们的作品,通常还配备有 phpBB 驱动的论坛,提供支持和演示。一些更通用的网站也提供了 phpBB 的修改。拥有最大修改社区的网站是www.phpbb.com/,即官方 phpBB 网站,以及www.phpbbhacks.com/,这是最大的修改网站。还有其他提供修改的网站,您可以使用它们来分发您的作品,其中许多基于非英语语言。
这些大型网站中的每一个都有自己的规则,关于如何在网站上分发修改版。phpBB.com 有非常严格的规则,而 phpBBHacks.com 则相对宽松。这两个网站都有开发区域论坛,可用于创建和测试修改版,但并不专门用于分发任何作品。这两个网站都有一个用于此目的的修改版数据库。
phpBB.com 的修改版数据库可以在其MOD部分找到。要包含在这个数据库中,修改版必须通过一个特殊表单提交,并且必须通过一系列特殊的验证程序。验证过程测试下载的几个方面。如果修改版在任何这些测试中失败,这些测试由 phpBB.com 的“MOD 团队”进行,它将被拒绝包含在网站上。作者通常会被告知拒绝的原因,并允许在做出任何必要更改后重新提交作品。相比之下,phpBBHacks.com 允许作者在这些领域有更多的自由,规则要宽松得多。作者在通过简单表单提交修改版之前,预计会广泛测试修改版。
注意
您可以通过帖子www.phpbb.com/phpBB/viewtopic.php?t=160827找到所有 phpBB.com 修改版提交要求的相关链接。验证程序也在该论坛的帖子中描述。
一旦您决定在哪里分发您的修改版,请在该网站上查找其具体的规则和提交程序。在任何给定网站上分发修改版的过程通常包括以下步骤:
-
创建代码,包括任何 PHP、HTML 等等。
-
将该代码组装成一个打包集合(下一节将详细介绍)。
-
如果该网站有一个修改版开发论坛,请在那里创建一个关于修改版的主题。其他用户可能会尝试它,并给您反馈、错误报告或其他建议。
-
根据反馈、错误报告等对代码进行任何您想要的修订,然后重复步骤 1-4,直到您满意地认为修改版已经完全完成。
-
通过网站提供的程序提交修改版。
打包您的 MOD
在将您的修改版发布到任何地方之前,首先需要将其收集成一组文件。这个过程是将您的修改版准备用于分发的过程,称为打包。这通常包括创建指令文件,并将其与为修改版创建的任何新论坛文件一起放入一个单独的 ZIP 文件中。非常大的修改版通常还包括其他文件,例如升级说明、技巧或提示列表,以及修改后的原始 phpBB 文件副本,这些文件也放入这个 ZIP 文件中。
为了在 phpBB.com 分发修改,必须使用该网站提供的特殊 "MOD 模板" 创建指令文件。此模板由三个部分组成:一个标题,一个包含几个空白命令的列表,以及一个包含结束命令的页脚。每个部分都是必需的;即使省略其中任何一个,也会导致修改提交被拒绝。phpBBHacks.com 接受使用此模板或其他模板创建的修改,包括没有任何模板的情况,只要指令是可理解的。如果使用模板,则特定部分也不必要求。存在一个官方的 phpBBHacks.com 模板,但使用它是可选的。然而,phpBB.com 只接受使用其自己的模板创建的修改。
在本章前面创建的 Strike BBCode 修改无法在 phpBB.com 提交,因为它不依赖于所有列出的 BBCode 修改所需的 Multi BBCode 修改。同样,phpBBHacks.com 也不会接受它,因为 Strike 不是你的原创作品。然而,为这个修改创建指令文件仍然是学习如何使用 MOD 模板以制作可以提交给 phpBB.com 和其他网站的安装文件的好方法。
使用 MOD 模板标题
首先,创建一个新的文本文件。在大多数 Windows 文本编辑器中,这涉及到打开 文件 菜单并选择 新建 | 新建文本文件 或类似选项。将你的新文件命名为 strike.mod。你可能熟悉的多数文本文件使用 txt 文件扩展名,结果文件名可能像 strike.txt。然而,phpBB.com 要求修改指令文件使用 .mod 文件扩展名,这也是音乐文件广泛使用的扩展名之一。
接下来,在你的文件中输入以下行,或者从 phpBB.com MOD 模板中复制并粘贴它们。这些行构成了整个 MOD 模板标题。如果你手动输入,请确保与 MOD 模板的语法、拼写和间距完全匹配(在印刷书中,文本看起来是换行的)。即使你认为它们是错误的,更改这些方面的任何一项也会导致修改被拒绝。
##############################################################
## MOD Title: mod_title_goes_here
## MOD Author: your_phpBB_username < your_email > (your_real_name) your_url
## MOD Description: some_description_goes_here
## MOD Version: x.x.x
##
## Installation Level: (Easy/Intermediate/Advanced)
## Installation Time: x Minutes
## Files To Edit: file_1, file_2, file_3, etc
## Included Files: (n/a, or list of included/required files)
##############################################################
## For Security Purposes, Please Check: http://www.phpbb.com/mods/ for the
## latest version of this MOD. Downloading this MOD from other sites could cause malicious code
## to enter into your phpBB Forum. As such, phpBB will not offer support for MOD’s not offered
## in our MOD-Database, located at: http://www.phpbb.com/mods/
##############################################################
## Author Notes:
##
##############################################################
## MOD History:
##
## YYYY-MM-DD - Version x.x.x
## - version notes go here
##
##############################################################
## Before Adding This MOD To Your Forum, You Should Back Up All Files Related To This MOD
##############################################################
这些行中的几行需要为每个修改进行编辑。让我们逐个来看,从顶部开始,逐行向下。标题本身是通过一些完全由 # 字符组成的行组织成更小的部分。这些分隔符应保持原样。
MOD 标题
需要更改的第一行是 MOD 标题 行。正如你可能猜到的,这就是你将放置所有修改名称以便大家都能看到的地方。
## MOD Title: mod_title_goes_here
文本 mod_title_goes_here 应该替换为正确的名称。在这种情况下,你将输入 Strike BBCode。
MOD 作者
接下来是 MOD 作者 行,其中列出修改的创建者。也可以在此处包含联系信息。
## MOD Author: your_phpBB_username < your_email > (your_real_name) your_url
这行本身有四个子部分需要修改。第一个是your_phpBB_username,需要替换为在 phpBB.com 社区论坛上注册的账户的用户名。该账户稍后将被用来提交修改。第二个是< your_email >部分,这是一个用于你的电子邮件地址的占位符。这里的箭头括号不应被移除,因此最终版本将类似于< jon@doe.com >。接下来是一个用于你的给定名字的位置,在(your_real_name)中。同样,括号(这次是括号)应保留在原位。最后但同样重要的是your_url,这是一个可能包含修改演示的网站地址的位置。只有论坛用户名条目是必需的。如果你不希望输入你的电子邮件地址、真实姓名或网站地址,可以在这些部分输入N/A代替。但是,请确保包括括号。这行的最终版本可能是:
## MOD Author: MyAccount < jon@doe.com > (N/A) N/A
MOD 描述
你应该编辑的第三行是MOD 描述。这是一条相当简单的行。
## MOD Description: some_description_goes_here
应将some_description_goes_here文本替换为一到两句话,简要描述修改的目的。这里可以使用的例子是在帖子中添加删除线 BBCode。
MOD 版本
在MOD 版本行的x.x.x中,你可以提供一个三部分数字,描述这个特定的修改版本。如果由于某种原因需要发布多个版本,这个数字对于每个版本都是不同的。
## MOD Version: x.x.x
第一个数字代表一个稳定发布号,第二个代表一个次要增加号,第三个代表一个简单的修改号。版本号为 1.2.0 的修改已经经历了一个稳定发布,随后是两个添加新功能的发布。当看到版本号如 2.3.4 时,这表明有两个稳定发布,三个添加新功能的发布,最后是四个包含小更改(如小错误修复)的发布。提交给 phpBB.com 的修改的第一个版本号通常是 1.0.0。任何以小于一的数字开头的都是测试版或预览版。测试版和预览版是预览发布,可能包含错误、错误或其他问题。在实时论坛上使用测试版或预览版可能不是一个好主意。
安装级别
安装级别用一句话描述安装修改的难度。(简单/中级/高级)将替换为这些词中的一个:简单、中级或高级。
## Installation Level: (Easy/Intermediate/Advanced)
删除线 BBCode 的安装相当简单。一般来说,安装文件越长,修改的安装级别就越高。
安装时间
就像上一行一样,安装时间 处理安装修改的难度。这次你应该用代表可能需要安装修改的大约分钟的数字替换 x。
## Installation Time: x Minutes
对于 Strike BBCode,5 是一个公平的,尽管略高的数字。当不确定时,尽量高估这个数字。理想情况下,你应该在论坛上安装修改时计时,以了解所需的时间。
要编辑的文件
Files to Edit 行列出了修改所编辑的每个 phpBB 文件。你可能还记得编辑了五个文件用于 Strike BBCode:posting.php, language/lang_english/lang_main.php, includes/bbcode.php, templates/subSilver/bbcode.tpl,以及 templates/subSilver/posting_body.tpl。所有这些文件都会在这里列出,用逗号分隔。由于这是一个相当长的列表,它通常会分成多行在文件中。每一行必须以 ## 开头,就像所有其他标题行一样。
## Files To Edit: file_1, file_2, file_3, etc
包含的文件
标题上部分的最后一行提供了修改中包含的所有新论坛文件的列表。当没有新文件时,例如在 Strike BBCode 中,将括号内的文本替换为简单的 n/a,代表不适用。
## Included Files: (n/a, or list of included/required files)
phpBB.com 的安全通知
标题的下一部分包括由 phpBB.com 创建的安全通知。这个通知必须出现在提交给 phpBB.com 的所有修改中,并且不应以任何方式更改。即使是微小的变化,比如改变大小写或行长度,也会导致提交被拒绝。
## For Security Purposes, Please Check: http://www.phpbb.com/mods/ for the
## latest version of this MOD. Downloading this MOD from other sites could cause malicious code
## to enter into your phpBB Forum. As such, phpBB will not offer support for MOD’s not offered
## in our MOD-Database, located at: http://www.phpbb.com/mods/
注意
无论安全通知可能或可能没有暗示什么,使用来自其他网站上的修改并不一定会将故意有害的代码放入你的论坛。这种情况可能发生,但很少见。因为安装任何你未创建的软件都存在风险,所以除非你知道它做什么以及可能带来什么问题,否则你永远不应该在你的网站上安装 任何代码。即使在 phpBB 的早期版本中也发现了安全漏洞,但这类问题很少是故意的。
作者备注
在安全通知下面的分隔符之后是 Author Notes 部分。在这个区域,你可以添加与使用或安装修改相关的额外说明或警告。例如,你可能需要比 MOD Description 行更详细地解释修改做了什么。这也是提到安装后任务的好地方,比如更改在 管理控制面板 中找到或添加的设置。
在作者说明部分中,有一些事情您不应该包含。其中之一是其他网站上可以找到修改的地址、联系方式、许可信息以及可以通过动作命令(您将在下面看到)涵盖的安装说明。在作者说明中放置这些看似无害的任何一项都可能导致修改在验证过程中失败。phpBB.com 的管理员对在其网站上放置的链接有问题;这也反映在他们不允许大多数此类链接的论坛规则和安全通知中。此模板允许的唯一联系方式必须放在MOD 作者行上。在 phpBB.com 上发布的所有修改都必须在 phpBB 本身所属的 GNU 通用公共许可证下发布。phpBB 中包含此许可证的副本,但不要在本节中提及它。
在作者说明之后,提供了一个区域来描述修改的每个版本。MOD 历史是每个版本的列表,包括以年-月-日格式的日期以及版本号。版本条目应提供从一个版本到另一个版本所做的更改的简要描述。对于修改的第一个版本,通常可以看到一行写着“初始版本”、“首次发布”或类似的简短声明。
MOD 模板的标题以另一个不应编辑的部分结束;这个部分是给修改用户的快速提醒,指出他们应该备份文件。带有所有您迄今为止所做的更改的 Strike BBCode 的完整标题应该类似于本段之后的示例。这也是保存您文件的好时机。定期保存您的作品以确保您不会因为意外或更糟糕的停电而丢失您所做的一切:
##############################################################
## MOD Title: Strike BBCode
## MOD Author: MyAccount < jon@doe.com > (N/A) N/A
## MOD Description: Adds a strike out BBCode to posting.
## MOD Version: 1.0.0
##
## Installation Level: Easy
## Installation Time: 5 Minutes
## Files To Edit: posting.php, includes/bbcode.php,
## language/lang_english/lang_main.php,
## templates/subSilver/bbcode.tpl,
## templates/subSilver/posting_body.tpl
## Included Files: n/a
##############################################################
## For Security Purposes, Please Check: http://www.phpbb.com/mods/ for the
## latest version of this MOD. Downloading this MOD from other sites could cause malicious code
## to enter into your phpBB Forum. As such, phpBB will not offer support for MOD’s not offered
## in our MOD-Database, located at: http://www.phpbb.com/mods/
##############################################################
## Author Notes:
##
## Once this modification is installed on your forum, users can include
## a strike out BBCode in their posts. The format of the BBCode is:
## [s]This text will have a line through it.[/s]
## A button is also added to the posting form.
##
##############################################################
## MOD History:
##
## 2004-12-06 - Version 1.0.0
## - Initial version.
##
##############################################################
## Before Adding This MOD To Your Forum, You Should Back Up All Files Related To This MOD
##############################################################
创建动作列表
根据 MOD 模板的定义,您修改说明文件的第二大部分是一个动作列表。动作是用于安装修改所需更改的命令。每个动作都通过一个标题后跟一个文件名、一行或多行代码或其他信息来展示。动作标题看起来像以下示例,其中文本ACTION NAME将被实际命令的名称所替换。
#
#-----[ ACTION NAME ]------------------------------------------
#
请参考第四章中“最后操作”部分下的表格,以获取常用操作及其简要描述列表。phpBB.com 允许使用仅十二个特定的命令,所有这些命令都在该表中列出。表末尾的添加 SQL 操作不允许用于 phpBB.com 的提交;您需要使用 SQL 操作。操作通常应按照表中列出的顺序使用。如果需要,复制操作和 SQL 操作应首先使用,然后是打开操作,接着是查找、添加和内联操作的组合。
要为您的指令文件创建一个针对 Strike BBCode 的操作列表,回顾您在创建修改时采取的步骤。由于没有添加新文件,因此您不需要复制操作。同样,您也没有进行任何数据库更改。这将使这些说明中的 SQL 操作变得不必要。您编辑了五个文件,因此您需要为每个文件提供一个匹配的打开操作。
打开操作
每个打开操作的开头应跟一个单独的行,命名要准备编辑的文件。始终包括相对于主 phpBB 目录的完整路径,并带有此名称。打开操作和复制操作中的文件路径不应以 root/、phpBB2/ 或甚至简单的斜杠 / 开头。
这是第一个文件的正确打开操作:
#
#-----[ OPEN ]------------------------------------------
#
includes/bbcode.php
注意
您不需要按照任何特定的顺序列出要编辑的文件,但请记住,打开操作总是紧随查找操作之后,然后才是其他操作。
查找操作
在打开那个文件之后,您所做的第二件事是在其中找到一些代码。您应该通过在查找操作中包含该代码来指导您的修改用户这样做。这是 Strike BBCode 的第一个查找操作:
#
#-----[ FIND ]------------------------------------------
#
// [u] and [/u] for underlining text.
$text = str_replace("[u:$uid]", $bbcode_tpl[‘u_open’], $text);
$text = str_replace("[/u:$uid]", $bbcode_tpl[‘u_close’], $text);
添加操作
找到该代码后,它被复制并修改以满足我们的需求。该过程中涉及了几个步骤,但您不需要在这些说明中描述其每个方面。相反,您只需提供最终代码,并告诉用户将其放置在查找操作中的相对位置。新代码被放置在您找到的代码之后,因此这里需要一个“之后,添加”操作。如果您在现有行之前插入新代码,那么一个“之前,添加”操作将是合适的。当在相同位置删除旧代码并放置新代码时,请使用“替换为”操作。
#
#-----[ AFTER, ADD ]------------------------------------------
#
// ------------------------------------------------
// Strike BBCode - Begin Code Addition
// [s] and [/s] for strike out text.
$text = str_replace("[s:$uid]", $bbcode_tpl[‘s_open’], $text);
$text = str_replace("[/s:$uid]", $bbcode_tpl[‘s_close’], $text);
// Strike BBCode - End Code Addition
// ------------------------------------------------
你可能会注意到,在“After,添加”动作示例中包含了一些你未放入includes/bbcode.php中的注释行。这些行标记了修改添加的代码的开始和结束。尽管这些行在你的修改中不是必需的,但尽可能添加它们作为一种对最终用户的礼貌。如果以后有必要删除或升级你的修改,用户将能够使用这些行来快速定位修改的代码。你可以以任何你喜欢的格式来格式化这些行;这里使用的格式只是基于作者个人风格的一个示例。
为你对此文件所做的其他更改创建一组查找和“After,添加”动作。这个过程与你刚刚完成的过程相同,并将完成bbcode.php的动作。结果对应该类似于以下代码:
#
#-----[ FIND ]------------------------------------------
#
// [u] and [/u] for underlining text.
$text = preg_replace("#\u\\[/u\]#si", "[u:$uid]\\1[/u:$uid]", $text);
#
#-----[ AFTER, ADD ]------------------------------------------
#
// ------------------------------------------------
// Strike BBCode - Begin Code Addition
// [s] and [/s] for strike out text.
$text = preg_replace("#\s\\[/s\]#si", "[s:$uid]\\1[/s:$uid]", $text);
// Strike BBCode - End Code Addition
// ------------------------------------------------
额外的打开、查找和添加动作示例
我们编辑了你的模板中的bbcode.tpl文件;下一步是为它创建一个打开动作。这里出现了一个问题:你需要包含文件的路径,这会提到一个模板目录,如subSilver。假设某人论坛上没有subSilver,而只有其他不同名称的模板。这会阻止他们使用你的修改吗?你应该为每个模板列出说明吗?
两个问题的答案都是响亮的“不”。任何人都可以在任何模板上使用这个修改,尽管如果模板文件的内容与 subSilver 完全不同,他们可能需要稍微即兴发挥一下。你无法预测任何论坛上安装了哪些模板,而且有数百种模板可供选择(不包括为单个网站制作的私有模板!)为多个模板添加说明是不切实际的,而且麻烦大于其价值。解决这个问题的方法是始终基于默认安装在所有原始 phpBB 2.0 论坛上的 subSilver 模板文件来修改和编写它们的说明。如果你想让你的修改出现在 phpBB.com 上,这也同样是必需的。
因此,考虑到所有这些,bbcode.tpl的打开动作将是:
#
#-----[ OPEN ]------------------------------------------
#
templates/subSilver/bbcode.tpl
你可以再次为对此文件的更改创建一个查找和“After,添加”指令组合。要记住的一个重要事情是,你不能在此文件中包含标记新代码的注释行。这样做会导致论坛显示一个解析错误,这意味着文件或代码部分存在语法错误。此文件的一组最终命令可能如下所示。
#
#-----[ FIND ]------------------------------------------
#
<!-- BEGIN u_open --><span style="text-decoration: underline"><!-- END u_open -->
<!-- BEGIN u_close --></span><!-- END u_close -->
#
#-----[ AFTER, ADD ]------------------------------------------
#
<!-- BEGIN s_open --><span style="text-decoration: line-through"><!-- END s_open -->
<!-- BEGIN s_close --></span><!-- END s_close -->
在文件修改列表中的下一个是 language/lang_english/lang_main.php 文件。与模板文件路径的问题类似,语言文件也存在类似的问题。非英语语言的文件将具有不同的文件路径,例如 language/lang_dutch 或 language/lang_french。对于这种情况,解决方案也是相同的:使用默认安装的论坛上的文件和文件路径,即英语语言。通常允许在指令中包含其他语言,但如果你想在 phpBB.com 的数据库中列出你的工作,则必须使用默认设置。
这个文件的其它动作是标准的单一 Find 和一个 After, Add 动作组合。结合 Open 动作,该文件的完整指令如下:
#
#-----[ OPEN ]------------------------------------------
#
language/lang_english/lang_main.php
#
#-----[ FIND ]------------------------------------------
#
$lang[‘bbcode_f_help’] = ‘Font size: [size=x-small]small text[/size]’;
#
#-----[ AFTER, ADD ]------------------------------------------
#
// ------------------------------------------------
// Strike BBCode - Begin Code Addition
$lang[‘bbcode_st_help’] = ‘Strike out: [s]Line through text[/s] (alt+t)’;
// Strike BBCode - End Code Addition
// ------------------------------------------------
继续前进,下一个编辑的 Strike BBCode 文件是 posting.php——又一个 Open, Find, 和 After, Add 的序列:
#
#-----[ OPEN ]------------------------------------------
#
posting.php
#
#-----[ FIND ]------------------------------------------
#
‘L_BBCODE_F_HELP’ => $lang[‘bbcode_f_help’],
#
#-----[ AFTER, ADD ]------------------------------------------
#
// ------------------------------------------------
// Strike BBCode - Begin Code Addition
‘L_BBCODE_ST_HELP’ => $lang[‘bbcode_st_help’],
// Strike BBCode - End Code Addition
// ------------------------------------------------
最后但同样重要的是,posting_body.tpl 的编辑与其他修改相比相当广泛。由于这是一个模板文件,记得在 Open 动作中使用子 Silver 模板文件的路径。
#
#-----[ OPEN ]------------------------------------------
#
templates/subSilver/posting_body.tpl
你还记得有一次你复制了代码,但是把它添加在了现有行之前而不是之后吗?在创建指令文件的这个步骤中,将这个添加到复制的行之前的原因是为了创建一个使用 Before, Add 动作而不是 After, Add 动作的示例。就指令中的外观而言,唯一的真正区别是 AFTER 被替换成了 BEFORE。
#
#-----[ FIND ]------------------------------------------
#
f_help = "{L_BBCODE_F_HELP}";
#
#-----[ BEFORE, ADD ]------------------------------------------
#
// ------------------------------------------------
// Strike BBCode - Begin Code Addition
st_help = ‘{L_BBCODE_ST_HELP}’;
// Strike BBCode - End Code Addition
// ------------------------------------------------
现在你已经有了另一个基本的 Find 和 After, Add 动作组合,用于你在这个文件中进行的下一个修改。
#
#-----[ FIND ]------------------------------------------
#
bbtags = new Array(‘[b]’,’[/b]’,’[i]’,’[/i]’,’[u]’,’[/u]’,’[quote]’,’[/quote]’,’[code]’,’[/code]’,’[list]’,’[/list]’,’[list=]’,’[/list]’,’[img]’,’[/img]’,’[url]’,’[/url]’);
#
#-----[ AFTER, ADD ]------------------------------------------
#
// ------------------------------------------------
// Strike BBCode - Begin Code Addition
bbtags[22] = ‘[s]’;
bbtags[23] = ‘[/s]’;
// Strike BBCode - End Code Addition
// ------------------------------------------------
最后一步的动作仍然是 Find 和 After, Add。正如你可能已经注意到的,这个组合是修改指令中最常用的。在这一轮中,程序是相同的,但请注意,After, Add 指令中的注释行非常不同。
#
#-----[ FIND ]------------------------------------------
#
<td><span class="genmed">
<input type="button" class="button" accesskey="w" name="addbbcode16" value="URL" style="text-decoration: underline; width: 40px" onClick="bbstyle(16)" onMouseOver="helpline(‘w’)" />
</span></td>
#
#-----[ AFTER, ADD ]------------------------------------------
#
<!-- Strike BBCode - Begin Code Addition -->
<td><span class="genmed">
<input type="button" class="button" accesskey="t" name="addbbcode22" value="Strike" style="text-decoration: line-through; width: 44px" onClick="bbstyle(22)" onMouseOver="helpline(‘st’)" />
</span></td>
<!-- Strike BBCode - End Code Addition -->
之前,添加带有注释行的代码片段是 PHP 的行,或者在这个文件更早的部分是 JavaScript 代码。这次你添加的是 HTML 代码。PHP 和 JavaScript 的注释行语法相似:在双斜杠 // 之后的内容是注释。然而,HTML 注释以 <!-- 开头,以 --> 结尾。如果你使用的是 PHP 风格的注释,比如 // Strike BBCode Begin Code Addition,在这里它会在发布页面上以纯文本形式显示。
注意
你可能会想在使用 bbcode.tpl 时使用 HTML 风格的注释。遗憾的是,在这个文件中不允许这样做,因为 HTML 注释被 phpBB 用于解析文件本身。此外,在其他模板文件中避免使用以 <!-- BEGIN 或 <!-- END 开头的 HTML 注释。phpBB 会认为这些是特殊的模板开关,通常会报告解析错误。
这就结束了这个特定修改的动作列表。不要忘记保存你到目前为止完成的内容!
使用其他动作
虽然打击 BBCode 只使用了少数几个动作——打开;查找;之后,添加;和之前,添加——但在创建您自己的原始修改时,您可能需要使用其他几个动作。考虑到这一点,以下是一些其他动作的示例。
复制文件——复制动作
当您的修改包含新文件时,您的命令列表中应该首先出现的是复制动作。复制动作表示用户应将新文件上传到他们的论坛,并说明这些文件的位置。在动作标题之后,您应该包括一行提到每个文件,包括在修改从单个文件解压缩时可能包含的任何文件夹,以及相对于论坛主目录的路径。您将在本章后面学习如何在压缩文件内部放置文件夹中的文件。在复制动作中,您可以使用一些特殊的快捷方式,因此现在是查看一个示例动作的好时机。
#
#-----[ COPY ]------------------------------------------
#
my_new_file.php to my_new_file.php
my_functions.php to includes/my_functions.php
new_tpls/new_file.tpl to templates/subSilver/new_file.tpl
language/lang_english/*.* to language/lang_english/*.*
包含在修改中的文件列在左侧,然后使用单词 to 作为分隔符,后面跟着文件在论坛结构中的正确位置。文件的第一行含义相当简单:将 my_new_file.php 文件复制到论坛的主目录(包含 viewtopic.php 和 posting.php 等文件的目录)。在第二行,您告诉用户将 my_functions.php 的远程副本放置在他们的论坛 includes/ 目录中。在第三行,您可以看到正在复制的文件位于名为 new_tpls 的文件夹中。在最后一行的目录名称之后,*.* 快捷方式表示用户将复制该目录中的所有文件。您还可以使用类似 *.php 或 *.tpl 的快捷方式来表示具有特定扩展名的所有文件。
修改数据库——SQL 动作
为了对论坛的 SQL 数据库进行更改或添加,请使用 SQL 动作。始终将 SQL 动作放在您的动作列表的顶部附近;它应该是用户完成的第一或第二个动作。此动作的标题后面跟着一个或多个 SQL 查询。请确保您使用的查询结构正确且有效;它们需要按所示精确工作。请注意,大多数 SQL 动作将使用为 MySQL 数据库创建的查询,但这不是必需的。一个创建简单数据库表的 SQL 动作示例可能是:
#
#-----[ SQL ]------------------------------------------
#
CREATE TABLE phpbb_newtable (
newtable_id int(8) NOT NULL default ‘0’,
newtable_item varchar(255) NOT NULL default ‘’,
PRIMARY KEY (newtable_id)
);
替换代码——替换动作
有时您需要修改现有代码行而不是在它之前或之后添加内容。替换动作在这种情况下可能很有用。像之前,添加和之后,添加动作一样,替换动作将始终跟随查找动作。如果您可以使用注释行,那么在替换动作中包含被替换行的注释副本也是一个好主意。这种做法将使用户在稍后如果另一个修改在查找动作中使用它时更容易找到代码。
假设你想要用 Strike BBCode 替换下划线 BBCode,而不仅仅是添加后者。在这种情况下,你可能有一系列这样的操作:
#
#-----[ FIND ]------------------------------------------
#
// [u] and [/u] for underlining text.
$text = preg_replace("#\u\\[/u\]#si", "[u:$uid]\\1[/u:$uid]", $text);
#
#-----[ REPLACE WITH ]------------------------------------------
#
/* Original phpBB Code removed by Strike BBCode.
// [u] and [/u] for underlining text.
$text = preg_replace("#\u\\[/u\]#si", "[u:$uid]\\1[/u:$uid]", $text);
*/
// ------------------------------------------------
// Strike BBCode - Begin Code Addition
// [s] and [/s] for strike out text.
$text = preg_replace("#\s\\[/s\]#si", "[s:$uid]\\1[/s:$uid]", $text);
// Strike BBCode - End Code Addition
// ------------------------------------------------
修改行的一部分——内联操作
你还记得在你创建 Strike BBCode 之后讨论的编辑posting_body.tpl的替代方法吗?其中一些是使用内联操作的好例子:内联查找;内联之后,添加;内联之前,添加;以及内联替换。内联操作的使用与它们的简短名称相同,唯一的区别是它们总是在单行代码内部操作。通常在使用这些操作时,你应该从一个正常的查找操作开始,然后是内联查找,然后是一个或多个剩余的内联操作。通常你会有一个如查找、内联查找,最后是内联之后,添加的序列。这个序列将用于在bbtags代码行中添加[s]和[/s]的删除线标签。
#
#-----[ FIND ]------------------------------------------
#
bbtags = new Array(‘[b]’,’[/b]’,’[i]’,’[/i]’,’[u]’,’[/u]’,’[quote]’,’[/quote]’,’[code]’,’[/code]’,’[list]’,’[/list]’,’[list=]’,’[/list]’,’[img]’,’[/img]’,’[url]’,’[/url]’);
#
#-----[ IN-LINE FIND ]------------------------------------------
#
‘[/url]’
#
#-----[ IN-LINE AFTER, ADD ]------------------------------------------
#
,’[s]’,’[/s]’
添加 MOD 模板页脚
要完成修改的指令文件,你需要添加 MOD 模板的页脚。术语“页脚”有点误导;你实际上是在文件的底部放置最后一个操作。提交给 phpBB.com 的所有修改都必须以这个操作结束,而且这种变化的变体通常也见于大多数其他修改的末尾。这个操作在第四章中有解释。
#
#-----[ SAVE/CLOSE ALL FILES ]------------------------------------------
#
# EoM
注意
EoM是短语“End of MOD”或“End of Modification”的缩写。一些作者在提交给除 phpBB.com 以外的网站时,使用End或其他标签代替EoM。
完成的指令文件
在编译了完整的标题、操作列表和页脚后,你就完成了 Strike BBCode 的指令文件。如果你想要将自己的指令文件与一个工作示例进行比较,这里有一个样本指令文件(在书中以文本换行形式呈现)。如果你想要比较自己的指令文件与一个工作示例(此文件也已包含在代码下载中,作为1132_07_strike.txt)。
##############################################################
## MOD Title: Strike BBCode
## MOD Author: Thoul < thoul@users.sourceforge.net > (Jeremy Rogers) http://darkmods.sourceforge.net
## MOD Description: Adds a strike out BBCode to posting.
## MOD Version: 1.0.0
##
## Installation Level: Easy
## Installation Time: 5 Minutes
## Files To Edit: posting.php, includes/bbcode.php,
## language/lang_english/lang_main.php,
## templates/subSilver/bbcode.tpl,
## templates/subSilver/posting_body.tpl
## Included Files: n/a
##############################################################
## For Security Purposes, Please Check: http://www.phpbb.com/mods/ for the
## latest version of this MOD. Downloading this MOD from other sites could cause malicious code
## to enter into your phpBB Forum. As such, phpBB will not offer support for MOD’s not offered
## in our MOD-Database, located at: http://www.phpbb.com/mods/
##############################################################
## Author Notes:
##
## Once this modification is installed on your forum, users can include
## a strike out BBCode in their posts. The format of the BBCode is:
## [s]This text will have a line through it.[/s]
## A button is also added to the posting form.
##
##############################################################
## MOD History:
##
## 2004-12-06 - Version 1.0.0
## - Initial version.
##
##############################################################
## Before Adding This MOD To Your Forum, You Should Back Up All Files Related To This MOD
##############################################################
#
#-----[ OPEN ]------------------------------------------
#
includes/bbcode.php
#
#-----[ FIND ]------------------------------------------
#
// [u] and [/u] for underlining text.
$text = str_replace("[u:$uid]", $bbcode_tpl[‘u_open’], $text);
$text = str_replace("[/u:$uid]", $bbcode_tpl[‘u_close’], $text);
#
#-----[ AFTER, ADD ]------------------------------------------
#
// ------------------------------------------------
// Strike BBCode - Begin Code Addition
// [s] and [/s] for strike out text.
$text = str_replace("[s:$uid]", $bbcode_tpl[‘s_open’], $text);
$text = str_replace("[/s:$uid]", $bbcode_tpl[‘s_close’], $text);
// Strike BBCode - End Code Addition
// ------------------------------------------------
#
#-----[ FIND ]------------------------------------------
#
// [u] and [/u] for underlining text.
$text = preg_replace("#\u\\[/u\]#si", "[u:$uid]\\1[/u:$uid]", $text);
#
#-----[ AFTER, ADD ]------------------------------------------
#
// ------------------------------------------------
// Strike BBCode - Begin Code Addition
// [s] and [/s] for strike out text.
$text = preg_replace("#\s\\[/s\]#si", "[s:$uid]\\1[/s:$uid]", $text);
// Strike BBCode - End Code Addition
// ------------------------------------------------
#
#-----[ OPEN ]------------------------------------------
#
templates/subSilver/bbcode.tpl
#
#-----[ FIND ]------------------------------------------
#
<!-- BEGIN u_open --><span style="text-decoration: underline"><!-- END u_open -->
<!-- BEGIN u_close --></span><!-- END u_close -->
#
#-----[ AFTER, ADD ]------------------------------------------
#
<!-- BEGIN s_open --><span style="text-decoration: line-through"><!-- END s_open -->
<!-- BEGIN s_close --></span><!-- END s_close -->
#
#-----[ OPEN ]------------------------------------------
#
language/lang_english/lang_main.php
#
#-----[ FIND ]------------------------------------------
#
$lang[‘bbcode_f_help’] = ‘Font size: [size=x-small]small text[/size]’;
#
#-----[ AFTER, ADD ]------------------------------------------
#
// ------------------------------------------------
// Strike BBCode - Begin Code Addition
$lang[‘bbcode_st_help’] = ‘Strike out: [s]Line through text[/s] (alt+t)’;
// Strike BBCode - End Code Addition
// ------------------------------------------------
#
#-----[ OPEN ]------------------------------------------
#
posting.php
#
#-----[ FIND ]------------------------------------------
#
‘L_BBCODE_F_HELP’ => $lang[‘bbcode_f_help’],
#
#-----[ AFTER, ADD ]------------------------------------------
#
// ------------------------------------------------
// Strike BBCode - Begin Code Addition
‘L_BBCODE_ST_HELP’ => $lang[‘bbcode_st_help’],
// Strike BBCode - End Code Addition
// ------------------------------------------------
#
#-----[ OPEN ]------------------------------------------
#
templates/subSilver/posting_body.tpl
#
#-----[ FIND ]------------------------------------------
#
f_help = "{L_BBCODE_F_HELP}";
#
#-----[ BEFORE, ADD ]------------------------------------------
#
// ------------------------------------------------
// Strike BBCode - Begin Code Addition
st_help = ‘{L_BBCODE_ST_HELP}’;
// Strike BBCode - End Code Addition
// ------------------------------------------------
#
#-----[ FIND ]------------------------------------------
#
bbtags = new Array(‘[b]’,’[/b]’,’[i]’,’[/i]’,’[u]’,’[/u]’,’[quote]’,’[/quote]’,’[code]’,’[/code]’,’[list]’,’[/list]’,’[list=]’,’[/list]’,’[img]’,’[/img]’,’[url]’,’[/url]’);
#
#-----[ AFTER, ADD ]------------------------------------------
#
// ------------------------------------------------
// Strike BBCode - Begin Code Addition
bbtags[22] = ‘[s]’;
bbtags[23] = ‘[/s]’;
// Strike BBCode - End Code Addition
// ------------------------------------------------
#
#-----[ FIND ]------------------------------------------
#
<td><span class="genmed">
<input type="button" class="button" accesskey="w" name="addbbcode16" value="URL" style="text-decoration: underline; width: 40px" onClick="bbstyle(16)" onMouseOver="helpline(‘w’)" />
</span></td>
#
#-----[ AFTER, ADD ]------------------------------------------
#
<!-- Strike BBCode - Begin Code Addition -->
<td><span class="genmed">
<input type="button" class="button" accesskey="t"
name="addbbcode22" value="Strike" style="text-decoration: line-through; width: 44px" onClick="bbstyle(22)" onMouseOver="helpline(‘st’)" />
</span></td>
<!-- Strike BBCode - End Code Addition -->
#
#-----[ SAVE/CLOSE ALL FILES ]------------------------------------------
#
# EoM
创建 ZIP 文件
现在你有了指令文件,你可以将它放入 ZIP 文件中,以便在网站上分发。对于像这样的简单单个文件修改,例如 Strike BBCode,你可以简单地将其作为单个文件提供。然而,对于包含多个文件的较大修改,则需要打包成一个压缩文件。这使得它们更容易分发。例如,考虑流行的文件附件修改,它包含超过 140 个单独的文件。逐个下载这些文件将是一场噩梦,因此它们被组合压缩成一个 ZIP 文件。这不仅允许你下载整个修改为一个文件,而且这个文件的大小显著减小,使得下载速度更快。
创建 ZIP 文件的实际过程将根据所使用的软件而有所不同。有许多程序可以使用。在第四章的安装新风格部分中列出了几个。Windows XP 和 Mac OS X 操作系统也具有创建 ZIP 文件的内建功能。您选择了要使用的软件后,请查阅其帮助文件或网站以确定如何使用该软件创建 ZIP 文件。
首先,将需要作为您修改的一部分分发的所有文件放置在一个文件夹中,并以修改的名称命名此文件夹。对于 Strike BBCode,您可以创建一个Strike文件夹并将您的strike.mod文件放入其中。如果修改添加了新的论坛文件,您可能希望在该第一个文件夹内创建反映新文件正确位置的文件夹,例如templates/subSilver/,用于新模板文件,并将附加文件放置在这些文件夹中。
一旦所有文件和文件夹都按照您的满意程度排列好,导航到包含修改文件夹的文件夹(例如,Strike)。右键单击修改文件夹以打开 Windows 上下文菜单。在这个菜单中应该有一个 WinZip 的条目;用鼠标指针悬停在其上以展开一个包含创建 ZIP 文件选项的子菜单。点击添加到 Strike.zip行以创建一个名为Strike.zip的新文件,该文件包含Strike文件夹内的所有文件和文件夹。如果为修改文件夹选择了不同的名称,添加到 Strike.zip和Strike.zip中使用的名称将不同。下面的图像展示了使用上下文菜单进行此过程。通过双击文件名或图标来测试您的新 ZIP 文件。WinZip 或您选择的存档软件应该打开文件并允许您提取文件。

提交您的修改
将您的修改文件的所有文件收集到一个压缩文件包中后,您最终可以将其提供给他人。要将文件提交到 phpBB.com 的修改数据库,您需要登录到该社区论坛的账户。如果您那里还没有账户,您需要先注册才能提交任何文件。
登录后,点击顶部横跨菜单中的Mods图标。这将带您进入网站的修改区域,在那里您可以找到修改数据库以及与提交和创建修改相关的文档。点击此页面上的MODS-Database链接以查看数据库的分类。正如您将看到的,此数据库中的所有下载都根据修改类型分为几个部分。选择最适合您修改的分类——如果是 BBCode 修改,则为BBCode——然后点击该分类以查看当前列出的下载。在列表页面的左侧将显示一个链接列表。点击添加链接;这将带您进入提交表单。
提交表单有几个字段用于输入您在说明文件标题中放置的相同信息,例如MOD 作者、MOD 描述、安装时间等。您还可以为修改验证团队输入私人消息以及与提交过程相关的其他信息。点击最后一个表单输入处的浏览按钮将打开一个对话框,您可以在其中选择您计算机上的 ZIP 文件。提交表单将上传文件到您的计算机。确保在上传完成之前不要关闭您的网络浏览器,否则您的提交将不会被接收。
注意
由于本章前面提到的理由,您不能将打击 BBCode 提交到网站。然而,您可以分发您创建的任何原始修改。
当您将修改提交到 phpBB.com 的数据库时,它将被放入一个队列中,直到由网站的 MOD 团队进行审查。一旦审查完毕,修改将被列入数据库,或者将被拒绝。在这种情况下,您应该在论坛上收到一条私人消息,解释原因以及您在重新提交之前必须更改的内容。验证可能需要一些时间,尤其是在有大量未审查的提交时,因此在这个阶段您应该保持耐心。过去,这个过程已经知道长达六个月。如果修改被接受并列入修改数据库,社区论坛中将会创建一个宣布发布的主题。如果以后发现任何问题,您可以使用此主题来支持修改。
其他网站的提交流程不同。例如,phpBBHacks.com 有一个非常简单的流程。在该网站上,你只需点击网站菜单上的提交链接,然后根据你提交的下载类型选择另一个链接。有针对修改和其他下载的单独提交表单。该网站的提交表单允许你输入与 phpBB.com 表单相同类型的信息:标题、描述、版本号、工作人员信息等。还有一些其他字段,例如 phpBB 版本兼容性。一个重要的区别是,你不会使用此表单上传修改。相反,你必须首先将其上传到自己的网站,并提供上传文件的 URL。由于 phpBBHacks.com 允许作者对自己的作品进行测试,因此该网站没有详细的验证流程。提交的破解程序将定期处理,因此你的提交应在几天内出现。然而,再次提醒,请耐心等待:有时处理可能需要更长的时间。
由于你必须上传包含修改的 ZIP 文件才能将其提交到 phpBBHacks.com,因此你还可以在自己的网站上发布它。许多修改作者都这样做,甚至可能在他们的网站上设置一个特殊的 phpBB 论坛。这样的论坛通常有助于提供修改支持,并为好奇的用户提供演示。
摘要
创建修改可以是你作为论坛管理员的一种非常有回报的经历。通过制作更多修改并使它们逐渐变得更加复杂,你可以了解许多关于 phpBB 和 PHP 编程内部工作原理的知识。你不仅能够改进在线社区的论坛,还能获得有助于你提升其他方面的经验。一些作者甚至继续从事雇佣工作,如为 phpBB 书籍撰写章节!
通过本章的示例,你学习了:
-
修改可以使用四种主要编程语言的任何组合编写
-
应在最新的 phpBB 版本中稳定的测试环境中进行开发
-
如何为你的社区创建全新的 BBCode
-
将使你能够创建其他修改的技能和技术
-
将你的修改提交到两个最大的修改数据库的方法
第八章。编程 phpBB
我们已经学习了关于安装 phpBB、配置它以及根据我们社区的需求定制它的很多知识。现在是时候阅读本书的最后一章,也是最复杂的一章,描述你需要了解的内容才能编写新的自定义 phpBB 功能。
为了更好地理解本章,需要具备 PHP 编程知识和一些 SQL 知识,但即使你不熟悉 PHP,你仍然可以浏览示例,只是为了激发你的编程兴趣。谁知道呢,你可能喜欢你所看到的东西,并决定学习更多的 PHP。
本章不是对 phpBB 编程体验的全面指南,而是将专注于最常用的 phpBB 库和函数。本章从简单的“Hello phpBB World”脚本开始,逐渐过渡到包含更复杂的示例。在章节的结尾,你将开发一个全新的 phpBB 脚本,名为“What’s Up?”,它会在单个屏幕上显示你论坛中所有论坛的最新主题,同时尊重用户的特定权限。
在本章中,你将学习以下内容:
-
创建“Hello phpBB World!”脚本
-
与数据库一起工作
-
使用 phpBB 消息
-
phpBB 的多语言系统
-
使用 phpBB 模板
-
用户身份验证
-
其他有用的 phpBB 函数和编码标准
-
将所有这些组合起来创建一个新的 phpBB 插件脚本
Hello phpBB World!
当你开始学习一门新的编程语言或技术时,这是一个传统;你首先学习做的事情是如何编写一个简单的应用程序,它只显示“Hello World!”。让我们看看如何在 phpBB 中做到这一点。
首先,为了给你一个目标的概念,这里是执行 Hello World 脚本的结果,在浏览器中显示。

这是生成上述截图结果的代码。
<?php
// set IN_PHPBB constant and include the initialization script
define(‘IN_PHPBB’, true);
$phpbb_root_path = ‘./’;
include($phpbb_root_path . ‘extension.inc’);
include($phpbb_root_path . ‘common.’.$phpEx);
// Start session management
$userdata = session_pagestart($user_ip, PAGE_INDEX);
init_userprefs($userdata);
// include page header
include($phpbb_root_path . ‘includes/page_header.’.$phpEx);
// say hello!
echo ‘<div align="center">Hello, phpBB World!</div>’;
// include page footer
include($phpbb_root_path . ‘includes/page_tail.’.$phpEx);
?>
为了在你的论坛上重现这个效果,你只需要创建一个名为,例如,helloBB.php的新空白文本文件,将前面的代码输入到文件中,保存它,并将其复制到你的论坛根目录。然后你可以使用你喜欢的浏览器访问新创建的脚本(如果你的论坛位于www.yourdomain.com/forum,你可以转到www.yourdomain.com/forum/helloBB.php来访问此脚本)。
注意
本文件的源代码(以及本章中所有示例的源代码)可以从www.packtpub.com下载。
在阅读解释之前,先看看代码;花点时间阅读它,看看你是否能弄清楚脚本中发生了什么。
脚本被分成由空行分隔的五个代码块。脚本的实际工作是在第四个块中完成的——那就是“Hello”所在的地方:
// say hello!
echo ‘<div align="center">Hello, phpBB World!</div>’;
剩余的脚本正在为实际要执行的工作设置 phpBB 环境。你写的每个脚本都应该有相同的流程,因此你可以将此脚本作为所有未来脚本的模板,只需将“工作”部分替换为你需要的功能。话虽如此,你实际上并不需要了解第四个代码块之外发生的事情,但如果你好奇,这里有一些更多信息。
在第一个代码块中发生的情况如下:
-
在第一行,定义了一个名为
IN_PHPBB的常量。这是一项安全措施,将在本章稍后更详细地讨论。 -
然后定义了 phpBB 的根目录,在这种情况下是当前目录,因为脚本位于 phpBB 根目录中。
-
然后包含了一个简单的文件
extension.inc。它只定义了服务器上 PHP 文件的后缀。很可能是.php后缀。 -
在第一个代码块的最后一条线,包含了一个非常重要的文件——
common.php。这个脚本负责大多数 phpBB 环境的设置和配置。你可以查看其源代码以获取更多详细信息,但为了有一个大致的了解,这个脚本负责初始化论坛配置、建立数据库连接以及包含 phpBB 无法没有的其他库和函数。
第二个代码块负责调用两个处理会话数据和用户偏好的函数。第三个和第五个代码块分别包含 phpBB 图形用户界面的头部和尾部。头部是截图上 Hello, phpBB World! 行之前的所有内容,而尾部是之后的所有内容。如果你编写了一个特殊的脚本,例如弹出窗口脚本,你可能不一定需要头部和尾部。
既然我们已经了解了 phpBB 脚本的基本结构,让我们继续前进并从数据库中检索一些数据。
与数据库一起工作
phpBB 中的数据库连接是一个重要的话题,因此需要特别注意。本节提供了有关 phpBB 中使用的数据库抽象的背景信息,以及一些从数据库中检索数据的示例。
数据库抽象
如你所知,phpBB 可以与不同的数据库一起工作。为了在不重新编码整个系统的情况下实现这一结果,phpBB 采用了一种称为数据库抽象的编程技术。这仅仅意味着有几个脚本(类),针对每个支持的数据库系统特定,以不同的方式实现相同的结果。在这种情况下,其他 phpBB 脚本不需要了解特定的数据库系统,它们只需调用数据库抽象类的函数(类方法),然后它会在特定的数据库上完成工作。
例如,要在 MySQL 数据库上执行 SQL 查询,PHP 脚本使用 mysql_query() 函数。要在 MS Access 数据库上执行相同的操作,则使用 odbc_exec()。因此,作为数据库抽象机制的一部分,phpBB 定义了针对不同数据库系统的独立类:一个用于 MySQL,一个用于 MS Access,以及其他支持的 RDBMS。这些类有不同的实现,但共享相同的“公共接口”,这意味着所有类都有相同的一组函数(方法)。因此,当您想要执行 SQL 查询时,您只需使用 phpBB 数据库抽象层的 sql_query() 方法,而无需了解此方法是如何实现的以及使用了哪种底层数据库系统。抽象并关注更重要的事情,同时让其他类负责一些细节——这就是面向对象编程的美丽之处!
在 common.php 脚本(我们之前提到过)中,为您建立了数据库连接,并定义了 $db 变量,其中包含适当的数据库类的对象。同样,您不必关心使用的是哪种数据库系统;您只需要了解 phpBB 抽象层的编程接口。这听起来可能像是我们在学习更多函数及其工作方式时遇到了更多的麻烦,但实际上这是一件好事,因为这样您只需编写一次代码,然后就可以在 phpBB 支持的任何数据库上重用您的代码。
关于数据库抽象的最后一件事——标准 SQL 命令的使用。如果您使用任何特定于特定 RDBMS 的 SQL 命令或函数,请注意,这种功能可能在其他系统中不存在。通常情况下,这不应该成为问题,因为您不会每天在不同的数据库之间切换,但您仍然应该知道这一点。
数据库抽象工作
让我们看看 phpBB 数据库抽象层的一个示例。您将创建一个脚本,显示到目前为止在论坛上使用了多少个单词。phpBB 有一个全文搜索系统,将所有使用的单词存储到数据库表中。因此,为了示例的目的,您只需要计算这个表中的行数。
为了帮助您可视化目标,以下是脚本执行的结果:

这是实现它的源代码:
<?php
// set IN_PHPBB constant and include the initialization script
define(‘IN_PHPBB’, true);
$phpbb_root_path = ‘./’;
include($phpbb_root_path . ‘extension.inc’);
include($phpbb_root_path . ‘common.’.$phpEx);
// Start session management
$userdata = session_pagestart($user_ip, PAGE_INDEX);
init_userprefs($userdata);
// include page header
include($phpbb_root_path . ‘includes/page_header.’.$phpEx);
// the main script work starts here
$sql = "SELECT COUNT(*) FROM " . SEARCH_WORD_TABLE;
$result = $db->sql_query($sql);
if ( !$result )
{
message_die(GENERAL_ERROR, ‘Cannot execute query’, ‘’, __LINE__, __FILE__, $sql);
}
$row = $db->sql_fetchrow();
$word_count = $row[0];
echo ‘<div align="center">Hey, did you know that ‘. $word_count .’ words were used in my board so far!?</div>’;
// end of the script work
// include page footer
include($phpbb_root_path . ‘includes/page_tail.’.$phpEx);
?>
将此代码保存到名为 phpBBdb.php 的文件中(或从书籍的代码下载中获取),将文件复制到您的 phpBB 根目录,并在浏览器中尝试运行。
如您所见,此脚本遵循了上一个脚本的结构,只是“工作”部分发生了变化。让我们详细讨论一下这部分。
首先,我们从要执行的 SQL 查询开始。
$sql = "SELECT COUNT(*) FROM " . SEARCH_WORD_TABLE;
在这个查询中,SEARCH_WORD_TABLE 是一个常量,它定义了包含全文搜索数据的表名。如果你还记得,在安装过程中,你可以为数据库中的所有表指定一个表前缀。使用常量(如 SEARCH_WORD_TABLE, POSTS_TABLE 等)而不是硬编码的表名允许 phpBB 提供这个功能。你可以通过查看 includes/constants.php 脚本来了解所有数据库相关常量(以及其他常量)是如何定义的。默认情况下,表前缀是 phpbb_,因此,在将常量替换为其值后,查询将看起来像 SELECT COUNT(*) FROM phpbb_search_wordlist;。
现在我们来看看下一行代码。
$result = $db->sql_query($sql);
这行代码通过调用适当 DB 抽象类的实例的 sql_query() 方法来执行 SQL 查询(你不需要担心这个)。
这之后是:
if ( !$result )
{
message_die(GENERAL_ERROR, ‘Cannot execute query’, ‘’,
__LINE__, __FILE__, $sql);
}
这些行检查查询是否成功执行。如果没有,将显示错误消息(你将在稍后了解更多关于这些消息的内容)。查询成功执行后,就是获取执行结果的时候了。(phpBB 抽象层提供了多种方法来实现这一点,稍后将会讨论。)
$row = $db->sql_fetchrow();
这行代码将结果行作为数组获取,并将其分配给一个名为 $row 的变量。在这种情况下,只返回了一行(记录),实际上只返回了一个字段。因此 $row[0] 将包含我们想要的价值。零代表返回结果行中的偏移量为零。
$word_count = $row[0];
最后剩下的事情是使用 echo 显示值。
echo ‘<div align="center">Hey, did you know that ‘. $word_count .’ words were used in my board so far!?</div>’;
使用 phpBB 数据库抽象层
我们提到,有几种方法可以从查询执行的结果中检索数据,在执行 sql_query() 查询之后。让我们看看选项。
选项 1
这里使用的示例是 sql_fetchrow() 方法。此方法以枚举和关联数组的形式返回结果。关联数组的键是结果集中的字段名——上面提到的相同结果可以通过使用以下方式实现:
$word_count = $row[‘COUNT(*)’];
显然,上面的方式不太方便输入。更好的选择是使用:
$word_count = $row[‘words’];
如果将查询稍微修改一下,使用 words 作为 COUNT(*) 的别名,这将有效:
$sql = "SELECT COUNT(*) AS words FROM " . SEARCH_WORD_TABLE;
选项 2
从执行查询的结果中获取结果的另一种方式是使用 sql_fetchrowset() 方法。它的工作方式类似于 sql_fetchrow(),只不过它返回由查询匹配的所有记录的数据。如果你使用 sql_fetchrow(),你必须在一个循环中调用此方法,直到达到结果集的末尾,而 sql_fetchrowset() 返回所有结果,并且你通过结果数组进行循环。第二个选项相对友好一些,但因为它需要将结果集作为数组复制到内存中,所以消耗更多的内存。因此,不建议与将返回大量结果集的查询一起使用,但对于较小的“日常”查询来说是可以的。
为了说明区别,你可以 print_r() 两个函数的结果。从 sql_fetchrow(),你会得到类似以下的内容:
Array
(
[0] => 71
[COUNT(*)] => 71
)
..并且从 sql_fetchrowset(),你会得到:
Array
(
[0] => Array
(
[0] => 71
[COUNT(*)] => 71
)
)
选项 3
从执行查询的结果中获取结果的另一种方法是使用 sql_fetchfield(),它只返回一个字段的值,并且这个字段是通过名称引用的。为了从之前的示例中获得预期的结果,你可以使用:
$word_count = $db->sql_fetchfield(‘COUNT(*)’);
如果你不知道字段名称,但知道它在结果集行中的偏移量,你可以使用 sql_fieldname() 方法,如下所示:
$word_count = $db->sql_fetchfield($db->sql_fieldname(0));
在这里,零是你感兴趣的字段的偏移量。
使用 phpBB 消息
在之前的示例中,你已经看到了 phpBB 消息的使用方法。现在,是时候更仔细地查看这些消息并在实际操作中测试它们了。
为了看到 phpBB 消息的实际效果,你可以简单地使用之前的示例,但这次,在 SQL 字符串中引入一个无效命令;例如:
$sql = "HEY, GO AHEAD AND SELECT COUNT(*) FROM " . SEARCH_WORD_TABLE;
如果你将刚刚修改的文件保存为 phpBBmessage.php 并在浏览器中预览,你会看到一个由无效 SQL 字符串引起的错误消息。

这条消息是由以下示例中的代码引起的:
if ( !$result )
{
message_die(GENERAL_ERROR, ‘Cannot execute query’, ‘’, __LINE__, __FILE__, $sql);
}
这里使用了 phpBB 中可用的 message_die() 函数。你看到所有错误细节,因为论坛处于调试模式。在生产环境中(当你的论坛上线时),关闭调试模式是个好主意。你可以通过更改 includes 文件夹中的 constants.php 脚本中的一行来实现这一点。调试设置代码位于 constants.php 脚本的顶部。确保 DEBUG 常量设置为 0,如下所示:
// Debug Level
//define(‘DEBUG’, 1); // Debugging on
define(‘DEBUG’, 0); // Debugging off
如果禁用了调试模式,上述消息将不那么冗长:

message_die() phpBB 函数可以用于除错误消息以外的其他目的。例如,它可以用来显示比之前章节中讨论的数据库示例(helloBBdb.php)更友好的结果。在这个数据库示例中,更改以下行:
echo ‘<div align="center">Hey, did you know that ‘. $word_count .’ words were used in my board so far!?</div>’;
到:
message_die(GENERAL_MESSAGE,
‘Hey, did you know that ‘. $word_count .’ words were used in my board so far!?’,
‘Word count’);
将其保存为 helloBBmessage2.php 并在浏览器中查看。结果将是:

这里有一些关于你可以用于调用 message_die() 的六个函数参数的信息:
-
消息类型:可以是
GENERAL_MESSAGE, CRITICAL_MESSAGE, GENERAL_ERROR或CRITICAL_ERROR,具体取决于消息的严重性。 -
消息文本:可以是你想传达给用户的任何内容。
-
消息标题:如果你不提供它,将使用基于消息类型的默认标题。在最后一个示例中,标题是 单词计数。
-
错误行(仅限调试模式):这包含脚本中发生错误的行。传递此参数的方法只是使用 PHP 核心常量
__LINE__。 -
错误文件:(仅用于调试模式):这是导致错误的脚本的文件名。与前面的参数一样,这里只需使用
__FILE__。 -
SQL:与错误相关的 SQL 字符串(如果有)。
在所有函数参数中,只有第一个(消息类型)是必需参数:其余的都是可选的。
使用 phpBB 的多语言系统
在前面的示例中,显示了一些文本给用户。这些文本的问题在于它们只使用英语,可能不会被使用非英语浏览你论坛的访客理解。为了为你的自定义脚本提供多语言支持,你可以利用 phpBB 的多语言系统。
你的 phpBB 安装的语言文件夹包含每个已安装语言的子文件夹,例如 lang_english, lang_spanish 等。这些文件夹包含许多文件,但你最感兴趣的文件是名为 lang_main.php 的文件。此文件包含静态文本,定义为名为 $lang 的关联数组中的元素。例如:
$lang[‘Guest’] = ‘Guest’;
$lang[‘Post_subject’] = ‘Post subject’;
$lang[‘View_next_topic’] = ‘View next topic’;
在此文件末尾(在 "That’s all, Folks!" 注释之前)您可以添加您的文本作为新的数组元素。在先前的示例 (helloBBmessage2.php) 中使用了两个文本:Word count 和 Hey, did you know that (此处为单词数量) words were used in my board so far!?。您可以在 lang_main.php 中如下定义它们:
$lang[‘Word_count_title’] = ‘Word count’;
$lang[‘Word_count_message’] = ‘Hey, did you know that <strong>%d</strong> words were used in my board so far!?’;
%d 用作实际单词数量的占位符,并在你的脚本中替换。你可以使用任何作为可替换占位符的内容,但 phpBB 团队采用了 PHP printf() 函数的使用。有关 printf() 和 sprintf() 如何工作的详细信息,你可以查阅 PHP 手册条目 php.net/printf 和 php.net/sprintf。
你可能已经注意到了消息文本中有一点点变化。嗯,为了使消息有些不同,同时测试 HTML 的支持情况,单词计数值 %d 被包含在 <strong> HTML 标签中以强调单词数量。
现在您的文本已位于 lang_main.php 文件中,每次访问脚本时它们都会自动初始化。因此,您可以通过将 message_die() 的调用更改为以下内容来在脚本中使用它们:
message_die(GENERAL_MESSAGE,
sprintf($lang[‘Word_count_message’], $word_count),
$lang[‘Word_count_title’]);
这里是修改后的脚本完整列表。您可以将其保存为 helloBBlangs.php 并在您的论坛上测试它。别忘了对 lang_main.php 进行更改,如果您的论坛使用多种语言,别忘了您需要将文本翻译并添加到相应语言的目录中的 lang_main.php 脚本中。
<?php
// set IN_PHPBB constant and include the initialization script
define(‘IN_PHPBB’, true);
$phpbb_root_path = ‘./’;
include($phpbb_root_path . ‘extension.inc’);
include($phpbb_root_path . ‘common.’.$phpEx);
// Start session management
$userdata = session_pagestart($user_ip, PAGE_INDEX);
init_userprefs($userdata);
// include page header
include($phpbb_root_path . ‘includes/page_header.’.$phpEx);
// the main script work starts here
$sql = "SELECT COUNT(*) FROM " . SEARCH_WORD_TABLE;
$result = $db->sql_query($sql);
if ( !$result )
{
message_die(GENERAL_ERROR, ‘Cannot execute query’, ‘’, __LINE__, __FILE__, $sql);
}
$row = $db->sql_fetchrow();
$word_count = $row[0];
message_die(GENERAL_MESSAGE,
sprintf($lang[‘Word_count_message’], $word_count),
$lang[‘Word_count_title’]);
// end of the script work
// include page footer
include($phpbb_root_path . ‘includes/page_tail.’.$phpEx);
?>
这里是执行 helloBBlangs.php 的结果:

使用 phpBB 模板
在之前的示例中,没有涉及太多图形用户界面工作,但通常情况下,如果您正在开发新的 phpBB 脚本或扩展现有的脚本,那么通常会有。将编程代码与用户界面分离通常是一种良好的编程实践,通常被称为“逻辑与展示的分离”。对于像 phpBB 这样的 Web 应用程序,这意味着将 PHP 代码和逻辑与用于向用户展示结果的 HTML 代码分离。
这通常是通过使用所谓的模板系统(模板引擎)来实现的,它由两部分组成:
-
包含显示内容规则的静态 HTML 模板文件;“规则”意味着格式、布局等。
-
PHP 逻辑用于在 HTML 模板中“填充空白”。
使用模板引擎可以通过仅更改静态 HTML 文件来完全改变论坛的外观,而不需要处理编程逻辑、数据库访问等。在第四章中详细讨论了创建新模板。
phpBB 有其自己的模板引擎,在这里讨论它是为了让您对如何在脚本中使用它有一个基本的了解。
您可以在 includes 文件夹中找到模板库脚本(template.php)。此文件包含名为 Template 的类的定义(代码),如果您感兴趣,可以查看其实现。对于编写 phpBB 脚本的目的,您只需要知道如何使用库,而不需要知道它是如何编写的(记住,这就是面向对象编程方法的美妙之处)。
为了使用模板类,需要创建该类的一个实例(一个对象)。在 phpBB 环境设置过程中已经为您创建了一个这样的对象。一旦包含页面头部脚本,就会初始化一个名为 $template 的变量,它包含 Template 类的对象。
一个简单示例
现在是时候创建一个新的、简单的模板了。创建(或从书籍代码下载中复制)以下文件(命名为 wordcount.tpl 并将其放置在 templates/subSilver 目录中):
<span class="nav"><a href="{U_INDEX}" class="nav">{L_INDEX}</a></span>
<div
align="center"
class="gen"
style="border: solid 2px #006699; padding: 10px; margin-top: 5px;"
>
{WORD_COUNT_MESSAGE}
</div>
在继续编写 PHP 代码之前,请看一下下面的截图;它显示了执行示例的结果。

之前指定的模板只负责截图的以下部分:

其余内容由默认的头部和尾部显示。
让我们看看如何实现这个结果。在脚本中使用模板功能有三个部分:
-
首先,您需要指定包含静态 HTML 的文件名(或文件名列表),使用
$template->set_filenames()方法。 -
然后你使用 PHP 通过调用
$template->assign_vars()或$template->assign_block_vars()来替换模板变量与数据。在阅读了第四章之后,你已经熟悉了模板变量及其语法;它们被大括号包围并大写,如{I_AM_A_VAR}。 -
最后,你调用
$template->pparse()方法来显示结果。
这是使用前面列出的wordcount.tpl模板的 PHP 代码:
// assemble the message text
$message_text = sprintf($lang[‘Word_count_message’], $word_count);
// set template file
$template->set_filenames(array(‘body’ => ‘wordcount.tpl’));
// assign template variables
$template->assign_vars(
array(
‘WORD_COUNT_MESSAGE’ => $message_text,
)
);
// process, parse and display
$template->pparse(‘body’);
在结果中显示了两个更多的模板变量,但它们没有使用$template->assign_vars()分配值——U_INDEX和L_INDEX。你不需要担心它们的原因是,它们在处理页面标题时已经被分配了。有关更多信息以及幕后处理变量的完整列表,请打开includes/page_header.php脚本,并将文件滚动到接近底部,在那里分配模板变量。
要测试这个例子,创建一个包含以下代码的helloBBtemplates.php文件,并在浏览器中导航到它(别忘了也将wordcount.tpl模板复制到templates/subSilver目录中):
<?php
// set IN_PHPBB constant and include the initialization script
define(‘IN_PHPBB’, true);
$phpbb_root_path = ‘./’;
include($phpbb_root_path . ‘extension.inc’);
include($phpbb_root_path . ‘common.’.$phpEx);
// Start session management
$userdata = session_pagestart($user_ip, PAGE_INDEX);
init_userprefs($userdata);
// include page header
include($phpbb_root_path . ‘includes/page_header.’.$phpEx);
// the main script work starts here
$sql = "SELECT COUNT(*) FROM " . SEARCH_WORD_TABLE;
$result = $db->sql_query($sql);
if ( !$result )
{
message_die(GENERAL_ERROR, ‘Cannot execute query’, ‘’, __LINE__, __FILE__, $sql);
}
$row = $db->sql_fetchrow();
$word_count = $row[0];
// assemble the message text
$message_text = sprintf($lang[‘Word_count_message’], $word_count);
// set template file
$template->set_filenames(array(‘body’ => ‘wordcount.tpl’));
// assign template variables
$template->assign_vars(
array(
‘WORD_COUNT_MESSAGE’ => $message_text,
)
);
// process, parse and display
$template->pparse(‘body’);
// end of the script work
// include page footer
include($phpbb_root_path . ‘includes/page_tail.’.$phpEx);
?>
在 phpBB 模板中使用循环
通常,仅分配静态模板变量是不够的;你需要具备在模板中使用循环等动态赋值的能力(例如,列出论坛中的所有主题是在执行循环,列出主题的所有回复也是循环,等等)。让我们通过一个例子来看看你如何使用循环。
这个例子显示了从一到十的数字。要在模板中设置循环,请使用块变量语法。
<!-- BEGIN number_loop -->
{number_loop.NUMBER}
<!-- END number_loop -->
在这里number_loop是块的名字,NUMBER是一个变量。注意在循环中引用变量的点状语法,如{number_loop.NUMBER}。为了使它更有趣,并理解块内变量与块外变量的区别,添加另一个{NUMBER}变量,但这次与循环无关。在循环迭代期间,它将具有一个常量值。
这是模板的列表(将其保存为名为example2.tpl的文件,并将其放置在templates/subSilver中):
<span class="nav"><a href="{U_INDEX}" class="nav">{L_INDEX}</a></span>
<div
align="center"
class="gen"
style="border: solid 2px #006699; padding: 10px; margin-top: 5px;"
>
<!-- BEGIN number_loop -->
{NUMBER}{number_loop.NUMBER}
<!-- END number_loop -->
</div>
这是解析模板的 PHP 脚本(helloBBtemplates2.php):
<?php
// set IN_PHPBB constant and include the initialization script
define(‘IN_PHPBB’, true);
$phpbb_root_path = ‘./’;
include($phpbb_root_path . ‘extension.inc’);
include($phpbb_root_path . ‘common.’.$phpEx);
// Start session management
$userdata = session_pagestart($user_ip, PAGE_INDEX);
init_userprefs($userdata);
// include page header
include($phpbb_root_path . ‘includes/page_header.’.$phpEx);
// the main script work starts here
// set template file
$template->set_filenames(array(‘body’ => ‘example2.tpl’));
// assign template variables in a loop
for ($i = 1; $i<=10; $i++)
{
$template->assign_block_vars("number_loop",
array(
‘NUMBER’ => $i,
)
);
}
// assign a static variable
$template->assign_vars(
array(
‘NUMBER’ => ‘#’,
)
);
// process, parse and display
$template->pparse(‘body’);
// end of the script work
// include page footer
include($phpbb_root_path . ‘includes/page_tail.’.$phpEx);
?>
在浏览器中执行helloBBtemplates2.php的结果:

在 phpBB 模板中使用条件
有时你可能想根据某些“if”条件(一个“switch”)有条件地向用户显示数据。要使用 phpBB 模板引擎执行此操作,请使用与处理循环时相同的块变量。
下一个例子与上一个例子非常相似;它列出了从一到十的数字。但是,它使用了一个“if”条件来显示偶数,以便以粗体字体显示。
这是模板。将其保存为example3.tpl在templates/subSilver中:
<span class="nav"><a href="{U_INDEX}" class="nav">{L_INDEX}</a> </span>
<div
align="center"
class="gen"
style="border: solid 2px #006699; padding: 10px; margin-top: 5px;"
>
<!-- BEGIN number_loop -->
<!-- BEGIN odd_switch -->
{NUMBER}{number_loop.odd_switch.NUMBER}
<!-- END odd_switch -->
<!-- BEGIN even_switch -->
<strong>{NUMBER}{number_loop.even_switch.NUMBER}</strong>
<!-- END even_switch -->
<!-- END number_loop -->
</div>
因为您有嵌套块(一个在循环块内的 switch 块),当您从内部块引用变量时,您需要指定两个块的名字,用点分隔,如{number_loop.odd_switch.NUMBER}。此外,请注意,没有为偶数情况进行单独的测试——您只需使用else来引入一个替代代码块。
这是 PHP 脚本的列表(将其保存为helloBBtemplates3.php在您的根 phpBB 文件夹中):
<?php
// set IN_PHPBB constant and include the initialization script
define(‘IN_PHPBB’, true);
$phpbb_root_path = ‘./’;
include($phpbb_root_path . ‘extension.inc’);
include($phpbb_root_path . ‘common.’.$phpEx);
// Start session management
$userdata = session_pagestart($user_ip, PAGE_INDEX);
init_userprefs($userdata);
// include page header
include($phpbb_root_path . ‘includes/page_header.’.$phpEx);
// the main script work starts here
// set template file
$template->set_filenames(array(‘body’ => ‘example3.tpl’));
// assign template variables in a loop
for ($i = 0; $i <= 10; $i++)
{
if ( $i % 2 )
{
$template->assign_block_vars("number_loop.odd_switch",
array(
‘NUMBER’ => $i,
)
);
} else {
$template->assign_block_vars("number_loop.even_switch",
array(
‘NUMBER’ => $i,
)
);
}
}
// assign a static variable
$template->assign_vars(
array(
‘NUMBER’ => ‘#’,
)
);
// process, parse and display
$template->pparse(‘body’);
// end of the script work
// include page footer
include($phpbb_root_path . ‘includes/page_tail.’.$phpEx);
?>
这是脚本的实际运行情况:

注意
为了完善您对 phpBB 模板引擎的知识,有一个全面的知识库文章在www.phpbb.com/kb/article.php?article_id=200。
用户身份验证
当您开发新脚本或扩展现有脚本时,您可能需要一种方式来验证用户的权限(换句话说,检查用户是否允许执行或查看您的脚本提供的内容);例如,如果您开发一个显示隐藏论坛帖子的脚本,您需要确保只有允许访问此论坛的用户才能看到帖子。
在includes/auth.php中定义了一个重要的用户身份验证功能——auth()函数。
auth()函数返回一个包含已检查权限信息的关联数组。您可以检查单个权限(权限类型),如查看、读取、发布、投票等;您甚至可以一次性检查所有权限类型。您还可以在特定论坛或所有论坛中检查权限。
使用auth()函数时需要三个必需的参数:
-
权限类型:可能的值是常量
AUTH_VIEW, AUTH_READ, AUTH_POST, AUTH_REPLY, AUTH_EDIT, AUTH_DELETE, AUTH_STICKY, AUTH_ANNOUNCE, AUTH_VOTE, AUTH_POLLCREATE,或者(为了检查所有权限类型)AUTH_ALL。 -
论坛 ID:如果您想检查特定论坛的权限,请指定其 ID。要检查所有论坛的权限,请使用
AUTH_LIST_ALL常量。 -
用户数据:用户信息数组。您不需要担心这一点;在每段脚本的开头,在会话管理部分定义了一个
$userdata变量。因此,您只需将此变量原样传递即可。
auth()函数将结果以关联数组的形式返回。让我们看看几个auth()如何使用的例子,以便更好地了解返回值。
使用身份验证函数
您可以使用以下代码来尝试并测试身份验证功能的工作方式以及它返回的类型值。将此代码保存为helloBBauth.php并在浏览器中加载:
<?php
// set IN_PHPBB constant and include the initialization script
define(‘IN_PHPBB’, true);
$phpbb_root_path = ‘./’;
include($phpbb_root_path . ‘extension.inc’);
include($phpbb_root_path . ‘common.’.$phpEx);
// Start session management
$userdata = session_pagestart($user_ip, PAGE_INDEX);
init_userprefs($userdata);
// include page header
include($phpbb_root_path . ‘includes/page_header.’.$phpEx);
// check auth
$user_privileges = auth(AUTH_ALL, AUTH_LIST_ALL, $userdata);
// display the return value
echo ‘<pre>’;
print_r($user_privileges);
echo ‘</pre>’;
// include page footer
include($phpbb_root_path . ‘includes/page_tail.’.$phpEx);
?>
此脚本包含对 auth() 函数的调用,然后显示执行结果。您可以从更改传递给 auth() 函数的参数开始,看看返回值是如何变化的。您还可以以普通用户身份登录,然后以版主或管理员身份登录,然后注销,看看返回值是如何变化的。
假设您的论坛 ID 等于 1,并且这个论坛被设置为注册论坛,这意味着在管理面板 | 论坛管理 | 权限中,其权限被使用简单模式设置为注册用户。这意味着用户必须注册并登录才能发帖。在这种情况下,要检查用户权限,您可以将上一个例子中对 auth() 函数的调用更改为:
$user_privileges = auth(AUTH_ALL, 1, $userdata);
如果您将修改后的脚本保存为 helloBBauth2.php 并在浏览器中加载,您将看到以下返回值:
Array
(
[auth_view] => 1
[auth_view_type] => anonymous users
[auth_read] => 1
[auth_read_type] => anonymous users
[auth_post] => 0
[auth_post_type] => registered users
[auth_reply] => 0
[auth_reply_type] => registered users
[auth_edit] => 0
[auth_edit_type] => registered users
[auth_delete] => 0
[auth_delete_type] => registered users
[auth_sticky] => 0
[auth_sticky_type] => moderators
[auth_announce] => 0
[auth_announce_type] => moderators
[auth_vote] => 0
[auth_vote_type] => registered users
[auth_pollcreate] => 0
[auth_pollcreate_type] => registered users
[auth_mod] => 0
)
当您未登录时,会显示此结果。您会看到返回值中只有 auth_view 和 auth_read 索引被设置为 1,其余都是 0。这意味着当您未登录时,您只有查看该论坛和阅读它的权限。
现在如果您以普通用户身份登录并再次访问 helloBBauth2.php,您将看到不同的返回值:
Array
(
[auth_view] => 1
[auth_view_type] => anonymous users
[auth_read] => 1
[auth_read_type] => anonymous users
[auth_post] => 1
[auth_post_type] => registered users
[auth_reply] => 1
[auth_reply_type] => registered users
[auth_edit] => 1
[auth_edit_type] => registered users
[auth_delete] => 1
[auth_delete_type] => registered users
[auth_sticky] => 0
[auth_sticky_type] => moderators
[auth_announce] => 0
[auth_announce_type] => moderators
[auth_vote] => 1
[auth_vote_type] => registered users
[auth_pollcreate] => 1
[auth_pollcreate_type] => registered users
[auth_mod] => 0
)
如您所见,现在唯一设置为 0 的权限类型是 auth_mod, auth_sticky 和 auth_announce,因为以普通用户身份登录,您无法管理论坛或发布置顶帖或公告。
检查创建投票权限
如果所有这些关联数组返回值都让您头疼,这里有一个更友好的方式来显示对 auth() 函数调用的结果。这个例子(helloBBauth3.php)告诉您是否可以在论坛 ID 等于 1 的情况下创建投票。在您登录和注销后测试它。
<?php
// set IN_PHPBB constant and include the initialization script
define(‘IN_PHPBB’, true);
$phpbb_root_path = ‘./’;
include($phpbb_root_path . ‘extension.inc’);
include($phpbb_root_path . ‘common.’.$phpEx);
// Start session management
$userdata = session_pagestart($user_ip, PAGE_INDEX);
init_userprefs($userdata);
// include page header
include($phpbb_root_path . ‘includes/page_header.’.$phpEx);
// check auth
$user_privileges = auth(AUTH_POLLCREATE, 1, $userdata);
// display the result of the authentication
$message = ‘’;
if ( $user_privileges[‘auth_pollcreate’] == 1 )
{
$message = ‘Great news! You can create polls in forum id #1!’;
} else {
$message = ‘When you login, you\’ll be able to create polls in forum id #1.’;
}
message_die(GENERAL_MESSAGE, $message, ‘Auth test’);
// include page footer
include($phpbb_root_path . ‘includes/page_tail.’.$phpEx);
?>
如果您在访问 helloBBauth3.php 时已登录,您将看到以下消息:

当您注销并再次访问同一页面时,您将看到更改后的消息:

注意
一些代码注释,用作 auth() 函数如何使用的文档;您可以在您的 phpBB 安装中的 includes/auth.php 文件定义函数之前找到这些代码注释。
本节描述了一些可能很有用的 phpBB 函数。列出的函数有两种类型:通用函数(主要包含在 includes/functions.php 中),以及与处理 BB 代码和表情符号相关的发帖函数(这些函数定义在 includes/bbcode.php 中)。本节最后有一些 phpBB 特定的编码指南和标准。
其他函数
这些是一些与 phpBB 一起提供的通用功能。
获取论坛统计数据
使用此函数检索一些论坛统计数据:
get_db_stat($mode)
这个函数返回的数据类型取决于传递给它的参数。这个函数只能接受四个预定义字符串之一作为参数。以下是参数及其从函数返回的值(最后两个选项将给出所有论坛的统计数据,包括隐藏的论坛):
-
usercount:当传递此参数时,函数将返回注册用户的总数。 -
newestuser:当传递此参数时,函数将返回一个包含username和user_id键的数组,包含最近注册的用户。 -
postcount:这将返回帖子的总数。 -
topiccount:这将返回你在论坛中创建的主题总数。
这里是这个函数的一个示例用法:
<?php
// set IN_PHPBB constant and include the initialization script
define(‘IN_PHPBB’, true);
$phpbb_root_path = ‘./’;
include($phpbb_root_path . ‘extension.inc’);
include($phpbb_root_path . ‘common.’.$phpEx);
// Start session management
$userdata = session_pagestart($user_ip, PAGE_INDEX);
init_userprefs($userdata);
// include page header
include($phpbb_root_path . ‘includes/page_header.’.$phpEx);
// the main script work starts here
$newest_user = get_db_stat("newestuser");
message_die(
GENERAL_MESSAGE,
‘My board has ‘
. get_db_stat("usercount") . ‘ users, ‘
. get_db_stat("postcount") . ‘ postings and ‘
. get_db_stat("topiccount") . ‘ topics. ‘
. ‘Say \’Hi\’ to the newest member - ‘
. $newest_user[‘username’] . ‘!’,
‘Board stats - get_db_stats() demo’
);
// include page footer
include($phpbb_root_path . ‘includes/page_tail.’.$phpEx);
?>
输出:

获取用户信息
使用此函数来获取关于用户的信息数组:
get_userdata($user, $force_str = false)
它将返回数据库表中用户条目的所有字段,作为一个包含关联和枚举值的数组。
将以下代码片段尝试放入脚本中:
echo ‘<pre>’;
print_r(get_userdata(2));
echo ‘</pre>’;
这将显示一个数组,其开始如下:
Array
(
[0] => 2
[user_id] => 2
[1] => 1
[user_active] => 1
[2] => Administrator
[username] => Administrator
[3] => 2236c39cda27b2c5535ce82f3a1e28e0
[user_password] => 2236c39cda27b2c5535ce82f3a1e28e0
[4] => 1104479522
[user_session_time] => 1104479522
. . .
)
将函数调用中的2替换为你喜欢的任何用户 ID 或用户名。此函数可以接受数字 ID 或作为字符串的用户名。
如果你传递第二个参数并设置为TRUE,第一个参数应该是用户名,而不是ID。
编码和解码 IP 地址
phpBB 将存储在数据库中的所有 IP 地址进行编码。encode_ip()和decode_ip()是两个用于此目的的函数。第一个函数接受格式正确的 IP 地址,如127.0.0.1,并返回其编码表示形式。第二个函数接受编码字符串并返回原始 IP 地址。
你可以通过以下代码尝试这些函数:
// the main script work starts here
$ip = $_SERVER[‘REMOTE_ADDR’];
$encoded = encode_ip($ip);
$decoded = decode_ip($encoded);
message_die(
GENERAL_MESSAGE,
‘I know you, your IP address is ‘ . $ip
. ‘. This is encoded as ‘ . $encoded
. ‘ and decoded back as ‘ . $decoded,
‘Encode/decode IP demo’
);
这将导致类似以下的结果:

你可以在书籍的代码下载中找到显示此输出的脚本,命名为misc_encode_decode_ip.php。
显示日期
你可以使用以下 phpBB 函数来显示一个格式化的日期:
create_date($format, $unix_timestamp, $timezone)
它不仅是对gmdate PHP 函数的一个包装(有关详细信息,请参阅php.net/gmdate),而且还负责翻译日期(月份和星期几),并考虑用户在个人资料页面中设置的时区和日期格式偏好。
函数的一个示例用法是打印当前日期和时间,使用用户在个人资料页面中偏好的格式和时间区。你可以通过以下方式实现:
create_date($board_config[‘default_dateformat’], time(), $board_config[‘board_timezone’])
这将返回一个类似以下格式的字符串:Mon Mar 14, 2005 8:56 am。
书籍的代码下载中有一个名为misc_create_date.php的脚本,展示了如何使用此函数。你还可以在章节末尾的定制“What’s Up”脚本中看到函数的使用。
获取被审查词汇列表
以下函数检索被审查词汇及其替换词汇的列表:
obtain_word_list(&$original_words, &$replacement_words)
该函数接受两个通过引用传递的参数。这基本上意味着你向此函数传递两个空数组,然后它将这些数组填充值。
我们可以使用以下方式进行词库屏蔽:
// the text to be filtered
$some_text = "I may contain naughty words.";
// empty arrays
$orig_word = $replacement_word = array();
// get the word lists
obtain_word_list($orig_word, $replacement_word);
// apply filters if there are ones
if ( !empty($orig_word) )
{
$some_text = preg_replace($orig_word, $replacement_word, $post_text);
// now $some_text is filtered
}
不要忘记使用此功能来过滤帖子文本,以及主题标题、投票问题和答案,以及其他任何你觉得需要的地方。
在超链接中保留会话
以下函数通过在 URL 中传递会话标识符来帮助保留用户会话,对于禁用了 cookie 的用户:
append_sid($url, $non_html_amp = false)
注意
每次你在论坛中创建指向其他页面的链接时,都需要调用此函数,否则你将丢失用户访问的会话 ID,phpBB 将为每个访问的页面创建一个新的会话。
函数的第二个参数是可选的;如果它是 true,则在构造 URL 参数时,函数将使用 "&" 而不是正确的 HTML 值 "&"。
示例用法:
$url = ‘viewtopic.php?t=12’;
$url = append_sid($url);
如果你使用 "#"(命名锚点)在 URL 中,请小心;你需要将其添加到 append_sid() 调用之后,否则会话 ID 将无法正确传递。
这是错误的做法:
$url = ‘viewtopic.php?p=21#21’;
$url = append_sid($url);
正确的做法如下:
$url = ‘viewtopic.php?p=21’;
$url = append_sid($url) . ‘#21’;
如果你对这个函数实现的更多细节感兴趣,请查看源文件 includes/sessions.php。
IN_PHPBB
IN_PHPBB 是一个常量,不是一个函数。它之前已经提到过,你可能已经注意到它在每个脚本的顶部定义。
这是一个安全措施,不允许直接通过浏览器访问包含的脚本。在每一个包含脚本中,phpBB 都会检查(并且你的脚本也应该检查)IN_PHPBB 是否已定义。如果没有定义,这意味着有人试图直接在浏览器中访问包含的脚本。他们将收到一个显示 Hack attempt 的错误消息,并且不会被允许进一步操作。
与帖子相关的函数
以下函数有助于你在显示帖子文本时解决问题。
自动创建链接
以下函数将接受任何文本,并将看起来像 URL 或电子邮件的所有字符串都转换为可点击的:
make_clickable($text)
示例:
$text = "Visit Packt at www.packtpub.com today";
$text = make_clickable($text);
echo $text;
此代码片段将输出以下 HTML:
Visit Packt at <a href="http://www.packtpub.com" target="_blank">www.packtpub.com</a> today.
处理表情符号
smilies_pass($text) 函数将替换文本中的所有表情符号代码,并用相应的图像标签的 HTML 代码替换。有关示例,请参阅以下部分。
显示帖子正文
为了正确显示帖子文本,你需要:
-
解析 BB 代码并将其转换为 HTML 代码
-
替换表情符号
-
使链接可点击
-
替换过滤的单词
-
将新行转换为 HTML 换行符
看以下示例(它假设你有一个名为 $row 的数组,其中包含来自帖子文本表的数据库记录)。注意,你需要 BB Code UID,这是将 BB 代码转换为 HTML 的关键。
// start
$post_text = $row[‘post_text’];
// BB code
$post_text = bbencode_second_pass($post_text, $row[‘bbcode_uid’]);
// smilies
$post_text = smilies_pass($post_text);
// clickable links
$post_text = make_clickable($post_text);
// naughty words
$orig_word = $replacement_word = array();
obtain_word_list($orig_word, $replacement_word);
if ( !empty($orig_word) )
{
$post_text = preg_replace($orig_word, $replacement_word, $post_text);
}
$post_text = nl2br($post_text);
注意,为了使此代码块正常工作,你需要在脚本中包含 includes/bbcode.php 文件。这通常在脚本的开头完成,如下所示:
<?php
define(‘IN_PHPBB’, true);
$phpbb_root_path = ‘./’;
include($phpbb_root_path . ‘extension.inc’);
include($phpbb_root_path . ‘common.’.$phpEx);
include($phpbb_root_path . ‘includes/bbcode.’.$phpEx);
编码指南
编码标准和指南始终是一件好事,并且值得遵循。因此,熟悉 phpBB 编码标准和按照这些标准编写您的扩展代码是个好主意。虽然这不是强制性的(即使您的代码不遵循标准,它仍然可以运行),但遵循预设标准可以提高您所编写代码的可维护性。根据 Sun Microsystems 的说法,“软件的终身成本中有 80%用于维护”(来源:java.sun.com/docs/codeconv/中的Java 编程语言编码规范),当采用编码规范时,维护工作会变得更加容易。即使您是您自己代码的维护者,这也是正确的。
使用编码规范背后的想法是尽量减少程序员的个人“手写”风格,统一函数和变量的命名方式,代码缩进方式等。当所有参与项目的程序员使用相同的风格时,人们可以很容易地阅读其他程序员编写的代码,因为它们看起来与您自己编写的方式一致。
您可以在 phpBB.com 的开发区域找到当前的 phpBB 编码标准和指南,网址为area51.phpbb.com/。
最近帖子 MOD
本章的最后一节是关于创建一个名为“最近帖子”MOD(或“最新动态”)的自定义 phpBB 脚本。这个脚本使用了本章前面讨论的技术,旨在总结您对 phpBB 编程和模板使用的知识。
挑战
我们即将创建的脚本将列出论坛中所有论坛的 15 个最新帖子。对于您和其他论坛爱好者来说,有一个概述页面查看论坛上发生的事情非常有用,而无需逐个浏览每个论坛。对于版主和管理员来说也是如此,他们需要了解论坛上发生的一切。
最近帖子列表将尊重用户权限,这意味着如果用户没有访问某个论坛的阅读权限,那么当该用户查看列表时,这个论坛的帖子将不会出现在列表中。
为了给您一个更直观的概念,以下是脚本运行时的截图:

如果某个论坛具有版主权限的用户登录并查看此页面,他们将有一个链接到该论坛的版主控制面板,如下所示:

在右侧列的用户名后面有两个图标。点击第一个图标会将用户带到帖子所在的“查看主题”页面(viewtopic.php)。点击第二个图标不会加载新页面,而是展开帖子标题下方的区域,并在同一屏幕上显示帖子,同时正确处理了 BB 代码和表情符号。这将在下一幅插图中进行展示。

再次点击相同的图标(一旦帖子被展开)会折叠额外的区域并隐藏帖子。
这是一个方便的方法,可以在不离开页面的情况下阅读所有论坛的最新 15 篇帖子。为了保持简单,这个脚本没有引入新的文本或图形。
你即将创建的 Recent Postings MOD 由一个 PHP 脚本和一个模板文件组成。PHP 脚本命名为whatsup.php,托管在 phpBB 根目录下,所以如果你的论坛安装在www.yourdomain.com/forum/,脚本将在www.yourdomain.com/forum/whatsup.php处可访问。
模板
脚本的模板命名为whatsup.tpl,位于templates/subSilver目录中。以下是它的列表:
<span class="nav"><a href="{U_INDEX}" class="nav">{L_INDEX}</a></span>
<table width="100%" cellpadding="5" cellspacing="1" border="0" class="forumline">
<tr>
<th class="thCornerL" height="25" nowrap="nowrap"> {FORUM} </th>
<th width="50" class="thTop" nowrap="nowrap"> {TOPIC} </th>
<th class="thCornerR" nowrap="nowrap"> {POSTER} </th>
</tr>
<!-- BEGIN row -->
<tr>
<td valign="top" class="row1">
<span class="forumlink">
<a class="forumlink" href="{row.U_FORUM}">{row.FORUM_NAME}</a>
</span>
<!-- BEGIN is_mod_switch -->
<span class="name">
<br />
<a href="{row.is_mod_switch.U_FORUM_MODCP}">{row.is_mod_switch.L_MOD}</a>
</span>
<!-- END is_mod_switch -->
</td>
<td valign="top" class="row2">
<span class="topictitle">
{row.TOPIC_TYPE} <a class="topictitle" href="{row.U_TOPIC}">{row.TOPIC_TITLE}</a>
</span>
<br />
<span class="gensmall">{row.GOTO_PAGE}</span>
</td>
<td valign="top" class="row1">
<span class="name"><a href="{row.U_POSTER}">{row.POSTER}</a> {row.IMG_LATEST_POST}
<a href="#" onclick="javascript: document.getElementById(‘{row.POST_ID}’).style.display = (document.getElementById(‘{row.POST_ID}’).style.display == ‘none’) ? ‘’ : ‘none’;">
{row.IMG_VIEW_POST}</a>
</span>
<br />
<span class="postdetails">{row.POST_DATE_TIME}</span>
</td>
</tr>
<tr id="{row.POST_ID}" style="display:none">
<td colspan="3" class="row1">
<div class="postbody" style="padding: 10px;">
{row.POST_TEXT}
</div>
</td>
</tr>
<!-- END row -->
</table>
对于模板来说,没有太多具体的要求,它包含一个有三个列的表格,分别对应论坛、主题和作者。一个循环块包围了两个表格行(<tr> ... </tr>);第一个包含论坛名称、主题和作者信息以及链接的行。第二个包含帖子。它默认隐藏(具有style="display:none"),通过链接到第二个小图标(
)的 JavaScript 在用户请求时显示/隐藏。
在row块内部还有一个嵌套的块。它被称为is_mod_switch,其目的是处理一个“if”情况。这个情况是,如果用户在当前列出的论坛中具有管理员权限,则显示管理员控制面板的链接。这个模板的部分如下所示:
<!-- BEGIN is_mod_switch -->
<span class="name">
<br />
<a href="{row.is_mod_switch.U_FORUM_MODCP}">{row.is_mod_switch .L_MOD}</a>
</span>
<!-- END is_mod_switch -->
代码
现在让我们看看whatsup.php文件。实现方式与本章讨论的所有其他脚本类似,但有一个小的不同:包含了一个额外的文件bbcode.php。它包含了与 BBCode 和表情符号一起工作的必要函数:
<?php
define(‘IN_PHPBB’, true);
$phpbb_root_path = ‘./’;
include($phpbb_root_path . ‘extension.inc’);
include($phpbb_root_path . ‘common.’.$phpEx);
include($phpbb_root_path . ‘includes/bbcode.’.$phpEx);
在包含所需的文件之后,是会话管理,这与本章中所有其他脚本类似:
// Start session management
$userdata = session_pagestart($user_ip, PAGE_INDEX);
init_userprefs($userdata);
然后是用户授权和权限检查:
// Start auth check
$user_can_read = array();
$user_can_read = auth(AUTH_READ, AUTH_LIST_ALL, $userdata);
这个检查验证了用户对所有论坛的阅读权限。在此之后,有一个通过授权结果的循环,以便编译一个包含用户允许阅读的论坛 ID 的数组:
$allowed_forum_ids = array();
foreach ( $user_can_read AS $forum_id => $privileges )
{
if ( !empty($privileges[‘auth_read’]) )
{
$allowed_forum_ids[] = $forum_id;
}
}
权限检查完成后,我们需要从数据库中获取一些数据,为此我们需要执行一个 SQL 字符串。它相当长,因为它连接了五个表以检索所需的信息。查询的逻辑如下:
-
从帖子表中选择了最近的 15 条帖子。获取最近的方法是按帖子自动递增 ID 降序排序。
-
根据帖子表中的主题 ID,将主题表连接起来以检索标题和主题类型等主题数据。
-
根据帖子表中的论坛 ID,将论坛表连接起来以检索论坛数据,例如名称,并且使用已编译的
$allowed_forum_ids数组来过滤允许的论坛。 -
根据帖子表中的帖子 ID,将帖子文本表连接起来以检索帖子正文。
-
最后,根据帖子表中的用户 ID,将用户表连接起来,因为它包含发帖者的用户名,该用户名在列表中显示。
// start SQL string $sql = ‘ SELECT t.topic_title, t.topic_id, t.topic_replies, t.topic_type, t.topic_vote, p.post_id, p.post_time, pt.post_text, pt.bbcode_uid, f.forum_name, f.forum_id, u.username, u.user_id ‘; $sql .= ‘ FROM ‘ . POSTS_TABLE . ‘ AS p ‘; $sql .= ‘ LEFT JOIN ‘ . TOPICS_TABLE . ‘ AS t ON p.topic_id = t.topic_id ‘; $sql .= ‘ LEFT JOIN ‘ . FORUMS_TABLE . ‘ AS f ON t.forum_id = f.forum_id ‘; $sql .= ‘ LEFT JOIN ‘ . POSTS_TEXT_TABLE . ‘ AS pt ON p.post_id = pt.post_id ‘; $sql .= ‘ LEFT JOIN ‘ . USERS_TABLE . ‘ AS u ON p.poster_id = u.user_id ‘; $sql .= ‘ WHERE ‘; $sql .= ‘ f.forum_id IN (‘. implode(‘,’, $allowed_forum_ids) .’)’; $sql .= ‘ ORDER BY p.post_time DESC ‘; $sql .= ‘ LIMIT 0, 15’; // end SQL string
在 SQL 查询组装完成后,执行它:
// execute query
$result = $db->sql_query($sql);
if ( !$result )
{
// check for errors while executing the query
message_die(GENERAL_ERROR, ‘Cannot obtain latest post listing’, ‘’,
__LINE__, __FILE__, $sql);
}
在查询执行成功后,现在是时候遍历结果并替换一些模板变量了。在循环之前,我们检索被审查词汇及其替换列表。请记住,过滤器是在管理面板中设置的。
// censored list
$orig_word = $replacement_word = array();
obtain_word_list($orig_word, $replacement_word);
结果循环开始:
// The loop through the results
while( $row = $db->sql_fetchrow($result) ) {
在循环中要做的第一件事是编译“转到”链接。这些链接就像以下插图中所展示的那样。

获取这些类型链接的代码是从 phpBB 核心脚本(search.php)中借用的,没有进行修改——这是一个很好的例子,说明了你可以从 phpBB 应用程序中学习。
接下来是对一些主题属性进行检查——这个主题是否是粘帖或公告,以及它是否包含投票?将一个值分配给$topic_type变量;这个变量的值将在主题名称之前显示。
// check for topic type - announcement or sticky and/or poll
switch ( $row[‘topic_type’] )
{
case POST_ANNOUNCE:
$topic_type = $lang[‘Topic_Announcement’] . " ";
break;
case POST_STICKY:
$topic_type = $lang[‘Topic_Sticky’] . " ";
default:
$topic_type = ‘’;
}
if ( $row[‘topic_vote’] )
{
$topic_type .= $lang[‘Topic_Poll’];
}
// end topic type check
接下来是对帖子正文的解析。它包括处理 BB 代码,将表情符号代码替换为图像,替换任何过滤词汇,以及将所有看起来像链接或电子邮件地址的字符串变为可点击:
// parse BBcode, smilies, filters, make links clickable
$post_text = $row[‘post_text’];
$post_text = bbencode_second_pass($post_text, $row[‘bbcode_uid’]);
$post_text = smilies_pass($post_text);
$post_text = make_clickable($post_text);
if ( count($orig_word) )
{
$post_text = preg_replace($orig_word, $replacement_word, $post_text);
$topic_title = preg_replace($orig_word, $replacement_word, $row[‘topic_title’]);
}
$post_text = nl2br($post_text);
在这个阶段,所有数据都已检索并按需处理/编译。现在是时候显示它了。所以这就是在row模板块内分配模板变量的开始:
// assign row block variables
$template->assign_block_vars("row",
array(
‘U_FORUM’ => append_sid(‘viewforum.’.$phpEx . "?f=" .
$row[‘forum_id’]),
‘FORUM_NAME’ => $row[‘forum_name’],
‘U_TOPIC’ => append_sid(‘viewtopic.’.$phpEx . "?t=" .
$row[‘topic_id’]),
‘TOPIC_TYPE’ => (empty($topic_type)) ? "" : "<strong>" .
$topic_type . "</strong>",
‘TOPIC_TITLE’ => $topic_title,
‘GOTO_PAGE’ => $goto_page,
‘POSTER’ => $row[‘username’],
‘U_POSTER’ => append_sid(‘profile.’.$phpEx . "?mode=viewprofile&u=" . $row[‘user_id’]),
‘IMG_LATEST_POST’ => ‘<a href="’ . append_sid("viewtopic.$phpEx?p=" . $row[‘post_id’]) . "#" . $row[‘post_id’] . ‘"><img src="img/’ . $images[‘icon_latest_reply’] . ‘" border="0" /></a> ‘,
‘IMG_VIEW_POST’ => ‘<img src="img/’ . $images[‘icon_minipost’] . ‘" border="0" />’,
‘POST_DATE_TIME’ => create_date($board_config[‘default_dateformat’], $row[‘post_time’], $board_config[‘board_timezone’]),
‘POST_TEXT’ => $post_text,
‘POST_ID’ => $row[‘post_id’],
)
);
你可能会对这个代码片段中使用的 phpBB 函数append_sid()(用于在超链接中保持会话 ID)和create_date()(用于格式化日期)感兴趣。它们的用法已经在本章的“技巧与窍门”部分中描述过,但在这里你可以看到它们是如何工作的。
接下来是is_mod_switch,为版主提供一个链接到论坛的版主控制面板:
// process is_mod_switch block
if ( !empty($user_can_read[$row[‘forum_id’]][‘auth_mod’]) )
{
$template->assign_block_vars("row.is_mod_switch",
array(
‘U_FORUM_MODCP’ => ‘modcp.’.$phpEx . "?f=" . $row[‘forum_id’] . "&sid=" . $userdata[‘session_id’],
‘L_MOD’ => $lang[‘Mod_CP’],
)
);
}
结果的循环现在已完成。剩下要做的只是:
-
包含页面头部
-
分配模板文件
-
分配一些全局模板变量(“全局”意味着“在
row循环之外”) -
解析并输出编译后的模板
-
包含页面页脚(尾部)
下面是如何操作的:
// header, body and footer
include($phpbb_root_path . ‘includes/page_header.’.$phpEx);
$template->set_filenames(array(
‘body’ => ‘whatsup.tpl’)
);
$template->assign_vars(
array(
‘FORUM’ => $lang[‘Forum’],
‘TOPIC’ => $lang[‘Topic’],
‘POSTER’ => $lang[‘Author’],
)
);
$template->pparse(‘body’);
include($phpbb_root_path . ‘includes/page_tail.’.$phpEx);
好了!这就是从头开始构建一个全新的 phpBB 脚本的方法。以下是新 phpBB 功能的完整源代码列表,whatsup.php脚本(包含在代码下载中)。将其复制到您的论坛根目录,然后完成!别忘了:whatsup.tpl应该复制到templates/subSilver。
<?php
define(‘IN_PHPBB’, true);
$phpbb_root_path = ‘./’;
include($phpbb_root_path . ‘extension.inc’);
include($phpbb_root_path . ‘common.’.$phpEx);
include($phpbb_root_path . ‘includes/bbcode.’.$phpEx);
// Start session management
$userdata = session_pagestart($user_ip, PAGE_INDEX);
init_userprefs($userdata);
// Start auth check
$user_can_read = array();
$user_can_read = auth(AUTH_READ, AUTH_LIST_ALL, $userdata);
$allowed_forum_ids = array();
foreach ($user_can_read AS $forum_id => $privileges)
{
if ( !empty($privileges[‘auth_read’]) )
{
$allowed_forum_ids[] = $forum_id;
}
}
// end auth check
// start SQL string
$sql = ‘ SELECT t.topic_title, t.topic_id, t.topic_replies, t.topic_type, t.topic_vote, p.post_id, p.post_time, pt.post_text, pt.bbcode_uid, f.forum_name, f.forum_id, u.username, u.user_id ‘;
$sql .= ‘ FROM ‘ . POSTS_TABLE . ‘ AS p ‘;
$sql .= ‘ LEFT JOIN ‘ . TOPICS_TABLE . ‘ AS t ON p.topic_id = t.topic_id ‘;
$sql .= ‘ LEFT JOIN ‘ . FORUMS_TABLE . ‘ AS f ON t.forum_id = f.forum_id ‘;
$sql .= ‘ LEFT JOIN ‘ . POSTS_TEXT_TABLE . ‘ AS pt ON p.post_id = pt.post_id ‘;
$sql .= ‘ LEFT JOIN ‘ . USERS_TABLE . ‘ AS u ON p.poster_id = u.user_id ‘;
$sql .= ‘ WHERE ‘;
$sql .= ‘ f.forum_id IN (‘. implode(‘,’, $allowed_forum_ids) .’)’;
$sql .= ‘ ORDER BY p.post_id DESC ‘;
$sql .= ‘ LIMIT 0, 15’;
// end SQL string
// execute query
$result = $db->sql_query($sql);
if ( !$result )
{
// check for errors while executing the query
message_die(GENERAL_ERROR, ‘Cannot obtain latest post listing’, ‘’, __LINE__, __FILE__, $sql);
}
// censored list
$orig_word = $replacement_word = array();
obtain_word_list($orig_word, $replacement_word);
// The loop through the results
while( $row = $db->sql_fetchrow($result) )
{
// goto page list
$replies = $row[‘topic_replies’];
$topic_id = $row[‘topic_id’];
// reuse from the search page
if ( ( $replies + 1 ) > $board_config[‘posts_per_page’] )
{
$total_pages = ceil( ( $replies + 1 ) / $board_config[‘posts_per_page’] );
$goto_page = ‘ [ <img src="img/’ . $images[‘icon_gotopost’] . ‘" alt="’ . $lang[‘Goto_page’] . ‘" title="’ . $lang[‘Goto_page’] . ‘" />’ . $lang[‘Goto_page’] . ‘: ‘;
$times = 1;
for($j = 0; $j < $replies + 1; $j += $board_config[‘posts_per_page’])
{
$goto_page .= ‘<a href="’ . append_sid("viewtopic.$phpEx?" . POST_TOPIC_URL . "=" . $topic_id . "&start=$j") . ‘">’ . $times . ‘</a>’;
if ( $times == 1 && $total_pages > 4 )
{
$goto_page .= ‘ ... ‘;
$times = $total_pages - 3;
$j += ( $total_pages - 4 ) * $board_config[‘posts_per_page’];
}
else if ( $times < $total_pages )
{
$goto_page .= ‘, ‘;
}
$times++;
}
$goto_page .= ‘ ] ‘;
}
else
{
$goto_page = ‘’;
}
// goto page list ends
// check for topic type - announcement or sticky and/or poll
switch ( $row[‘topic_type’] )
{
case POST_ANNOUNCE:
$topic_type = $lang[‘Topic_Announcement’] . " ";
break;
case POST_STICKY:
$topic_type = $lang[‘Topic_Sticky’] . " ";
default:
$topic_type = ‘’;
}
if ( $row[‘topic_vote’] )
{
$topic_type .= $lang[‘Topic_Poll’];
}
// end topic type check
// parse BBcode, smilies, filters, make links clickable
$post_text = $row[‘post_text’];
$post_text = bbencode_second_pass($post_text, $row[‘bbcode_uid’]);
$post_text = smilies_pass($post_text);
$post_text = make_clickable($post_text);
if ( count($orig_word) )
{
$post_text = preg_replace($orig_word, $replacement_word, $post_text);
$topic_title = preg_replace($orig_word, $replacement_word, $row[‘topic_title’]);
}
$post_text = nl2br($post_text);
// assign row block variables
$template->assign_block_vars("row",
array(
‘U_FORUM’ => append_sid(‘viewforum.’.$phpEx . "?f=" . $row[‘forum_id’]),
‘FORUM_NAME’ => $row[‘forum_name’],
‘U_TOPIC’ => append_sid(‘viewtopic.’.$phpEx . "?t=" . $row[‘topic_id’]),
‘TOPIC_TYPE’ => (empty($topic_type)) ? "" : "<strong>" . $topic_type . "</strong>",
‘TOPIC_TITLE’ => $topic_title,
‘GOTO_PAGE’ => $goto_page,
‘POSTER’ => $row[‘username’],
‘U_POSTER’ => append_sid(‘profile.’.$phpEx . "?mode=viewprofile&u=" . $row[‘user_id’]),
‘IMG_LATEST_POST’ => ‘<a href="’ . append_sid("viewtopic.$phpEx?p=" . $row[‘post_id’]) . "#" . $row[‘post_id’] . ‘"><img src="img/’ . $images[‘icon_latest_reply’] . ‘" border="0" /></a> ‘,
‘IMG_VIEW_POST’ => ‘<img src="img/’ . $images[‘icon_minipost’] . ‘" border="0" />’,
‘POST_DATE_TIME’ => create_date($board_config[‘default_dateformat’], $row[‘post_time’], $board_config[‘board_timezone’]),
‘POST_TEXT’ => $post_text,
‘POST_ID’ => $row[‘post_id’],
)
);
// process is_mod_switch block
if ( !empty($user_can_read[$row[‘forum_id’]][‘auth_mod’]) )
{
$template->assign_block_vars("row.is_mod_switch",
array(
‘U_FORUM_MODCP’ => ‘modcp.’.$phpEx . "?f=" . $row[‘forum_id’] . "&sid=" . $userdata[‘session_id’],
‘L_MOD’ => $lang[‘Mod_CP’],
)
);
}
}
// header, body and footer
include($phpbb_root_path . ‘includes/page_header.’.$phpEx);
$template->set_filenames(array(
‘body’ => ‘whatsup.tpl’)
);
$template->assign_vars(
array(
‘FORUM’ => $lang[‘Forum’],
‘TOPIC’ => $lang[‘Topic’],
‘POSTER’ => $lang[‘Author’],
)
);
$template->pparse(‘body’);
include($phpbb_root_path . ‘includes/page_tail.’.$phpEx);
?>
摘要
这最后一章向你介绍了 phpBB 编程的新鲜和激动人心的世界。本章详细介绍了如何使用不同的 phpBB 函数,如何使用 phpBB 数据库抽象层,phpBB 模板引擎,以及如何正确解析和显示帖子。现在你有了开始编写自己扩展 phpBB 核心功能的基本知识。书中给出了许多示例,这些示例都可以在书籍的代码下载中找到。
试着用示例开始实验是个好主意;稍微调整一下,看看结果如何变化。通过这样做,你会更好地理解不同函数的工作方式,也许一些关于如何自定义和扩展 phpBB 功能的想法也会开始成形。祝你在 phpBB 之旅中愉快!
附录 A. 目录结构
phpBB 2.0 的完整下载包含大约三百个文件,分为二十一目录。为了在您的 phpBB 论坛上进行某些类型的更高级工作,您需要知道哪些目录包含重要文件以及 phpBB 如何使用每个文件。一些目录和文件是可选的,而其他目录和文件对于论坛正确运行是绝对必需的。本附录提供了每个目录及其包含文件的快速总结。
在大多数情况下,您不应重命名任何目录或文件。当然,这也有例外,可能包括安装修改、自定义论坛的某些方面或本书其他地方提到的其他情况。当您更改名称时,请确保您了解您正在做什么。在不进行其他更改的情况下更改目录或文件名通常会导致论坛出现错误,因为它找不到必要的文件。
必需目录
当您从下载的压缩文件中提取 phpBB 时创建的大多数目录必须在您的网站上存在,以便论坛能够无错误地运行。这些基本必需的目录也包含论坛的大部分必要文件,但您会发现所需目录中的一些文件实际上是可选的。
根目录
您的论坛主目录,其中包含 phpBB 论坛的所有相关文件和其他目录,被称为根目录。默认情况下,此目录名为phpBB2。重命名phpBB2是一种常见做法;一些更流行的名称是forums和boards。不需要特定的名称;phpBB 的内部代码将始终使用特殊快捷符号表示法引用此名称。
根目录内的目录以及存储在这些目录中的文件将被单独检查。根目录本身包含许多重要文件,其中大部分文件被论坛成员直接频繁访问。这些文件包括其他文件,或将它们的内容添加到当前代码中,以执行某些必要任务。
有三个例外是extension.inc、common.php和config.php文件,这些文件被根目录中的其他文件包含。以下表格列出了根目录中包含的其他文件及其用途,之后我们将详细检查这三个更重要的文件。
| 文件名 | 文件功能 |
|---|---|
faq.php |
列出关于论坛操作的常见问题。 |
groupcp.php |
列出并管理用户组。 |
index.php |
显示论坛主页,列出分类和论坛。 |
login.php |
记录用户在论坛中的登录和登出操作。 |
memberlist.php |
以多种方式列出所有论坛成员。 |
modcp.php |
管理员控制面板;用于管理主题和帖子。 |
posting.php |
允许创建、编辑和删除帖子。 |
privmsg.php |
发送、接收和显示私密消息。 |
profile.php |
用户账户管理的界面。调用其他文件进行大部分工作。 |
search.php |
以多种方式搜索论坛。 |
viewforum.php |
论坛中的主题列表。 |
viewonline.php |
查看当前正在访问论坛的所有用户,以及他们查看的页面。 |
viewtopic.php |
列出主题内的帖子。 |
extension.inc
作为所有论坛页面调用的第一个文件,extension.inc似乎是最重要的 phpBB 文件之一。然而,它是一个非常简单的文件,几乎从未被修改过。extension.inc的唯一目的是定义一个变量,$phpEx,它包含与服务器上 PHP 代码文件关联的文件扩展名。这个扩展名通常是.php,这也是extension.inc中的默认设置,因此该文件几乎不需要修改。一些使用 PHP 3 的较老服务器可能会使用扩展名.php3而不是.php。如果出于某种原因必须使用这些扩展名之一,则需要在此文件中更改文件扩展名,并将所有以.php结尾的文件重命名,使其以.php3结尾。
common.php
此文件实际上是通过初始化重要变量、调用几乎所有用于正常论坛功能的文件以及设置论坛配置设置来“启动”phpBB 的。在这里还执行了一些与用户数据工作的特殊安全措施。在大多数情况下,common.php将是 phpBB 页面调用的第二个文件。
config.php
论坛需要访问 SQL 数据库的所有信息都存储在config.php文件中。这包括 SQL 服务器的地址或名称、SQL 用户名和密码以及数据库表名称的前缀。所有这些数据在安装 phpBB 时输入,以后可以通过编辑此文件进行修改。
管理文件
通常,您将在根目录内看到的第一个目录称为admin。admin目录包含创建 phpBB 管理控制面板的文件。任何以admin_开头(例如admin_styles.php)的admin目录内的文件也将用于创建在管理控制面板中显示的导航菜单。许多修改通过在此处放置新的admin_文件来添加新的管理部分。以下表格描述了所有默认的admin_文件(管理控制面板文件):
| 管理文件名 | 文件用途 |
|---|---|
admin_board.php |
通用配置管理。 |
admin_db_utilities.php |
基本的 phpBB 数据库备份和恢复。 |
admin_disallow.php |
定义不允许在论坛上使用的用户名。 |
admin_forum_prune.php |
从论坛中删除旧帖子。 |
admin_forumauth.php |
管理论坛的一般权限设置。 |
admin_forums.php |
创建和管理论坛和分类。 |
admin_groups.php |
创建、编辑和删除用户组。 |
admin_mass_email.php |
向所有注册用户发送电子邮件消息。 |
admin_ranks.php |
用户等级管理。 |
admin_smilies.php |
添加、删除或修改表情符号图片。 |
admin_styles.php |
执行所有样式和主题管理。 |
admin_ug_auth.php |
定义特定用户和用户组的权限设置。 |
admin_user_ban.php |
禁用用户、电子邮件地址或 IP 地址。 |
admin_users.php |
管理用户资料。 |
admin_words.php |
指定将在消息中自动被审查的单词。 |
admin目录中任何没有以admin_前缀命名的原始 phpBB 文件都以某种方式参与了其他页面的显示。index.php文件有三个功能:创建控制面板的框架、从admin_文件构建导航菜单,以及显示入口页面。每个管理控制面板页面都使用一个名为pagestart.php的文件,该文件处理面板的用户权限检查。它还可能包含page_header_admin.php文件,该文件创建管理页面的最顶部。匹配的page_footer_admin.php用于终止每个管理页面的处理,并确保其显示。
数据库抽象层文件
phpBB 的一个特性是能够与多种不同类型的 SQL 数据库软件包协同工作。这个特性是通过使用数据库抽象层来实现的,它是一组用于创建一个通用接口的文件,该接口能够访问每个支持的软件包。这些文件位于名为db的目录中。每个支持的软件包都有一个文件。您的论坛只使用特定数据库的文件,因此您可以删除其他文件以节省一些服务器空间。如果删除了这些文件中的任何一个,您在决定稍后更改数据库软件包时将需要恢复它们。下表列出了文件及其对应的数据库软件。db目录中的index.htm文件只是一个占位符,以防止服务器列出目录的内容。这些占位符文件存在于 phpBB 的几个目录中,并且总是命名为index.htm。
| 文件名 | 支持的数据库软件 |
|---|---|
db2.php |
此文件在 phpBB 2.0 中未使用。 |
msaccess.php |
通过 ODBC 使用 Microsoft Access。 |
mssql.php |
Microsoft SQL Server 7/2000。 |
mssql-odbc.php |
通过 ODBC 使用 Microsoft SQL Server。 |
mysql.php |
MySQL 3.2。 |
mysql4.php |
MySQL 4。 |
oracle.php |
Oracle 7 和 8(在 phpBB 2.0.14 中已删除)。 |
postgres7.php |
PostgreSQL 7。 |
包含文件
如前所述,论坛访客访问的大部分页面将包括其他 PHP 文件,并将这些文件的代码作为当前页面的部分进行处理。这些包含的文件中的大量文件存储在论坛的includes目录中。除了一个index.htm占位符外,这里的每个文件实际上都是为其他文件包含而设计的。这些文件中没有任何一个可能会被您的用户直接访问。如果有人尝试直接访问这些文件,他们将只会看到一个空白页面或根据他们选择的文件显示的黑客尝试消息。这些文件中包含的几乎所有代码都是以函数或类形式存在的,这些函数或类将被包含它们的文件引用。以下表格显示了包含的文件:
| 包含文件名 | 文件的使用或内容 |
|---|---|
auth.php |
获取用户权限设置。 |
bbcode.php |
处理消息中的 BBCode 标签。 |
constants.php |
定义在其他文件中使用的大量常量。 |
db.php |
包含基于论坛配置的数据库抽象层文件。 |
emailer.php |
包含用于发送电子邮件的类。 |
functions.php |
包含在许多页面上使用的通用函数。 |
functions_admin.php |
由管理控制和版主控制面板使用的函数。 |
functions_post.php |
处理用于显示和数据库存储的消息。 |
functions_search.php |
执行许多与搜索相关的任务。 |
functions_selects.php |
创建下拉列表的 HTML 选择代码。 |
functions_validate.php |
检查资料信息中的无效或不允许的细节。 |
page_header.php |
显示论坛页眉。 |
page_tail.php |
显示论坛页脚并结束脚本的执行。 |
prune.php |
包含用于删除旧论坛主题的函数。 |
sessions.php |
创建、更新和删除用户会话。 |
smtp.php |
通过 SMTP 发送电子邮件,通常连接到另一个服务器。 |
sql_parse.php |
将 SQL 查询的文本文件转换为数据库管理中使用的形式。 |
template.php |
包含一个将模板文件解析为论坛页面的类。 |
topic_review.php |
在发帖表单上显示主题回顾框。 |
usercp_activate.php |
激活不活跃的用户账户。 |
usercp_avatar.php |
管理头像画廊和上传。 |
usercp_confirm.php |
在注册表单中创建视觉确认图像。 |
usercp_email.php |
允许论坛用户通过论坛界面给其他人发电子邮件。 |
usercp_register.php |
处理注册和资料编辑,包括表单创建。 |
usercp_sendpasswd.php |
重置用户账户密码。 |
usercp_viewprofile.php |
显示用户资料信息。 |
安装文件
install 目录包含用于安装或升级 phpBB 的文件。如果安装完成后此目录仍然存在,phpBB 将显示错误消息,因此您很可能在安装完成后已从论坛中删除了该目录。在升级 phpBB 时,您需要重新创建 install 目录并在其中放置升级安装程序文件。升级安装程序文件的名称会随着每个 phpBB 版本的发布而变化,但通常格式为 update_to_2xxx.php,其中 2xxx 被版本号替换,或者为 update_to_latest.php。一个例子是 update_to_2011.php。升级后,再次删除 install 目录。
install 目录内可能还包含一个名为 schemas 的目录。schemas 文件包含在安装期间用于创建论坛数据库表和默认数据的 SQL 查询。phpBB 2.0 的早期版本将 schemas 放置在 db 目录内。
语言包
提供 phpBB 多语言支持的文件位于 language 目录中。每种语言都由一个以语言命名的子目录表示,并以前缀 lang_ 开头,例如 lang_english, lang_dutch, lang_french 等。首次下载时,phpBB 仅包含 lang_english 用于英文语言文件。每个语言子目录包含定义整个论坛中使用的文本的几个文件。请查看以下表格以了解所有默认语言文件的描述。新语言文件通常在大型修改后添加。
| 文件名 | 文件内容 |
|---|---|
lang_admin.php |
所有仅在管理控制面板中出现的文本。 |
lang_bbcode.php |
创建 BBCode 指南常见问题解答页面。 |
lang_faq.php |
创建主论坛常见问题解答页面。 |
lang_main.php |
论坛主要区域中出现的所有文本。 |
search_stopwords.txt |
列出在论坛搜索和索引中省略的单词。 |
search_synonyms.txt |
列出用作搜索词同义词的单词。 |
每个语言目录内还可能存在一个名为 email 的子目录,结构类似于 language/lang_english/email。email 中的文件是论坛可以发送给用户和管理员的电子邮件模板。以下表格给出了每个电子邮件模板的描述:
| 文件名 | 收件人 | 在...时使用 |
|---|---|---|
admin_activate.tpl |
管理员 | 用户账户必须被激活。 |
admin_send_email.tpl |
用户 | 管理员向论坛成员发送大量电子邮件。 |
admin_welcome_activated .tpl |
用户 | 用户账户由管理员激活。 |
admin_welcome_inactive .tpl |
用户 | 用户注册且管理员必须激活账户。 |
coppa_welcome_inactive .tpl |
用户 | 用户注册且年龄小于 13 岁。 |
group_added.tpl |
用户 | 用户被添加到用户组中。 |
group_approved.tpl |
用户 | 用户请求加入一个群组并被添加。 |
group_request.tpl |
群组管理员 | 用户请求加入管理员用户组。 |
privmsg_notify.tpl |
用户 | 收到一条新的私人消息。 |
profile_send_email.tpl |
用户 | 用户通过论坛给另一位用户发送电子邮件。 |
topic_notify.tpl |
用户 | 用户关注的主题收到新的回复。 |
user_activate.tpl |
用户 | 用户必须激活其账户。 |
user_activate_passwd.tpl |
用户 | 用户请求新的密码。 |
user_welcome.tpl |
用户 | 用户注册且账户激活已关闭。 |
user_welcome_inactive.tpl |
用户 | 用户注册并必须激活其账户。 |
模板存储
最后必需的目录是templates,其中包含与 phpBB 样式系统相关的文件。这是另一个包含重要文件的子目录。在这种情况下,子目录以包含的模板文件集命名。phpBB 附带一套模板文件,因此templates中只有一个目录,即subSilver。
这些模板目录包含用于显示 phpBB 论坛每一页的图像、样式表、配置文件和模板文件。模板文件是文本文件,通常以.tpl扩展名,包含如 HTML 之类的标记代码。以下表格描述了主要的.tpl文件。通常,还会包含一些其他文件,如层叠样式表(.css文件)和模板配置(.cfg文件),这些文件通常以模板命名,例如subSilver.css和subSilver.cfg。
| 文件名 | 用于显示 |
|---|---|
agreement.tpl |
注册协议页面。 |
bbcode.tpl |
无;用于特殊内部 BBCode 处理。 |
confirm_body.tpl |
确认(做某事?:是/否)页面。 |
error_body.tpl |
表单中显示的错误消息。 |
faq_body.tpl |
常见问题解答页面。 |
groupcp_info_body.tpl |
用户组的信息。 |
groupcp_pending_info.tpl |
用户组的待处理成员。 |
groupcp_user_body.tpl |
用户的用户组成员资格。 |
index_body.tpl |
论坛主页;index.php。 |
jumpbox.tpl |
论坛导航下拉菜单。 |
login_body.tpl |
登录表单。 |
memberlist_body.tpl |
会员列表页面。 |
message_body.tpl |
大多数错误或成功页面。 |
modcp_body.tpl |
管理员控制面板中的主题列表。 |
modcp_move.tpl |
主题移动确认和论坛列表。 |
modcp_split.tpl |
主题拆分帖子列表。 |
modcp_viewip.tpl |
与帖子相关的 IP 地址列表和用户。 |
overall_footer.tpl |
正常页面页脚,例如版权详情。 |
overall_header.tpl |
正常页面页眉和网站菜单。 |
posting_body.tpl |
发布表单。 |
posting_poll_body.tpl |
发布表单的区域。 |
posting_preview.tpl |
发布表单的预览区域。 |
posting_smilies.tpl |
从发布表单可访问的弹出表情窗口。 |
posting_topic_review.tpl |
发布表单的主题回顾区域。 |
privmsgs_body.tpl |
私信文件夹列表。 |
privmsgs_popup.tpl |
私信弹出通知窗口。 |
privmsgs_preview.tpl |
私信发布表单的预览区域。 |
privmsgs_read_body.tpl |
私信文本。 |
profile_add_body.tpl |
注册和编辑个人资料表单。 |
profile_avatar_gallery.tpl |
头像画廊子分类。 |
profile_send_email.tpl |
发送电子邮件表单。 |
profile_send_pass.tpl |
失去密码重置表单。 |
profile_view_body.tpl |
用户个人资料页面。 |
search_body.tpl |
完整的搜索表单。 |
search_results_posts.tpl |
以帖子形式显示的搜索结果。 |
search_results_topics.tpl |
以主题形式显示的搜索结果。 |
search_username.tpl |
弹出用户搜索窗口。 |
simple_footer.tpl |
较小的页面页脚,通常在弹出窗口中。 |
simple_header.tpl |
较小的页面页眉,不带网站菜单。 |
viewforum_body.tpl |
论坛中的主题列表。 |
viewonline_body.tpl |
当前在论坛上的用户列表及其访问的页面。 |
viewtopic_body.tpl |
主题内的帖子。 |
viewtopic_poll_ballot.tpl |
主题中的投票表单。 |
viewtopic_poll_result.tpl |
主题中的投票结果列表。 |
每个模板的目录也可以包含模板作者希望包含的任意数量的子目录。唯一必需的子目录是admin,例如templates/subSilver/admin。此目录将包含用于显示管理控制面板的模板文件,如下表所示。
| 文件名 | 用于显示 |
|---|---|
admin_message_body.tpl |
错误和成功消息。 |
auth_forum_body.tpl |
论坛权限:权限编辑器。 |
auth_select_body.tpl |
权限:选择要编辑的论坛或组。 |
auth_ug_body.tpl |
编辑用户或用户组的权限。 |
board_config_body.tpl |
通用分类:配置页面。 |
category_edit_body.tpl |
编辑论坛分类的名称和其他详细信息。 |
db_utils_backup_body.tpl |
数据库实用工具备份表单。 |
db_utils_restore_body.tpl |
数据库实用工具恢复表单。 |
disallow_body.tpl |
禁止使用的用户名页面。 |
forum_admin_body.tpl |
基本论坛详细信息编辑页面。 |
forum_delete_body.tpl |
删除论坛或分类。 |
forum_edit_body.tpl |
编辑论坛的名称和其他详细信息。 |
forum_prune_body.tpl |
论坛修剪区域。 |
forum_prune_result_body.tpl |
完成论坛修剪的详细信息。 |
forum_prune_select_body.tpl |
选择要修剪的论坛。 |
group_edit_body.tpl |
编辑或创建用户组。 |
group_select_body.tpl |
选择要编辑的用户组。 |
index_body.tpl |
管理面板入口页面。 |
index_frameset.tpl |
管理面板框架布局。 |
index_navigate.tpl |
管理面板导航菜单。 |
page_footer.tpl |
页面页脚。 |
page_header.tpl |
页面标题和样式表。 |
ranks_edit_body.tpl |
编辑用户排名的设置或创建排名。 |
ranks_list_body.tpl |
列出所有当前排名。 |
smile_edit_body.tpl |
添加或修改表情符号的设置。 |
smile_import_body.tpl |
从 pak 文件中安装表情符号。 |
smile_list_body.tpl |
列出所有已安装的表情符号。 |
styles_addnew_body.tpl |
安装新样式;列出所有未安装的样式。 |
styles_edit_body.tpl |
创建或编辑主题/样式。 |
styles_exporter.tpl |
导出模板的主题设置。 |
styles_list_body.tpl |
列出所有已安装的样式。 |
user_avatar_gallery.tpl |
头像画廊;用于编辑用户的个人资料。 |
user_ban_body.tpl |
禁用用户工具。 |
user_edit_body.tpl |
编辑用户的个人资料信息。 |
user_email_body.tpl |
向用户发送大量电子邮件。 |
user_select_body.tpl |
选择一个用户进行编辑。 |
words_edit_body.tpl |
添加或编辑被屏蔽的词。 |
words_list_body.tpl |
列出被屏蔽的词。 |
另一个常见的子目录是 images,它可能还包含更多子目录,通常以语言包命名,例如 lang_english。模板目录内的语言目录通常包含带有文本的图像,如回复或发帖按钮。
可选目录
除了你刚刚学到的必需目录外,phpBB 论坛还包括一些可选目录。其中一些可能对论坛本身有益或无用。一般来说,如果你不打算在你的网站上使用它们,删除这些目录及其内容是个好主意。
缓存页面
加速论坛的一种流行方法是添加缓存系统。缓存系统在页面被查看时存储由 phpBB 模板系统生成的代码,然后在页面再次被查看时使用该存储的代码。速度提升来自于引用存储的代码;这比每次查看页面时重新生成代码要快。存储的代码通常保存在 cache 目录下的文件中。phpBB 默认不使用缓存系统,但包含了一些可选的系统,你稍后会看到。为使用这些选项之一,提供了一个 cache 目录。
phpBB 文档
phpBB 的 docs 目录包含文档文件。通过查看这些文件,你可以找到诸如安装和升级说明、phpBB 发布的许可证副本以及有关使用 phpBB 的常见问题解答等信息。这些文件在论坛中没有任何用途,因此可以安全地删除此目录。保留你自己的电脑上的文件副本,以防将来需要引用它们。
图片
images目录通常用作存储表情符号、等级和头像的图片文件的地方。你可以在论坛目录结构中的其他位置放置这些文件,但这样做通常需要在管理控制面板中更改一些配置设置。phpBB 在images目录内提供了smilies(包含默认表情符号)和avatars(头像)子目录。
其他值得注意的目录
在 phpBB 的结构中,除了可选的和必需的目录之外,还有一些其他的目录。这些目录有些独特。phpBB 并不绝对需要它们,但有时你真的没有选择是否包含它们。它们绝对值得仔细研究。
贡献的额外内容
phpBB 附带了一个特殊的contrib目录。它包含了一些你可以选择安装到论坛上的额外插件。要了解这些插件,请阅读浏览器中的README.html文件。包含的插件随 phpBB 的每个版本而变化,但你可以期待看到之前提到的模板缓存系统等。除非你主动将这些插件安装到论坛上,否则 phpBB 不会使用此目录中的任何插件或其他文件。
与install目录类似,如果在你网站上保留contrib目录,phpBB 将会显示错误信息。为了让人们使用你的论坛,你必须删除contrib目录及其中的所有文件。
修改文件
到目前为止,你已经了解了 phpBB 附带的所有目录和文件。在阅读过程中,你可能已经注意到一些部分提到修改可能会在特定区域添加文件。事实是,修改可以对论坛的目录结构做任何事情,包括添加新的目录或文件,移动现有的文件,甚至完全删除一些文件。
许多修改作者已经采用了一个共同的标准,即将新文件放置在根目录内添加的mods目录中。phpBB 在下载时并不包含mods目录;这是一个社区创建的概念。mods目录通常为每个添加文件的修改都有一个子目录,例如prillian用于 Prillian 消息传递修改,phpbb_fetch_all用于 phpBB Fetch All 聚合修改。使用mods来存放新文件可以使它们紧密分组并易于查找。
并非所有修改创建者都会使用mods。有些人会在论坛结构中的其他位置放置新的目录。如果你创建修改,你应该将新文件和目录放置在你感到舒适的位置。除非你安装使用mods目录的修改,否则你不需要创建它。如果这些目录不存在,你需要创建安装的任何修改所使用的目录。
注意
新的语言文件几乎总是放置在language目录中,即使在那些使用mods目录的作者中也是如此。同样,模板文件通常也放在templates目录中。当这些文件存储在这些区域时,跟踪和使用这些文件会更加容易。
附录 B. phpBB 资源
在这里,我们列出了进一步阅读的网页链接和有趣的 phpBB 相关资源。
phpBB.com——文档和支持
phpBB.com 是 phpBB 相关信息和更新的首选网站。在那里,您可以找到定制论坛所需的一切——模板、表情符号、头像、修改等。以下是网站的一些亮点:
-
www.phpbb.com/support/guide/官方的 phpBB 用户指南,当需要寻找答案时,这是第一个需要查看的地方。 -
www.phpbb.com/support/documents.php?mode=faq论坛管理员对常见的 phpBB 问题的回答。这是您用户导向的论坛上 FAQ 的补充。 -
www.phpbb.com/kb/categories.php包含超过 100 篇文章的知识库,涵盖了各种问题——安装、管理、模板和 MODs。 -
www.phpbb.com/support/tutorials/以漂亮的 Flash 动画形式展示 phpBB 教程。您可以准备爆米花,坐下,放松,观看电影。 -
www.phpbb.com/support/支持主页,可以一目了然地列出所有支持选项。它还包含订阅 phpBB 邮件列表的选项。强烈建议您加入邮件列表,以保持对任何安全报告或更新的了解。 -
www.phpbb.com/phpBB/phpBB 社区。在这里,您可以遇到其他论坛管理员,寻找支持 MODs,以及提问(和回答)问题。这是一个拥有超过一百万帖子的巨大信息库。 -
www.phpbb.com/phpBB/viewtopic.php?t=128123提供支持请求模板。它包含了在 phpBB 社区支持论坛请求支持时需要提供的信息。
MODs 和样式
这里有一份简短的资源列表,可以帮助您定制您的论坛:
-
www.phpbb.com/phpBB/catdb.php?db=2这是下载新模板和其他图形(如排名图像、表情符号和其他图标)的地方。至于模板(也称为样式),您可以在实际应用中查看它们,以便决定下载哪一个。模板的演示地址如下:www.phpbb.com/styles/demo.php。 -
www.phpbb.com/mods/这提供了您可以下载的 MODs 列表。它还包含指向 MODs 相关文档的链接。列出的 MODs 是由 phpBB 团队外的爱好者创建的,但由 phpBB MOD 团队验证了与安全相关的问题。 -
phpBB MODs 和样式 可能是寻找 MODs 和样式的最受欢迎的地方,它有一个活跃且友好的支持社区,以及教程、工具等。
编程
如果你正在编写自己的 MODs 和模板或者已经决定开始这样做,那么以下网站将对你很有用:
-
phpBB 开发区 这是 phpBB 网站的开发区域。在这里你可以看到未来版本的截图,并阅读 phpBB 编码风格的指南。
-
phpBB 项目 SourceForge 主页 这是 phpBB 项目的 SourceForge 主页。像许多其他开源项目一样,phpBB 使用 SourceForge 的服务进行软件项目管理,包括源文件托管、版本控制和错误跟踪。
-
phpBB CVS 仓库 这是一个 phpBB CVS 仓库的 Web 界面。CVS(并发版本控制系统)是 phpBB 团队采用的源代码控制系统。它允许你下载软件的过去版本,查看文件随时间的变化,以及下载处于开发中的最新版本。有关 CVS 是什么以及它是如何工作的更多信息,请参阅:
www.cvshome.org/。 -
PHP 编程语言官网 这是 PHP 编程语言的主页。你可以下载 PHP 解释器和阅读安装文档。如果你正在开发 MODs,PHP 手册(
www.php.net/manual/)将非常有帮助,特别是用户贡献的笔记允许其他程序员发布他们针对常见编程问题的解决方案。 -
MySQL 官网 这是 MySQL 数据库的主页。MySQL 参考手册位于:
dev.mysql.com/doc/mysql/。 -
PostgreSQL 官网 这是 PostgreSQL 数据库系统的主页,可能是用于 phpBB 的第二大流行数据库系统。
-
phpBB 模板变量列表 这提供了所有模板变量的综合列表。列表中最有趣的部分是第一部分,通用变量,因为这些可以在所有页面上访问。一旦你包含了头部包含文件,它们就会可用,你可以在自定义脚本中使用它们。更多详情请见第八章。
-
大型论坛优化讨论 这提供了对大型论坛优化的讨论。巨大的go-gaia.com论坛的所有者分享了其优化技巧。
其他感兴趣网站
一些非技术链接,更多地关注在线社区建设和管理的“人”的方面:
-
www.big-boards.com/这是一个互联网上最大论坛的列表。它包含各种论坛:不仅限于 phpBB 驱动的论坛。请注意,互联网上最大的论坛 (go-gaia.com) 是由 phpBB 驱动的! -
www.theadminzone.com/这里提供了 Admin Zone 论坛——在线社区管理员讨论论坛和资源。 -
www.webmasterworld.com/forum103/274.htm这篇文章列出了关于 phpBB 安全性的最佳实践。总的来说,WebmasterWorld 是一个非常不错的社区网站;你可能会对社区建设版块特别感兴趣。它可以通过以下链接访问:www.webmasterworld.com/forum103/。 -
www.sitepoint.com/article/james-atkinson-founder-phpbb这篇文章采访了 phpBB 的创始人 James "The Finn" Atkinson。Sitepoint (www.sitepoint.com/subcat/community-strategy) 是另一个值得访问的好地方,你可以在这里阅读社区建设文章,或者在论坛的社区相关版块闲逛。
附录 C. phpBB 代码和权限速查表
在本附录中,您将找到在发布时使用的 BBCodes 的快速参考,以及描述 phpBB 权限系统的表格。您可以在第三章中找到有关 BBCodes 的更多信息,以及第五章中有关权限的更多信息。
BBCode 速查表
可用的 BBCode 标签根据其目的分为四个类别——用于格式化的标签、用于创建列表的标签、用于引用和代码片段的标签,最后是用于添加图片和链接的标签。
格式化
| 代码 | 结果和注释 |
|---|---|
这是[粗体]粗体[/粗体] |
![]() |
...这是[斜体]斜体[/斜体]。 |
![]() |
现在 - [下划线]下划线 [/下划线]。 |
![]() |
[u][i][b]嵌套...[/b][/i][/u] |
对于嵌套标签,首先关闭你打开的最后一个标签,然后按照相反的顺序继续,直到关闭第一个标签。 |
[color=darkred]使用颜色名称的深红色颜色[/color] |
![]() |
[color=#000099]蓝色,使用 HTML 颜色代码[/color] |
![]() |
[size=1]几乎看不见的文本[/size] |
‘1’是文本大小的最小可能值,这会导致文本几乎看不见。 |
[size=12]正常文本[/size] |
![]() |
[size=29]最大的[/size] |
‘29’是最大的字体大小。 |
列表
| 代码 | 结果和注释 |
|---|---|
[list]``[*]苹果``[*]梨``[*]香蕉``[*]橙子``[/list] |
这是一个无序列表的示例。列表中的每个项目都以[*]开头,以新行结尾。 |
[list=1]``[*]苹果``[*]梨``[*]香蕉``[*]橙子``[/list] |
有序列表的创建方式与无序列表相同——通过在列表标签中添加=1参数。列表总是从 1 开始,所以输入=5不会使列表从 5 开始,而是会使整个列表按原样显示,暴露 BB 标签。 |
[list=a]``[*]苹果``[*]梨``[*]香蕉``[*]橙子``[/list] |
有序列表也可以使用字母而不是数字。 |
[list]``[*]苹果``[*]梨``[*]香蕉``[*]橙子``[list=1][*]苹果``[*]梨``[*]香蕉``[*]橙子``[list=a][*]苹果``[*]梨``[*]香蕉``[*]橙子``[/list]``[/list]``[/list] |
你可以嵌套列表。 |
引用和代码片段
| 代码 | 结果和注释 |
|---|---|
[quote]只是一段引用[/quote] |
![]() |
[quote="The dude"]引用另一个用户[/quote] |
![]() |
[quote=" http://mail.yahoo.com "]Free web mail[/quote] |
这显示了 BBCode 解析器中的一个未记录行为,允许您引用一个网站并同时创建到该网站的链接。注意 URL 周围的空格。 |
[quote=" test@example.com "]I’m a test[/quote] |
phpBB 的 BBCode 解析器中的相同未记录行为允许创建电子邮件链接。 |
[code]``if (!$sleeping)``{``keepPosting();}``[/code] |
![]() code 标签旨在显示代码片段,使用固定宽度字体。 |
[code]``--------------``| Sad | Glad |``--------------``| Mad | Bad |``--------------``[/code] |
![]() code 标签的固定宽度字体允许发布缩进的编程代码,但也可以用于发布表格数据和 ASCII 艺术。 |
插入图片和链接
| 代码 | 结果和评论 |
|---|---|
[img]http://www.packtpub.com/images/Packt.png[/img] |
![]() img 标签允许您在帖子中包含图片,前提是图片在互联网上可用且您知道其 URL。 |
http://www.packtpub.com/``www.packtpub.com |
phpBB 会将任何看起来像 URL 的字符串转换为链接。 |
[url]http://www.packtpub.com/[/url] |
当显式使用[url]时,链接不会下划线。它使用 CSS 样式(postlink),而自动链接转换不会使用。 |
[url=http://www.packtpub.com/]Packt 书店[/url] |
这是添加链接的最佳方式。链接的文本与 URL 不同。 |
[url=http://www.packtpub.com/]``[img]http://www.packtpub.com/images/Packt.png[/img]``[/url] |
这是创建可点击链接图片的示例。 |
权限速查表
权限在第三章(第三章)中略有讨论,然后在第五章(第五章)中详细讨论。下表提供了此类权限的快速参考。
权限类型
| 权限类型 | 描述 |
|---|---|
| 查看 | 用户可以在论坛首页看到论坛的存在。 |
| 阅读 | 用户可以列出论坛主题,阅读帖子,并查看成员的资料和联系信息。 |
| 回复 | 用户可以就现有主题发表意见。 |
| 发布 | 用户可以开始新主题。 |
| 编辑 | 用户可以编辑自己的帖子。 |
| 删除 | 用户可以删除自己的帖子,只要没有人回复它们。 |
| 粘贴 | 用户可以开始粘贴主题。 |
| 公告 | 用户可以发布公告。 |
| 投票 | 用户可以在投票中投票。 |
| 投票创建 | 用户可以为他人创建投票。 |
权限级别
| 权限级别 | 描述 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| ALL | 访问论坛的所有人,包括当前未登录的成员。 |
| REG | 登录的注册版主。 |
| PRIVATE | 一个单独分配的特殊权限级别。(参考第五章。) |
| MOD | 可以对论坛做任何事情的版主。 |
| ADMIN | 论坛管理员——可以访问管理面板的人。 |
简易模式权限
| 公共 | 注册用户 | 注册用户 [隐藏] | 私有 | 私有 [隐藏] | 管理员 | 管理员 [隐藏] | |
|---|---|---|---|---|---|---|---|
| 查看 | ALL | ALL | REG | ALL | PRIVATE | ALL | MOD |
| 读取 | ALL | ALL | REG | PRIVATE | PRIVATE | MOD | MOD |
| 发布 | ALL | REG | REG | PRIVATE | PRIVATE | MOD | MOD |
| 回复 | ALL | REG | REG | PRIVATE | PRIVATE | MOD | MOD |
| 编辑 | REG | REG | REG | PRIVATE | PRIVATE | MOD | MOD |
| 删除 | REG | REG | REG | PRIVATE | PRIVATE | MOD | MOD |
| 置顶 | MOD | MOD | MOD | PRIVATE | PRIVATE | MOD | MOD |
| 公告 | MOD | MOD | MOD | MOD | MOD | MOD | MOD |
| 投票 | REG | REG | REG | PRIVATE | PRIVATE | MOD | MOD |
| 投票创建 | REG | REG | REG | PRIVATE | PRIVATE | MOD | MOD |
附录 D. phpBB 数据库结构
本附录描述了所有 phpBB 数据库表,列出了它们的字段、关系以及简要说明每个表字段的注释。正如您所知,phpBB 数据库表可以有前缀,这是在安装时由您指定的。在本附录中,使用了默认的 phpbb_ 前缀。本附录是在 phpMyAdmin 的帮助下创建的(www.phpmyadmin.net)。
phpbb_auth_access
此表定义了组(和用户)权限。
| Field | Type | Null | Default | Comments |
|---|---|---|---|---|
| group_id | mediumint(8) | No | 0 | 来自用户组的组 ID。每个用户都是某个组的成员,即使该用户是该组的唯一成员。从这个意义上讲,只有组权限在此表中设置。链接到:phpbb_groups -> group_id |
| forum_id | smallint(5) | No | 0 | 来自论坛表的论坛 ID。链接到:phpbb_forums -> forum_id |
| auth_view | tinyint(1) | No | 0 | 此组是否允许查看具有指定论坛 ID 的论坛?“查看”意味着看到该论坛存在。值是 0 表示“否”,1 表示“是”。其余字段使用相同的值。 |
| auth_read | tinyint(1) | No | 0 | 此组是否允许阅读论坛? |
| auth_post | tinyint(1) | No | 0 | 该组是否允许在论坛中创建主题? |
| auth_reply | tinyint(1) | No | 0 | 此组是否允许回复现有主题? |
| auth_edit | tinyint(1) | No | 0 | 此组是否允许编辑自己的帖子? |
| auth_delete | tinyint(1) | No | 0 | 此组是否允许删除自己的帖子? |
| auth_sticky | tinyint(1) | No | 0 | 此组是否允许创建置顶主题? |
| auth_announce | tinyint(1) | No | 0 | 此组是否允许发布公告? |
| auth_vote | tinyint(1) | No | 0 | 此组是否允许在现有投票中投票? |
| auth_pollcreate | tinyint(1) | No | 0 | 此组是否允许创建新的投票? |
| auth_attachments | tinyint(1) | No | 0 | 此组是否允许将文件附加到帖子中(在标准 phpBB 版本中未使用)。 |
| auth_mod | tinyint(1) | No | 0 | 此组是否允许管理论坛? |
phpbb_banlist
此表包含被禁止的 IP 地址、用户 ID 或电子邮件地址。
| Field | Type | Null | Default | Comments |
|---|---|---|---|---|
| ban_id | mediumint(8) | No | - | 自动递增。 |
| ban_userid | mediumint(8) | No | 0 | 根据用户表定义的被禁止用户的 ID。链接到:phpbb_users -> user_id |
| ban_ip | varchar(8) | No | - | 被禁止的 IP 地址(加密)。 |
| ban_email | varchar(255) | Yes | NULL | 被禁止的电子邮件地址。 |
phpbb_categories
此表存储论坛类别。
| Field | Type | Null | Default | Comments |
|---|---|---|---|---|
| cat_id | mediumint(8) | No | - | 自动递增。 |
| cat_title | varchar(100) | Yes | NULL | 类别的标题。 |
| cat_order | mediumint(8) | No | 0 | 类别的显示顺序。 |
phpbb_config
此表存储了论坛配置。
| 字段 | 类型 | 可空 | 默认值 | 备注 |
|---|---|---|---|---|
| config_name | 可变字符(255) | 否 | - | 配置变量的名称。 |
| config_value | 可变字符(255) | 否 | - | 配置变量的值。 |
phpbb_confirm
在此 phpBB 版本中未使用。
| 字段 | 类型 | 可空 | 默认值 | 备注 |
|---|---|---|---|---|
| confirm_id | 字符(32) | 否 | - | - |
| session_id | 字符(32) | 否 | - | - |
| code | 字符(6) | 否 | - | - |
phpbb_disallow
在此表中定义的用户名在注册时是不允许的。
| 字段 | 类型 | 可空 | 默认值 | 备注 |
|---|---|---|---|---|
| 不允许 ID | 中型整型(8) | 否 | 自动递增。 | |
| 不允许的用户名 | 可变字符(25) | 否 | 不允许作为用户名的字符串。 |
phpbb_forum_prune
此表定义了论坛修剪的规则。
| 字段 | 类型 | 可空 | 默认值 | 备注 |
|---|---|---|---|---|
| prune_id | 中型整型(8) | 否 | 自动递增。 | |
| forum_id | 小型整型(5) | 否 | 0 | 来自论坛表的 ID。链接到:phpbb_forums -> forum_id |
| prune_days | 小型整型(5) | 否 | 0 | 主题应有多旧才能被删除。 |
| prune_freq | 小型整型(5) | 否 | 0 | phpBB 应多久检查一次要删除的主题。1的值表示“每天”。 |
phpbb_forums
此表包含有关论坛的信息。
| 字段 | 类型 | 可空 | 默认值 | 备注 |
|---|---|---|---|---|
| 论坛 ID | 小型整型(5) | 否 | 0 | 自动递增。 |
| cat_id | 中型整型(8) | 否 | 0 | 来自分类表的 ID。此论坛所属的分类。链接到:phpbb_categories -> cat_id |
| forum_name | 可变字符(150) | 是 | NULL | 论坛标题。 |
| 论坛描述 | 文本 | 是 | NULL | 论坛描述。 |
| 论坛状态 | 小型整型(4) | 否 | 0 | 论坛状态(0 为启用,1表示禁用)。 |
| forum_order | 中型整型(8) | 否 | 1 | 相对于同一类别的其他论坛的显示顺序。 |
| forum_posts | 中型整型(8) | 否 | 0 | 到目前为止此论坛中的帖子数。 |
| 论坛主题 | 中型整型(8) | 否 | 0 | 本论坛的主题总数。 |
| forum_last_post_id | 中型整型(8) | 否 | 0 | 来自帖子表的最后帖子的 ID。链接到:phpbb_posts -> post_id |
| prune_next | 整型(11) | 是 | NULL | 下次论坛修剪的日期(Unix 时间戳)。 |
| prune_enable | 小型整型(1) | 否 | 0 | 是否为该论坛启用修剪? |
| auth_view | 小型整型(2) | 否 | 0 | 允许查看的权限级别(谁可以查看)。0是全部,1是注册用户,2是私有,3是版主。这些值适用于本表中其余列。 |
| auth_read | 小型整型(2) | 否 | 0 | 谁可以阅读论坛?查看auth_view以获取允许的值。 |
| auth_post | 小型整型(2) | 否 | 0 | 谁可以在论坛中创建主题?查看auth_view以获取允许的值。 |
| auth_reply | tinyint(2) | No | 0 | 谁可以在论坛中回复现有主题?请参阅auth_view以获取允许的值。 |
| auth_edit | tinyint(2) | No | 0 | 谁可以在论坛中编辑帖子?请参阅auth_view以获取允许的值。 |
| auth_delete | tinyint(2) | No | 0 | 谁可以删除论坛中的帖子?请参阅auth_view以获取允许的值。 |
| auth_sticky | tinyint(2) | No | 0 | 谁可以在论坛中创建置顶主题?请参阅auth_view以获取允许的值。 |
| auth_announce | tinyint(2) | No | 0 | 谁可以在论坛中创建公告主题?请参阅auth_view以获取允许的值。 |
| auth_vote | tinyint(2) | No | 0 | 谁可以在论坛中的投票中投票?请参阅auth_view以获取允许的值。 |
| auth_pollcreate | tinyint(2) | No | 0 | 谁可以在论坛中创建新的投票?请参阅auth_view以获取允许的值。 |
| auth_attachments | tinyint(2) | No | 0 | 谁可以在论坛中的帖子中附加文件?在此库存 phpBB 版本中未使用。 |
phpbb_groups
此表包含用户组信息。
| Field | Type | Null | Default | 评论 |
|---|---|---|---|---|
| group_id | mediumint(8) | No | - | 自增。 |
| group_type | tinyint(4) | No | 1 | 组类型。0是公开组,1是封闭组,2是隐藏组。 |
| group_name | varchar(40) | No | - | 组名称。 |
| group_description | varchar(255) | No | - | 组描述。 |
| group_moderator | mediumint(8) | No | 0 | 组管理员的 ID。对于个人用户组为0。链接到:phpbb_users -> user_id |
| group_single_user | tinyint(1) | No | 1 | 如果此组是单个用户的个人组,则为1;如果是成员更多的正常组,则为0。 |
phpbb_posts
此表包含关于帖子的信息。
| Field | Type | Null | Default | 评论 |
|---|---|---|---|---|
| post_id | mediumint(8) | No | - | 自增。 |
| topic_id | mediumint(8) | No | 0 | 来自主题表的主题 ID。链接到:phpbb_topics -> topic_id |
| forum_id | smallint(5) | No | 0 | 来自论坛表的论坛 ID。链接到:phpbb_forums -> forum_id |
| poster_id | mediumint(8) | No | 0 | 来自用户表的用户 ID。链接到:phpbb_users -> user_id |
| post_time | int(11) | No | 0 | 帖子时间作为 Unix 时间戳。 |
| poster_ip | varchar(8) | No | - | 发布帖子的用户的编码 IP 地址。 |
| post_username | varchar(25) | Yes | NULL | 发布者的用户名。仅适用于匿名发布者。如果发布者已登录,则值为 NULL。此外,当您删除用户时,所有帖子都会显示为匿名发布,phpBB 会在用户删除时为所有用户帖子填充此字段。 |
| enable_bbcode | tinyint(1) | No | 1 | 发帖者设置的选项,用于确定是否应处理并替换为 HTML 的任何 BBcode。 |
| enable_html | tinyint(1) | No | 0 | 与上述类似,但针对的是启用/禁用 HTML 选项。 |
| enable_smilies | tinyint(1) | No | 1 | 与上面相同,但与是否解析表情符号或仅保留表情符号代码有关。 |
| enable_sig | tinyint(1) | No | 1 | 是否将发帖者的签名附加到帖子中。 |
| post_edit_time | int(11) | Yes | NULL | 帖子最后编辑的时间(Unix 时间戳)。 |
| post_edit_count | smallint(5) | No | 0 | 该帖子被编辑的次数。 |
phpbb_posts_text
该表包含帖子的实际文本。
| 字段 | 类型 | 可空 | 默认值 | 备注 |
|---|---|---|---|---|
| post_id | mediumint(8) | No | 0 | 从帖子表中获取的帖子 ID。链接到:phpbb_posts -> post_id |
| bbcode_uid | varchar(10) | No | - | BBCode 处理器使用的标识字符串。 |
| post_subject | varchar(60) | Yes | NULL | 帖子的主题。 |
| post_text | text | Yes | NULL | 帖子的文本。 |
phpbb_privmsgs
该表包含关于私人消息的数据。
| 字段 | 类型 | 可空 | 默认值 | 备注 |
|---|---|---|---|---|
| privmsgs_id | mediumint(8) | No | - | 自动递增。 |
| privmsgs_type | tinyint(4) | No | 0 | 消息的类型。从0到5的整数值,其中0是已读消息,1是新消息,2是已发送消息,3是已保存,4是已保存的发送消息,5是未读。 |
| privmsgs_subject | varchar(255) | No | 0 | 消息的主题。 |
| privmsgs_from_userid | mediumint(8) | No | 0 | 发送者的用户 ID。链接到:phpbb_users -> user_id |
| privmsgs_to_userid | mediumint(8) | No | 0 | 收件人的用户 ID。链接到:phpbb_users -> user_id |
| privmsgs_date | int(11) | No | 0 | 消息发送时的 Unix 时间戳。 |
| privmsgs_ip | varchar(8) | No | - | 发送者的编码 IP 地址。 |
| privmsgs_enable_bbcode | tinyint(1) | No | 1 | 发送者是否为这条消息启用了 BBCode? |
| privmsgs_enable_html | tinyint(1) | No | 0 | 发送者是否为这条消息启用了 HTML 代码? |
| privmsgs_enable_smilies | tinyint(1) | No | 1 | 发送者是否为这条消息启用了表情符号? |
| privmsgs_attach_sig | tinyint(1) | No | 1 | 发送者是否勾选了将签名附加到消息中的字段? |
phpbb_privmsgs_text
该表包含私人消息的文本。
| 字段 | 类型 | 可空 | 默认值 | 备注 |
|---|---|---|---|---|
| privmsgs_text_id | mediumint(8) | No | 0 | 从私人消息表中获取的 ID。链接到:phpbb_privmsgs -> privmsgs_id |
| privmsgs_bbcode_uid | varchar(10) | No | 0 | BBCode 解析器所需的标识字符串。 |
| privmsgs_text | text | Yes | NULL | 私人消息的文本。 |
phpbb_ranks
该表包含用户等级的定义。
| 字段 | 类型 | 可空 | 默认值 | 备注 |
|---|---|---|---|---|
| rank_id | smallint(5) | No | - | 自动递增。 |
| rank_title | varchar(50) | No | - | 等级的标题。 |
| rank_min | mediumint(8) | No | 0 | 该等级所需的帖子最小数量。 |
| rank_special | tinyint(1) | Yes | 0 | 对于特殊等级为 1,否则为 0。 |
| rank_image | varchar(255) | Yes | NULL | 等级图像文件名和路径,相对于 phpBB 安装的位置。 |
phpbb_search_results
此表包含搜索结果数据。
| 字段 | 类型 | Null | 默认 | 备注 |
|---|---|---|---|---|
| search_id | int(11) | No | 0 | 搜索标识符。 |
| session_id | varchar(32) | No | - | 会话标识符,来自 sessions 表。链接到: phpbb_sessions -> session_id |
| search_array | text | No | - | 序列化的搜索结果数据数组。 |
phpbb_search_wordlist
此表包含论坛中使用的词汇。
| 字段 | 类型 | Null | 默认 | 备注 |
|---|---|---|---|---|
| word_text | varchar(50) | No | - | 实际的词。 |
| word_id | mediumint(8) | No | - | 自动递增。 |
| word_common | tinyint(1) | No | 0 | 对于常用词为 1,否则为 0。 |
phpbb_search_wordmatch
此表存储有关词使用位置的信息。
| 字段 | 类型 | Null | 默认 | 备注 |
|---|---|---|---|---|
| post_id | mediumint(8) | No | 0 | 来自 postings 表的帖子 ID。链接到: phpbb_posts -> post_id |
| word_id | mediumint(8) | No | 0 | 来自搜索词列表表的词 ID。链接到: phpbb_search_wordslist -> word_id |
| title_match | tinyint(1) | No | 0 | 如果词出现在帖子标题中则为 1,否则为 0。 |
phpbb_sessions
此表存储有关当前会话的数据。
| 字段 | 类型 | Null | 默认 | 备注 |
|---|---|---|---|---|
| session_id | char(32) | No | - | 唯一会话 ID。 |
| session_user_id | mediumint(8) | No | 0 | 来自 users 表的用户 ID,如果会话属于未登录用户则为 -1。链接到: phpbb_users -> user_id |
| session_start | int(11) | No | 0 | 会话开始时的 Unix 时间戳。 |
| session_time | int(11) | No | 0 | 最后访问页面的 Unix 时间戳。 |
| session_ip | char(8) | No | 0 | 用户的编码 IP 地址。 |
| session_page | int(11) | No | 0 | 用户当前查看的页面标识符。页面在 includes/constants.php 文件中定义为带有减号的常量。具有非负整数值的页面实际上是论坛 ID。 |
| session_logged_in | tinyint(1) | No | 0 | 如果会话属于已登录用户则为 1,否则为 0。 |
phpbb_smilies
表情符号存储库。
| 字段 | 类型 | Null | 默认 | 备注 |
|---|---|---|---|---|
| smilies_id | smallint(5) | No | - | 自动递增。 |
| code | varchar(50) | Yes | NULL | 表情符号代码(如 “😃”)。 |
| smile_url | varchar(100) | Yes | NULL | 表情图像的文件名。 |
| emoticon | varchar(75) | Yes | NULL | 表情符号代表的情感类型,例如快乐、烦躁等。 |
phpbb_themes
此表包含主题设置。
| 字段 | 类型 | Null | 默认 | 备注 |
|---|---|---|---|---|
| themes_id | mediumint(8) | No | - | 自动递增。 |
| template_name | varchar(30) | 否 | - | 模板的名称。 |
| style_name | varchar(30) | 否 | - | 样式的名称。 |
| head_stylesheet | varchar(100) | 是 | NULL | 样式表的文件名(.css)。 |
| body_background | varchar(100) | 是 | NULL | 作为页面背景使用的任何图像的文件名。 |
| body_bgcolor | varchar(6) | 是 | NULL | 页面背景的十六进制(Hex)颜色代码,例如‘ff00ff’。注意颜色代码前没有井号(#)。 |
| body_text | varchar(6) | 是 | NULL | 页面上使用的文本颜色的十六进制代码。 |
| body_link | varchar(6) | 是 | NULL | 链接的颜色。 |
| body_vlink | varchar(6) | 是 | NULL | 访问链接的颜色。 |
| body_alink | varchar(6) | 是 | NULL | 激活链接的颜色。 |
| body_hlink | varchar(6) | 是 | NULL | 鼠标悬停链接的颜色(当鼠标悬停在链接上时)。 |
| tr_color1 | varchar(6) | 是 | NULL | 这些字段的描述在phpbb_themes_name表中。 |
| tr_color2 | varchar(6) | 是 | NULL | |
| tr_color3 | varchar(6) | 是 | NULL | |
| tr_class1 | varchar(25) | 是 | NULL | |
| tr_class2 | varchar(25) | 是 | NULL | |
| tr_class3 | varchar(25) | 是 | NULL | |
| th_color1 | varchar(6) | 是 | NULL | |
| th_color2 | varchar(6) | 是 | NULL | |
| th_color3 | varchar(6) | 是 | NULL | |
| th_class1 | varchar(25) | 是 | NULL | |
| th_class2 | varchar(25) | 是 | NULL | |
| th_class3 | varchar(25) | 是 | NULL | |
| td_color1 | varchar(6) | 是 | NULL | |
| td_color2 | varchar(6) | 是 | NULL | |
| td_color3 | varchar(6) | 是 | NULL | |
| td_class1 | varchar(25) | 是 | NULL | |
| td_class2 | varchar(25) | 是 | NULL | |
| td_class3 | varchar(25) | 是 | NULL | |
| fontface1 | varchar(50) | 是 | NULL | |
| fontface2 | varchar(50) | 是 | NULL | |
| fontface3 | varchar(50) | 是 | NULL | |
| fontsize1 | tinyint(4) | 是 | NULL | |
| fontsize2 | tinyint(4) | 是 | NULL | |
| fontsize3 | tinyint(4) | 是 | NULL | |
| fontcolor1 | varchar(6) | 是 | NULL | 这些字段的描述在phpbb_themes_name表中。 |
| fontcolor2 | varchar(6) | 是 | NULL | |
| fontcolor3 | varchar(6) | 是 | NULL | |
| span_class1 | varchar(25) | 是 | NULL | |
| span_class2 | varchar(25) | 是 | NULL | |
| span_class3 | varchar(25) | 是 | NULL | |
| img_size_poll | smallint(5) | 是 | NULL | 未使用。 |
| img_size_privmsg | smallint(5) | 是 | NULL | 未使用。 |
phpbb_themes_name
在主题表中设置的元素名称。
| 字段 | 类型 | 可空 | 默认值 | 备注 |
|---|---|---|---|---|
| themes_id | smallint(5) | 否 | 0 | - |
| tr_color1_name | char(50) | 是 | NULL | - |
| tr_color2_name | char(50) | 是 | NULL | - |
| tr_color3_name | char(50) | 是 | NULL | - |
| tr_class1_name | char(50) | 是 | NULL | - |
| tr_class2_name | char(50) | 是 | NULL | - |
| tr_class3_name | char(50) | 是 | NULL | - |
| th_color1_name | char(50) | Yes | NULL | - |
| th_color2_name | char(50) | Yes | NULL | - |
| th_color3_name | char(50) | Yes | NULL | - |
| th_class1_name | char(50) | Yes | NULL | - |
| th_class2_name | char(50) | Yes | NULL | - |
| th_class3_name | char(50) | Yes | NULL | - |
| td_color1_name | char(50) | Yes | NULL | - |
| td_color2_name | char(50) | Yes | NULL | - |
| td_color3_name | char(50) | Yes | NULL | - |
| td_class1_name | char(50) | Yes | NULL | - |
| td_class2_name | char(50) | Yes | NULL | - |
| td_class3_name | char(50) | Yes | NULL | - |
| fontface1_name | char(50) | Yes | NULL | - |
| fontface2_name | char(50) | Yes | NULL | - |
| fontface3_name | char(50) | Yes | NULL | - |
| fontsize1_name | char(50) | Yes | NULL | - |
| fontsize2_name | char(50) | Yes | NULL | - |
| fontsize3_name | char(50) | Yes | NULL | - |
| fontcolor1_name | char(50) | Yes | NULL | - |
| fontcolor2_name | char(50) | Yes | NULL | - |
| fontcolor3_name | char(50) | Yes | NULL | - |
| span_class1_name | char(50) | Yes | NULL | - |
| span_class2_name | char(50) | Yes | NULL | - |
| span_class3_name | char(50) | Yes | NULL | - |
phpbb_topics
此表包含有关主题的数据。
| Field | Type | Null | Default | Comments |
|---|---|---|---|---|
| topic_id | mediumint(8) | No | - | 自增。 |
| forum_id | smallint(8) | No | 0 | 来自论坛表的论坛 ID。链接到: phpbb_forums -> forum_id |
| topic_title | char(60) | No | - | 主题标题。 |
| topic_poster | mediumint(8) | No | 0 | 开始主题的用户 ID。链接到: phpbb_users -> user_id |
| topic_time | int(11) | No | 0 | 主题开始时的 Unix 时间戳。 |
| topic_views | mediumint(8) | No | 0 | 主题被查看的次数。 |
| topic_replies | mediumint(8) | No | 0 | 主题中的回复数量。 |
| topic_status | tinyint(3) | No | 0 | 主题的状态。0为正常,1为锁定,2为已移动。 |
| topic_vote | tinyint(1) | No | 0 | 如果主题附加了投票,则为1,否则为0。 |
| topic_type | tinyint(3) | No | 0 | 0为普通主题,1为置顶主题,2为公告。 |
| topic_first_post_id | mediumint(8) | No | 0 | 本主题第一帖子的 ID。链接到: phpbb_posts -> post_id |
| topic_last_post_id | mediumint(8) | No | 0 | 本主题最后帖子的 ID。链接到: phpbb_posts -> post_id |
| topic_moved_id | mediumint(8) | No | 0 | 如果这是一个仅作为占位符保留在论坛中的服务主题,则此字段包含已移动主题的 ID。链接到: phpbb_topics -> topic_id |
phpbb_topics_watch
此表包含正在监视特定主题的用户列表。“监视”意味着用户已请求在监视的主题中发布回复时通知他们。
| Field | Type | Null | Default | Comments |
|---|---|---|---|---|
| topic_id | mediumint(8) | No | 0 | 正在关注的主题 ID(在主题表中定义)。链接到: phpbb_topics -> topic_id |
| user_id | mediumint(8) | No | 0 | 来自用户表的用户 ID,观察者。链接到: phpbb_users -> user_id |
| notify_status | tinyint(1) | No | 0 | 如果用户被通知,则为1,否则为0。 |
phpbb_user_group
包含组和组用户的交换板表。
| 字段 | 类型 | Null | 默认值 | 备注 |
|---|---|---|---|---|
| group_id | mediumint(8) | No | 0 | 来自组表的组 ID。链接到: phpbb_groups -> group_id |
| user_id | mediumint(8) | No | 0 | 来自用户表的用户 ID。链接到: phpbb_users -> user_id |
| user_pending | tinyint(1) | Yes | NULL | 如果用户处于待定状态,则为1,否则为0。 |
phpbb_users
用户仓库。
| 字段 | 类型 | Null | 默认值 | 备注 |
|---|---|---|---|---|
| user_id | mediumint(8) | No | 0 | 自增。 |
| user_active | tinyint(1) | Yes | 1 | 用户是否活跃?1为是,0为否。 |
| username | varchar(25) | No | - | 用户名。 |
| user_password | varchar(32) | No | 密码。 | |
| user_session_time | int(11) | No | 0 | 用户最后访问的页面时间戳。 |
| user_session_page | smallint(5) | No | 0 | 用户最后查看的页面。 |
| user_lastvisit | int(11) | No | 0 | 最后登录时间戳。 |
| user_regdate | int(11) | No | 0 | 注册日期的 Unix 时间戳。 |
| user_level | tinyint(4) | Yes | 0 | 0为普通用户,1为管理员,2为版主。 |
| user_posts | mediumint(8) | No | 0 | 该用户发布的帖子总数。 |
| user_timezone | decimal(5,2) | No | 0.00 | 用户的时区。 |
| user_style | tinyint(4) | Yes | NULL | 从主题表中选择的样式 ID。链接到: phpbb_themes -> themes_id |
| user_lang | varchar(255) | Yes | NULL | 用户选择的语言。 |
| user_dateformat | varchar(14) | No | d M Y H:i | 在论坛上显示的所有日期的格式。 |
| user_new_privmsg | smallint(5) | No | 0 | 新私信总数。 |
| user_unread_privmsg | smallint(5) | No | 0 | 未读私信总数。 |
| user_last_privmsg | int(11) | No | 0 | 收到最新私信的 Unix 时间戳。 |
| user_emailtime | int(11) | Yes | NULL | 使用 phpBB 电子邮件功能发送给用户的最后电子邮件的 Unix 时间戳。 |
| user_viewemail | tinyint(1) | Yes | NULL | 如果此用户决定公开电子邮件,则为1,否则为0。 |
| user_attachsig | tinyint(1) | Yes | NULL | 如果用户的签名默认附加,则为1,否则为0。 |
| user_allowhtml | tinyint(1) | Yes | 1 | 如果用户决定在帖子中默认启用 HTML,则为1,否则为0。 |
| user_allowbbcode | tinyint(1) | Yes | 1 | 如果用户决定在帖子中默认启用 BBCode,则为1,否则为0。 |
| user_allowsmile | tinyint(1) | 是 | 1 | 如果用户决定在帖子中默认启用表情符号,则为1,否则为0。 |
| user_allowavatar | tinyint(1) | 否 | 1 | 如果允许此用户拥有头像,则为1。 |
| user_allow_pm | tinyint(1) | 否 | 1 | 如果允许此用户使用私人消息系统,则为1。 |
| user_allow_viewonline | tinyint(1) | 否 | 1 | 如果用户同意使其状态(在线/离线)公开,则为1。 |
| user_notify | tinyint(1) | 否 | 1 | 如果用户选择通过电子邮件通知回复,则为1,否则为0。 |
| user_notify_pm | tinyint(1) | 否 | 0 | 如果用户选择通过电子邮件通知任何新的私人消息,则为1,否则为0。 |
| user_popup_pm | tinyint(1) | 否 | 0 | 如果应通过新弹出窗口通知用户新的私人消息,则为1,否则为0。 |
| user_rank | int(11) | 是 | 0 | 分配给用户的等级 ID。链接到:phpbb_ranks -> rank_id |
| user_avatar | varchar(100) | 是 | NULL | 用户的头像。用户头像图像的 URL 或服务器路径和文件名。 |
| user_avatar_type | tinyint(4) | 否 | 0 | 头像类型。0表示无,1表示上传,2表示远程,3表示相册。 |
| user_email | varchar(255) | 是 | NULL | 用户的电子邮件地址。 |
| user_icq | varchar(15) | 是 | NULL | 用户的 ICQ 号码。 |
| user_website | varchar(100) | 是 | NULL | 用户网站的 URL。 |
| user_from | varchar(100) | 是 | NULL | 用户的位置。 |
| user_sig | text | 是 | NULL | 用户的签名。 |
| user_sig_bbcode_uid | varchar(10) | 是 | NULL | 签名 BBCode 标识符。 |
| user_aim | varchar(255) | 是 | NULL | 用户 AOL 即时通讯 ID。 |
| user_yim | varchar(255) | 是 | NULL | 用户 Yahoo!即时通讯 ID。 |
| user_msnm | varchar(255) | 是 | NULL | 用户 MSN 即时通讯 ID。 |
| user_occ | varchar(100) | 是 | NULL | 用户的职业。 |
| user_interests | varchar(255) | 是 | NULL | 用户的兴趣。 |
| user_actkey | varchar(32) | 是 | NULL | 激活密钥。 |
| user_newpasswd | varchar(32) | 是 | NULL | 新的临时密码。 |
phpbb_vote_desc
此表包含与投票相关的数据。
| Field | Type | Null | Default | 备注 |
|---|---|---|---|---|
| vote_id | mediumint(8) | 否 | - | 自动递增。 |
| topic_id | mediumint(8) | 否 | 0 | 来自主题表的主题 ID。链接到:phpbb_topics -> topic_id |
| vote_text | text | 否 | 投票问题。 | |
| vote_start | int(11) | 否 | 0 | 投票开始时的 Unix 时间戳。 |
| vote_length | int(11) | 否 | 0 | 此投票应活跃的时间(以毫秒为单位)。 |
phpbb_vote_results
投票选项答案和投票结果。
| Field | Type | Null | Default | 备注 |
|---|---|---|---|---|
| vote_id | mediumint(8) | 否 | 0 | 来自vote_desc表的投票 ID。链接到:phpbb_vote_desc -> vote_id |
| vote_option_id | tinyint(4) | 否 | 0 | 投票可能答案的连续编号。 |
| vote_option_text | varchar(255) | 否 | - | 投票答案文本。 |
| vote_result | int(11) | 否 | 0 | 此投票答案的投票数。 |
phpbb_vote_voters
关于谁在哪个投票中投票的数据。
| 字段 | 类型 | 可空 | 默认值 | 备注 |
|---|---|---|---|---|
| vote_id | mediumint(8) | 否 | 0 | 来自vote_desc表的投票 ID。链接到: phpbb_vote_desc -> vote_id |
| vote_user_id | mediumint(8) | 否 | 0 | 来自用户表的用户 ID。链接到: phpbb_users -> user_id |
| vote_user_ip | char(8) | 否 | - | 投票时投票者的编码 IP 地址。 |
phpbb_words
被审查词汇列表。
| 字段 | 类型 | 可空 | 默认值 | 备注 |
|---|---|---|---|---|
| word_id | mediumint(8) | 否 | - | 自动递增。 |
| word | char(100) | 否 | - | 不雅词汇。 |
| replacement | char(100) | 否 | - | 替换词汇。 |








,你会在文本框中看到
,而其他人似乎一直在使用。解释是它在那里,但只能通过
顶部的“您没有新消息”链接。您现在处于空旷而孤独的收件箱中。












这样的表情符号图像位于您论坛目录结构的













标签,将跳转到如下页面:



对于嵌套标签,首先关闭你打开的最后一个标签,然后按照相反的顺序继续,直到关闭第一个标签。


‘29’是最大的字体大小。
这是一个无序列表的示例。列表中的每个项目都以
有序列表的创建方式与无序列表相同——通过在列表标签中添加
有序列表也可以使用字母而不是数字。
你可以嵌套列表。

这显示了 BBCode 解析器中的一个未记录行为,允许您引用一个网站并同时创建到该网站的链接。注意 URL 周围的空格。
phpBB 的 BBCode 解析器中的相同未记录行为允许创建电子邮件链接。


phpBB 会将任何看起来像 URL 的字符串转换为链接。
当显式使用
这是添加链接的最佳方式。链接的文本与 URL 不同。
浙公网安备 33010602011771号