直接修改 layout.inc.php 不安全,因其仅为拼接html片段的中间文件,不定义主结构;应改 templates/layout/ 下的twig模板,并验证sql页、token机制和多语言功能。

直接改 layout.inc.php 无法安全重构 phpMyAdmin 主面板布局 —— 它不是模板入口,而是被硬编码逻辑驱动的中间文件,强行修改极易导致功能断裂或 CSRF 防御失效。
为什么 layout.inc.php 不该动
这个文件本质是 phpMyAdmin 内部用于拼接 HTML 片段的辅助脚本(比如生成顶部导航栏、侧边栏容器),不承载页面结构主干。它的输出被 index.php 和各子模块(如 server/index.php)通过 include() 注入,且大量依赖全局变量(如 $GLOBALS['cfg']['NavigationWidth'])、已初始化的类实例(如 $response)和上下文状态。你改了它,可能让 SQL 执行页丢失查询框、让导入页无法渲染表单,甚至触发 Token mismatch 错误。
- 它没有定义
或主容器结构,只提供<div id="pma_navigation"> 这类片段 <li>所有 CSS 类名(如 <code>container-fluid、pmalayout)由前端 JS 动态控制显隐,后端 PHP 拼接无法覆盖 - 自 5.0 起,phpMyAdmin 启用 Twig 模板引擎,但
layout.inc.php未被纳入 Twig 渲染流程,属于遗留代码 -
main.twig包含<div id="page_content"> 和核心 <code>{% block content %}{% endblock %}占位符 - 修改前务必复制原文件到
custom/templates/目录(需在config.inc.php中启用:$cfg['TempDir'] = '/path/to/custom';) - 禁止删除
{% block scripts %}{% endblock %}—— 这里注入了navigation.js和 token 验证逻辑,删掉会导致“无权限”错误 - 在
config.inc.php中设置:$cfg['LeftFrameLight'] = true;(精简导航栏)或$cfg['NavigationDisplayDbFilterMinimum'] = 20;(仅当库数 ≥20 时显示筛选) - 通过自定义 CSS 注入(在
config.inc.php中配置:$cfg['HeaderLogoLink'] = 'custom.css';)隐藏元素:#pma_navigation { display: none !important; } - 若需动态控制,监听
pma:navloaded事件,在footer.twig末尾加内联 JS:
真正可控的布局入口是 templates/ 下的 Twig 文件
从 phpMyAdmin 4.9 开始,主界面结构已迁移到 Twig 模板。要调整主面板(即数据库列表页、表结构页等共用的外层框架),应定位到:templates/layout/header.twig、templates/layout/main.twig、templates/layout/footer.twig。这些才是实际决定 DOM 树根节点的文件。
想隐藏/移动导航栏?优先用 CSS + JS 覆盖,而非改 PHP
phpMyAdmin 的导航栏(左侧数据库树)由 navigation.php 输出 HTML,再经 js/navigation.js 初始化。硬改 PHP 层容易破坏折叠状态同步、搜索高亮等交互。更稳的方式是:
document.addEventListener('pma:navloaded', function () {
if (window.innerWidth
<h3>改完必须验证的三件事</h3>
<p>任何布局调整后,立刻检查以下三项,否则上线即故障:</p>
- 打开任意表的
SQL标签页 —— 确认查询输入框和执行按钮仍可点击,且结果能正确渲染(常因main.twig中遗漏{% block sqlquery %}{% endblock %}导致) - 尝试执行一条
INSERT—— 若报The token is missing.,说明{% block scripts %}被误删或路径错乱 - 切换语言(如从 zh_CN 切到 en)—— 检查所有文字是否正常翻译,Twig 中未包裹
gettext()的字符串会变空白
复杂点在于:phpMyAdmin 的布局不是纯前端可解耦的,它把权限判断(如是否显示“用户账户”菜单)、服务器状态(如复制延迟提示)、甚至 PHP 配置警告(如 upload_max_filesize)全塞进同一套模板流里。少一个 {% if $is_superuser %} 判断,就可能让普通用户看到不该看的入口。











