JKBuildHtml基于TP生成靜態站點控制器類

瀏覽:1038 最后更新:2019-05-18 10:00 分類:類庫
地址:碼云倉庫https://gitee.com/ray2017/jk-build-html
使用TP5.1的請注意
本類適用于TP5.0,因為TP5.1更改比較多,所以想適用于TP5.1,需要改動一下:

首先規則放到config文件夾中,類中規則的獲取getDistRules方法,也要使用新版本的Config::get('dist_rules.')
配置文件放到config/app.php即可,ROOT_PATH改成\think\facade\Env::get('root_path')
類的初始化方法 _initialize 改成 initialize 以上就可以適合TP5.1了
特點
純靜態:生成的網站是靜態htm頁面,拷貝文件就是部署站點。
方便改造:原來TP開發代碼不用變動,原來TP的view文件照常寫,以前怎么寫模板還怎么寫。
邊開發邊生成html:建議封裝控制器的fetch方法,邊查看靜態效果邊開發,避免后期重新搭建后頁面顯示有問題,你可以盯著public/dist目錄下的靜態頁面按F5刷新靜態頁面效果,也可以用原來的tp路徑或路由查看模板效果。
用法
在任意控制器里放置一下語句即可批量生成全部靜態頁,你需要做的是把它放到后臺的某個地方了。 頁面顯示是flush逐行顯示的,如果想用ajax自行搞一下代碼當然也行。

controller('common/JKBuildHtml')->buildAll();
也可以單個頁面生成,一般在列表頁的每行數據后面加一個 生一個頁面 按鈕:

controller('common/JKBuildHtml')->buildOne($path, ['id' => 5]);
需要注意的是單個頁面生成的path 一般為控制器和方法名,必須在靜態生成規則中聲明,否則會提示錯誤。

也可以封裝tp controller 的 fetch方法,這樣可以邊開發邊生成。

protected function fetchHtml()
{
controller('common/JKBuildHtml')->buildFromFetch( $html = $this->fetch(), input('get.') );
return $html;
}
注意事項
所有靜態資源js,css,上傳文件等,必須放置在 dist_dir_name 配置文件夾下,靜態頁面會訪問這些資源,如果放到這個文件夾外面,除非站點目錄不是這個目錄,否則訪問不到。
所有靜態規則<鍵>全用小寫
靜態規則中的<值>的路徑原則是,只要能請求到的地址就可以,建議不要使用的TP路由動態參數。
請求路徑只支持GET請求
配置步驟
JKBuildHtml.php 放置在common的controller里 別處也可 注意命名空間
config.php 增加公共配置參數
dist_rules.php 靜態生成規則文件,放置在application目錄下
config.php 參數設置
公共配置文件config.php中加入以下參數,注意看注釋:

// 靜態站放置路徑:
'dist_path' => ROOT_PATH. 'public/',
// 靜態頁存放文件夾名 一般放置在public下;靜態站點直接指向這個目錄即可:
'dist_dir_name' => 'dist',
// 生成的靜態頁子頁的存放目錄,即匹配規則中沒有@符號的頁面的存放目錄,注意例中路徑中的'dist/site-pages'會進行目錄匹配作為替換./或../的依據,所以這個名稱在項目文件夾名中最好唯一:
'dist_sub_dir' => 'site-pages',
// 要生成靜態頁的??槊?br /> 'dist_module_name' => 'index',
// 靜態頁文件名字中的參數分隔符:
'dist_file_dot' => '_',
// 靜態資源路徑替換 靜態站點根目錄下會替換成 `./` 其他會替換成 `../`
'dist_src_match' => '/public/static/',
關于靜態資源路徑
本來tp的資源是放在public下任何位置的,但是有了靜態生成類,那么就得按規則來 以下是建議:

首先在public下建一個dist目錄(dist的由來是寫js項目的時候build的目錄名,此處借用;也可改配置)
然后把所有前端扔給你的所有靜態資源文件 js,css,images放到這個文件夾下。
把上傳的文件也放dist目錄里
生成完畢后這個目錄下就會生成相關的html頁面
生成靜態頁規則文件dist_rules.php說明
注:這個文件不是路由文件,和tp路由不是一回事。
鍵值對說明:

<鍵> 為生成靜態頁文件名:@代表dist的根目錄,@index 代表首頁,其他不帶@的會生成在dist/site-pages;全用小寫
<值> 為靜態頁生成??櫚穆肪叮純刂破?、方法、參數),生成過程中,會直接請求這個路徑。
原TP模板文件a鏈接路徑:

在模板里寫a鏈接路徑的時候需要按照鍵的規則,路徑里不需要@符號
<?php
// +----------------------------------------------------------------------
// | 生成靜態頁的規則文件
// +----------------------------------------------------------------------
return [
'@index' => 'index/index', // 這個是首頁 帶@的會生成在dist目錄下,否則生成在子文件夾里;生成的html文件不帶@
'@news' => 'news/index',
'news_:id' => ['news/find', 'article'], // 這個是帶db的,表示要查詢article表的id列,循環生成靜態頁
'job_:id' => ['jobs/find', 'func:getjobids'], // 這個是帶自定義方法的,表示要執行getjobis方法返回id為鍵的二維數組,循環生成靜態頁
'job_:id_:code' => ['index/index', 'func:dist/index/test'], // 這個是請求tp的???控制器/方法,返回一個二維數組
];
<鍵>
鍵中帶:號的是有動態參數的 會生成在dist/site-pages目錄下
參數命名必須和db里的字段名稱一致
為防止生成錯誤不同參數之間需用_分開(可以修改配置)
<值>
值可以是一個“請求路徑”,用控制器/方法的形式即可,請求時會自動加上自定義??槊? 如果定義了路由則寫路由
值也可以是一個數組,第一個是請求路徑,會傳參請求;第二個是db的名字,即參數字段所在列的所有值,系統會根據參數批量生成頁面:比如'news_:id' => ['news/find', 'article'], 是查詢article表里的id列,
如果想加入db查詢條件,那么就放第三個值里 比如 id < 100,這個會傳入到db的where條件中需要符合tp查詢語法, 就成了'news_:id' => ['news/find', 'article', ['id' => ['<',100]]], 或 ..."id < 100"]
如果想自定義生成id的函數,可以把第二個參數設置成一個全局的方法,可以放common.php里(函數名不用帶func:),或任意一個控制器里 寫法:'func:admin/index/getJobIds' 或 'func:getjobids'
若采用func類型的,返回值必須是以參數為鍵相符的二維數組。如:['id' => [2,3,4,5]]
func類型可以有第三個值,作為func的參數傳入
請求路徑出現異常怎么辦
靜態生成控制器會直接把異常頁面也生成到html文件中,不會停止生成

作者
冷風崔 [email protected]

LICENSE
完全遵循 996ICU 協議 完美開源
評論( 相關
后面還有條評論,點擊查看>>