## 任何 ThinkPHP5 核心框架版本升级一定要修改以下两处
**ThinkPHP5.0 正式版有一些不适合管理后台需求,做了如下修改,请务必修改下面所示**
>[info] **为了支持 include 标签引入文件模板自动定位,修改了文件 `thinkphp/library/think/Template.php` 的 `parseTemplateName` 方法:**
```
/**
* 分析加载的模板文件并读取内容 支持多个模板文件读取
* @access private
* @param string $templateName 模板文件名
* @return string
*/
private function parseTemplateName($templateName)
{
$array = explode(',', $templateName);
$parseStr = '';
foreach ($array as $templateName) {
if (empty($templateName)) {
continue;
}
if (0 === strpos($templateName, '$')) {
//支持加载变量文件名
$templateName = $this->get(substr($templateName, 1));
}
/****************** 修改开始 ********************/
// 解决模板 include 标签不支持自动定位当前控制器的问题
if (!preg_match("/(\/|\:)/", $templateName)) {
$templateName = str_replace(".", DS, \think\Loader::parseName(\think\Request::instance()->controller())) . DS . $templateName;
}
/****************** 修改结束 ********************/
$template = $this->parseTemplateFile($templateName);
if ($template) {
// 获取模板文件内容
$parseStr .= file_get_contents($template);
}
}
return $parseStr;
}
```
>[info] **为了支持多级控制器,`\think\Url::build` 方法有bug,`\think\Url::build("one.two.Three")` 会生成 `one.two._three` 的链接,正确的应该是 `one.two.three`,修改了文件 `thinkphp/library/think/Loader.php` 的 `parseName` 方法:**
**ThinkPHP 5.0.4及以上版本请按此修改:**
```
/**
* 字符串命名风格转换
* type 0 将Java风格转换为C的风格 1 将C风格转换为Java的风格
* @param string $name 字符串
* @param integer $type 转换类型
* @param bool $ucfirst 首字母是否大写(驼峰规则)
* @return string
*/
public static function parseName($name, $type = 0, $ucfirst = true)
{
/****************** 修改开始 ********************/
if ($type) {
return preg_replace_callback(['/\_([a-zA-Z])/', '/([^.][a-zA-Z]*$)/'], function ($match) use ($ucfirst) {
return $ucfirst ? ucfirst($match[1]) : lcfirst($match[1]);
}, $name);
} else {
return strtolower(preg_replace('/((?<=[a-z])(?=[A-Z]))/', '_', $name));
}
/****************** 修改结束 ********************/
/* if ($type) {
$name = preg_replace_callback('/_([a-zA-Z])/', function ($match) {
return strtoupper($match[1]);
}, $name);
return $ucfirst ? ucfirst($name) : lcfirst($name);
} else {
return strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $name), "_"));
}*/
}
```
**ThinkPHP 5.0.3及以下版本请按此修改:**
```
/**
* 字符串命名风格转换
* type 0 将Java风格转换为C的风格 1 将C风格转换为Java的风格
* @param string $name 字符串
* @param integer $type 转换类型
* @return string
*/
public static function parseName($name, $type = 0)
{
/****************** 修改开始 ********************/
if ($type) {
return preg_replace_callback(['/\_([a-zA-Z])/', '/([^.][a-zA-Z]*$)/'], function ($match) {
return ucfirst($match[1]);
}, $name);
} else {
return strtolower(preg_replace('/((?<=[a-z])(?=[A-Z]))/', '_', $name));
}
/****************** 修改结束 ********************/
}
```
## 从 v1.2 升级到 v1.3
### [ 代码自动生成 ]
现在支持删除已生成的代码,请勾选删除代码时谨慎操作,以免删除不该删除的代码而且不可恢复
### [ 节点管理 ]
节点管理变成三个大的区域,结构更清晰,在左上角的模块区域单击右键可以在模块下添加节点或者修改、删除模块,不选中任何右边主节点栏点击添加可以添加模块,选中某个节点可以在该节点下添加子节点或者修改该节点,点击左下角的分组可以切换分组,更直观
### [ 更直观的排序保存 ]
在列表页添加了快速排序,修改排序值后能直接保存排序
### [ 标签扩展 ]
针对快速排序保存拓展了一个排序保存菜单 `saveOrder`
### [ 邮件驱动 ]
邮件驱动更换为 [tp-mailer](https://github.com/yuan1994/tp-mailer),一款非常优美、强大的邮件驱动,之前的配置文件不可用,之前的邮件驱动类也已删除,建议更换,具体看 [tp-mailer](https://github.com/yuan1994/tp-mailer) 文档
### [ 网站日志 ]
网站日志更强大,支持在应用内修改、删除、启动、停止日志记录,也更加规范了节点图,方便日后进行数据统计,同时修复网址日志多数组报错bug,之前的数据表全部不可用,请注意更换
### [ 模型和验证器路径 ]
模型路径由原来的 `admin` 模块下的 `model` 文件夹迁移到 `common` 的 `model` 文件夹下,如果不想此设计,请自己修改 `application/extra/app.php` 配置文件里的 `model_path` 和 `validate_path` ,此设计是为了大型项目跨模块使用模型更好的使用模型和模型关联特性
同时模型命名全部修改修改为驼峰式(CamelCase),一级控制器对应的模型不必修改,多级控制器对应的模型可以修改,但也兼容,不方便可以不用修改,以后注意规范即可
## 从 v1.1 升级到 v1.2
### [ 代码自动生成 ]
`v1.2` 版本已经废弃 `v1.1` 版的代码自动生成器,为了兼容终端模式,原来的代码自动生成器模型 `admin/model/genereate.php` 已经弃用,相关文件已经迁移至 `extend/Genereate.php`,其他文件路径不变,请将 `extend/Genereate.php`,`extend/console` 文件夹,`generate` 控制器和模板文件替换为 `v1.2` 版的文件
### [ 终端模式 ]
请将项目根目录的 `tpadmin`,`genereate.php`,`extend/console` 文件夹拷贝到 `v1.1` 项目中
### [ 节点管理 ]
原来的节点管理弃用,更换为基于 `zTree` 插件的节点树对节点管理,请替换节点管理 `AdminNode` 对应的控制器、模型、模板、逻辑层(logic)
### [ 标签扩展 ]
升级的标签库不影响以前的标签,可以直接替换文件 `admin/taglib/Tp.php`
### [ bug修复 ]
修复因 `JavaScript` 代码错误导致的bug,请替换相关代码 `public/static/admin/js/app.js`
### [ 公共控制器Controller ]
`v1.2` 将 `v1.1` 中的 `datalist`,`filterId` 方法从 traits 迁移至 公共控制器中,同时增加了 `datalist` 方法返回值和是否开启分页功能
### [ 代码写法 ]
模板里将 `{:isset($vo.name)?$vo.name:''}` 写法简写为 `{$vo.name ?? ''}`,将 `{:\\think\\Request::instance()->param('name')}` 简写为 `{$Request.param.name}`,控制器过滤 `if` 条件判断将代码块写到 `{ }` 里了,比如
```
// 原来的写法
if ($this->request->param('name')) $map['name'] = ["like", "%" . $this->request->param('name') . "%"];
// 现在的写法
if ($this->request->param('name')) {
$map['name'] = ["like", "%" . $this->request->param('name') . "%"];
}
```
## 从 v1.0 升级到 v1.1
`v1.1` 是一个重构的版本,修改 `v1.0` 中很多代码不规范的地方,改动非常大,**无法兼容过渡**,最好升级后对代码进行大幅改动
- 概要
- 开始使用
- 写在前面
- 目录结构
- 模板主题支持
- 前置方法before支持
- 数据返回
- 异常接管
- Rbac 权限管理
- 开始使用
- 用户管理
- 分组管理
- 节点管理
- 角色管理
- 使用流程
- 其他
- 代码自动生成 v1.2
- 示例一 - 一级控制器
- 示例二 - 多级控制器
- 示例三 - 从数据表生成
- 示例四 - 指定生成的文件
- 示例五 - 命令行模式
- 示例六 - 模拟命令行模式
- 代码自动生成
- 示例一 - 一级控制器
- 示例二 - 多级控制器
- 控制器
- 公共控制器
- traits 多继承 Controller
- 公开不授权控制器
- 其他控制器
- 标签扩展
- 模板
- 网站操作日志
- 节点图
- 行为驱动
- 其他后端方法
- Excel一键导出
- Excel一键导入
- 文件下载
- 邮件发送
- 七牛文件上传
- id加密
- 前端
- ajax请求
- 表单校验
- 丰富弹层
- 异步操作
- 表格溢出
- 随机字符串
- 自动面包屑导航
- 动态加载文件
- 文件上传
- Tab 切换
- 图片预览
- 二维码生成
- 日历组件
- 升级指导
- 更新日志
- FAQ