## 任何 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