- JavaScript 49.2%
- PHP 33.6%
- Less 17.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| js | ||
| migrations | ||
| resources | ||
| src | ||
| .editorconfig | ||
| CHANGELOG.md | ||
| composer.json | ||
| extend.php | ||
| LICENSE | ||
| README.md | ||
Flarum 高级页面扩展(guomengyao fork)
为你的 Flarum 1.x 论坛创建支持 HTML、BBCode、Markdown、PHP 或纯文本多种内容类型的高级自定义页面。是 fof/pages 的强力替代品,支持多格式、实时预览、格式化工具栏和精细的访问权限控制。
这是 TryHackX/flarum-advanced-pages 的个人 fork,基于官方
1.0.3/flarum-1发布线。本 fork 与原作者无任何关联,也未获得其授权认可。扩展本身的全部功劳归属 TryHackX——本 fork 仅用于在官方flarum-1分支基础上携带一处本地 CSS 修复(详见下文)。
本 fork 的改动内容
修复:
EditPageModal编辑弹窗在桌面端(≥768px)显示过小官方 LESS 源码中,弹窗高度是用一个混合单位的
calc()表达式定义的:max-height: calc(100vh - 60px);在本项目的 LESS 编译流程下,混合单位(
vh与px混用)的calc()表达式会被 LESS 编译器自行预先求值,而不是原样保留给浏览器在运行时处理。结果产出了一个损坏、毫无意义的输出——calc(100vh - 60px)被静默编译成了固定值calc(40vh),导致编辑弹窗无论实际内容多少,渲染高度都被锁定在视口高度的约40%左右。表现为弹窗显得非常拥挤,代码编辑器被压缩进一条窄小的可滚动条带里。修复方式是用 LESS 的字符串转义语法(
~"...")把calc()表达式包裹起来,强制 LESS 把它当作字面字符串原样输出,而不是在编译期尝试求值:max-height: ~"calc(100vh - 60px)";本 fork 同时修正了弹窗内部的 flex 布局层级链条,使其与 Flarum 实际渲染出的 DOM 结构相匹配(真实结构是
.Modal-content > form > .Modal-header + .Modal-body,而不是之前误以为的反向嵌套关系),此前这一错误的层级假设导致弹窗主体在内容较长时完全无法滚动。
最新版本(v1.0.2,上游): 新增"替换论坛剧透"设置,可将 Flarum 默认的行内剧透样式,在全站帖子中替换为 Advanced Pages 的 details/summary 剧透样式。后台新增"论坛集成"设置区。支持按钮移到了后台页面顶部,并改进了相关 CSS 样式。
功能特性
- 5种内容类型 - HTML(经HTMLPurifier净化)、BBCode、Markdown、PHP(沙箱执行)、纯文本
- 格式化工具栏 - BBCode 和 Markdown 编辑器均提供上下文相关的格式化按钮
- 实时预览 - Raw/Preview 切换,并带语法高亮(highlight.js One Dark 主题)
- 代码编辑器 - 基于 CodeMirror 的编辑器,支持 HTML 和 PHP 语法高亮
- BBCode 扩展标签 -
[table]、[spoiler]、[center]、扩展版[url]解析器(均可配置开关) - 换行模式 - BBCode 页面可选 Flarum 原生换行规则或保留全部换行
- 剧透系统 -
[spoiler]/[spoiler=标题],支持基于权限的可见性控制 - 后台管理面板 - 完整的增删改查,支持分页、每页条数选择和行内设置
- SEO 支持 - Meta 描述和规范的
<title>标签 - 访问控制 - 发布、隐藏(仅管理员可见)、限制(需登录)、按用户组设置可见性
- 自定义权限 - 管理页面权限、查看剧透内容权限
- 简洁 URL - 页面可通过
/p/{slug}访问
截图
后台页面管理、带工具栏的 BBCode 编辑器,以及实时预览效果。
环境要求
- Flarum
^1.8 - PHP
^8.1 - PHP memory_limit 最低
256M(推荐 512M 以上)
安装方式
本 fork 未发布在 Packagist 上。需要先添加一条 VCS 仓库声明,再指向开发分支安装:
composer config repositories.guomengyao-advanced-pages vcs https://gitlab.com/guomengyao/flarum-advanced-pages.git
composer require tryhackx/flarum-advanced-pages:"dev-fix-modal-v1"
php flarum migrate
php flarum cache:clear
php flarum assets:publish
创建页面
- 进入后台管理面板 > Advanced Pages
- 点击创建页面
- 选择内容类型并撰写内容
- 配置可见性(发布、隐藏、限制、用户组访问)
- 保存——页面将在
/p/{你的slug}上可访问
内容类型
| 类型 | 说明 | 安全性 |
|---|---|---|
| HTML | 完整的HTML,支持样式、脚本、表单 | 原样输出,受权限控制 |
| BBCode | 支持自定义标签和工具栏的BBCode | 经s9e/TextFormatter转义和解析 |
| Markdown | 完整Markdown支持,带实时预览 | 经s9e/TextFormatter转义和解析 |
| PHP | 服务端PHP执行 | 仅管理员可用,沙箱执行,错误仅记录日志不展示 |
| 纯文本 | 自动转义文本,URL自动转链接 | 完全转义输出 |
BBCode 设置
可在后台设置中切换自定义BBCode标签的开关:
| 设置项 | 标签 | 默认状态 |
|---|---|---|
| 表格 | [table] [tr] [th] [td] |
启用 |
| 剧透 | [spoiler] [spoiler=标题] |
启用 |
| 居中 | [center] |
启用 |
| 扩展URL | [url](接受被Flarum默认拒绝的URL) |
禁用 |
修改BBCode设置后需要清除格式化器缓存:
php flarum cache:clear
换行模式(BBCode)
每个BBCode页面都可单独配置换行模式:
- Flarum(默认)- 多个连续换行会折叠为单个换行(Flarum原生行为)
- 保留 - 所有换行都会被保留为
<br>标签
PHP 页面
PHP页面在沙箱环境中执行,可访问:
$page- 当前的页面模型$actor- 当前用户(访客则为null)$settings- Flarum 的设置仓库
<h1>欢迎,<?= htmlspecialchars($actor ? $actor->display_name : '访客') ?></h1>
<p>当前时间:<?= date('Y-m-d H:i:s') ?></p>
错误会被记录到Flarum的日志中,但永远不会展示给访客。
页面可见性
| 选项 | 说明 |
|---|---|
| 已发布 | 有权限的用户可以访问该页面 |
| 草稿 | 页面存在但无法访问 |
| 隐藏 | 仅管理员可见 |
| 限制 | 需要登录才能查看 |
| 用户组访问 | 限制为特定用户组可见 |
权限
| 权限 | 所在位置 | 说明 |
|---|---|---|
| 管理高级页面 | 管理标签 | 创建、编辑、删除页面 |
| 查看剧透内容 | 查看标签 | 查看页面中的剧透内容 |
内存要求
Flarum 会把所有扩展的 LESS 样式一起编译。如果遇到 PHP Fatal error: Allowed memory size exhausted(内存不足致命错误):
- 在
php.ini中将memory_limit至少设为256M(推荐512M) - WAMP用户注意:使用mod_fcgid的Apache读取的是Apache bin目录下的
php.ini,不是PHP目录下的那份 - 修改后重启Apache
安全性
- HTML页面以原始形式渲染(完整支持HTML/CSS/JS)——创建页面本身受权限控制
- PHP执行在隔离的闭包沙箱中运行,配有自定义错误处理
- PHP错误永不暴露给终端用户
- 仅管理员可创建PHP页面
- 原始
content字段对非管理员的API响应隐藏 - 扩展版URL解析器会阻止危险的URL协议(javascript:、data:、vbscript:)
- 无权限用户访问页面时,剧透内容会在服务端被剥离
相关链接
许可证
MIT 许可证。详见 LICENSE 文件。