# JKBuildHtml 基于ThinkPHP生成靜態(tài)站點控制器類
項目地址:https://gitee.com/ray2017/jk-build-html
## 介紹
完美嫁接[http://www.thinkphp.cn/](THINKPHP)的靜態(tài)頁面生成控制器,可自定義生成規(guī)則右锨,支持動態(tài)參數(shù)绍移,支持參數(shù)的范圍設置。 是一個在原來開發(fā)過程沒有變化的情況下搭建靜態(tài)站的解決方案轧抗。 性能方面測試有時間搞一下瞬测。 暫時不是composer版本月趟,如果需要的,可以留言穷躁。 使用中有其他問題的歡迎留言问潭。
build static site, thinkphp class, build html page
## 特點
* 純靜態(tài):生成的網(wǎng)站是靜態(tài)htm頁面沙峻,拷貝文件就是部署站點。
* 方便改造:原來TP開發(fā)代碼不用變動去枷,原來TP的view文件照常寫,以前怎么寫模板還怎么寫竖螃。
* 邊開發(fā)邊生成html:建議封裝控制器的fetch方法逗余,邊查看靜態(tài)效果邊開發(fā)录粱,避免后期重新搭建后頁面顯示有問題,你可以盯著`public/dist`目錄下的靜態(tài)頁面按F5刷新靜態(tài)頁面效果菜职,也可以用原來的tp路徑或路由查看模板效果酬核。
## 用法
在任意控制器里放置一下語句即可批量生成全部靜態(tài)頁适室,你需要做的是把它放到后臺的某個地方了。
頁面顯示是flush逐行顯示的捣辆,如果想用ajax自行搞一下代碼當然也行蔬螟。
```
controller('common/JKBuildHtml')->buildAll();
```
也可以單個頁面生成,一般在列表頁的每行數(shù)據(jù)后面加一個 `生一個頁面` 按鈕:
```
controller('common/JKBuildHtml')->buildOne($path, ['id' => 5]);
```
需要注意的是單個頁面生成的path 一般為控制器和方法名罪帖,必須在靜態(tài)生成規(guī)則中聲明促煮,否則會提示錯誤。
也可以封裝tp controller 的 fetch方法整袁,這樣可以邊開發(fā)邊生成菠齿。
```
protected function fetchHtml()
{
? ? controller('common/JKBuildHtml')->buildFromFetch( $html = $this->fetch(), input('get.') );
? ? return $html;
}
```
## 注意事項
* 所有靜態(tài)資源js,css坐昙,上傳文件等绳匀,必須放置在 `dist_dir_name` 配置文件夾下,靜態(tài)頁面會訪問這些資源疾棵,如果放到這個文件夾外面,除非站點目錄不是這個目錄痹仙,否則訪問不到是尔。
* 所有靜態(tài)規(guī)則<鍵>全用小寫
* 靜態(tài)規(guī)則中的<值>的路徑原則是,只要能請求到的地址就可以开仰,建議不要使用的TP路由動態(tài)參數(shù)拟枚。
* 請求路徑只支持GET請求
## 配置步驟
* `JKBuildHtml.php` 放置在common的controller里 別處也可 注意命名空間
* `config.php` 增加公共配置參數(shù)
* `dist_rules.php` 靜態(tài)生成規(guī)則文件薪铜,放置在application目錄下
## config.php 參數(shù)設置
公共配置文件`config.php`中加入以下參數(shù),注意看注釋:
```
? ? // 靜態(tài)站放置路徑:
? ? 'dist_path' => ROOT_PATH. 'public/',
? ? // 靜態(tài)頁存放文件夾名 一般放置在public下;靜態(tài)站點直接指向這個目錄即可:
? ? 'dist_dir_name' => 'dist',
? ? // 生成的靜態(tài)頁子頁的存放目錄恩溅,即匹配規(guī)則中沒有@符號的頁面的存放目錄隔箍,注意例中路徑中的'dist/site-pages'會進行目錄匹配作為替換./或../的依據(jù),所以這個名稱在項目文件夾名中最好唯一:
? ? 'dist_sub_dir' => 'site-pages',
? ? // 要生成靜態(tài)頁的模塊名:
? ? 'dist_module_name' => 'index',
? ? // 靜態(tài)頁文件名字中的參數(shù)分隔符:
? ? 'dist_file_dot' => '_',
? ? // 靜態(tài)資源路徑替換 靜態(tài)站點根目錄下會替換成 `./` 其他會替換成 `../`
? ? 'dist_src_match' => '/public/static/',
```
## 關于靜態(tài)資源路徑
本來tp的資源是放在public下任何位置的脚乡,但是有了靜態(tài)生成類蜒滩,那么就得按規(guī)則來
以下是建議:
* 首先在public下建一個dist目錄(dist的由來是寫js項目的時候build的目錄名,此處借用奶稠;也可改配置)
* 然后把所有前端扔給你的所有靜態(tài)資源文件 js俯艰,css,images放到這個文件夾下。
* 把上傳的文件也放dist目錄里
* 生成完畢后這個目錄下就會生成相關的html頁面
## 生成靜態(tài)頁規(guī)則文件dist_rules.php說明
* 注:這個文件不是路由文件锌订,和tp路由不是一回事蟆炊。
鍵值對說明:
* <鍵> 為生成靜態(tài)頁文件名:@代表dist的根目錄,@index 代表首頁瀑志,其他不帶@的會生成在dist/site-pages;全用小寫
* <值> 為靜態(tài)頁生成模塊的路徑(即控制器、方法污秆、參數(shù))劈猪,生成過程中,會直接請求這個路徑良拼。
原TP模板文件a鏈接路徑:
* 在模板里寫a鏈接路徑的時候需要按照鍵的規(guī)則战得,路徑里不需要@符號
```
<?php
// +----------------------------------------------------------------------
// | 生成靜態(tài)頁的規(guī)則文件
// +----------------------------------------------------------------------
return [
? ? '@index'? ? ? ? => 'index/index', // 這個是首頁 會生成在dist目錄下
? ? '@news'? ? ? ? => 'news/index',
? ? 'news_:id'? ? ? => ['news/find', 'article'],? // 這個是帶db的,表示要查詢article表的id列庸推,循環(huán)生成靜態(tài)頁
? ? 'job_:id'? ? ? => ['jobs/find', 'func:getjobids'],? // 這個是帶自定義方法的常侦,表示要執(zhí)行getjobis方法返回id為鍵的二維數(shù)組,循環(huán)生成靜態(tài)頁
? ? 'job_:id_:code' => ['index/index', 'func:dist/index/test'], // 這個是請求tp的模塊/控制器/方法贬媒,返回一個二維數(shù)組
];
```
### <鍵>
* 鍵中帶:號的是有動態(tài)參數(shù)的 會生成在`dist/site-pages`目錄下
* 參數(shù)命名必須和db里的字段名稱一致
* 為防止生成錯誤不同參數(shù)之間需用_分開(可以修改配置)
### <值>
* 值可以是一個“請求路徑”聋亡,用`控制器/方法`的形式即可,請求時會自動加上自定義模塊名
* 值也可以是一個數(shù)組际乘,第一個是請求路徑坡倔,會傳參請求;第二個是db的名字脖含,即參數(shù)字段所在列的所有值罪塔,系統(tǒng)會根據(jù)參數(shù)批量生成頁面:比如'news_:id' => ['news/find', 'article'], 是查詢article表里的id列,
* 如果想加入db查詢條件养葵,那么就放第三個值里 比如 `id < 100`,這個會傳入到db的where條件中需要符合tp查詢語法, 就成了`'news_:id' => ['news/find', 'article', ['id' =>? ['<',100]]],` 或? `..."id < 100"]`
* 如果想自定義生成id的函數(shù)征堪,可以把第二個參數(shù)設置成一個全局的方法,可以放common.php里(函數(shù)名不用帶`func:`),或任意一個控制器里 寫法:`'func:admin/index/getJobIds'` 或 `'func:getjobids'`
* 若采用func類型的关拒,返回值必須是以參數(shù)為鍵相符的二維數(shù)組佃蚜。如:`['id' => [2,3,4,5]]`
* func類型可以有第三個值庸娱,作為func的參數(shù)傳入
### 請求路徑出現(xiàn)異常怎么辦
靜態(tài)生成控制器會直接把異常頁面也生成到html文件中,不會停止生成
## 作者
冷風崔 <541720500@qq.com>
## LICENSE
完全遵循 996ICU 協(xié)議 完美開源