完美嫁接THINKPHP 5.0/5.1的靜態站點產生器,可自訂生成規則,支援動態參數,支援參數的範圍設定。 是一個在原來開發過程沒有改變的情況下搭建靜態站的解決方案。 性能方面測試有時間搞一下。 使用上有其他問題的歡迎留言。 build static site, build html file for THINKPHP framework
本類適用於TP5.0和5.1雙版本,因為TP5.1較5.0變動比較多,所以本項目進行了版本的適配,請放心使用。
public/dist
目錄下的靜態頁面按F5刷新靜態頁面效果,也可以用原先的tp路徑或路由查看模板效果。 composer require jkbuildhtml/jkbuildhtml
dist_rules.php
檔案到application目錄,靜態規則請見後文。 // 静态站放置路径:
'dist_path' => 'public/',
// 静态页存放文件夹名 一般放置在public下;静态站点直接指向这个目录即可:
'dist_dir_name' => 'dist',
// 生成的静态页子页的存放目录,即匹配规则中没有@符号的页面的存放目录,注意例中路径中的'dist/site-pages'会进行目录匹配作为替换./或../的依据,所以这个名称在项目文件夹名中最好唯一:
'dist_sub_dir' => 'site-pages',
// 要生成静态页的模块名:
'dist_module_name' => 'index',
// 静态页文件名字中的参数分隔符:
'dist_file_dot' => '_',
// 静态资源路径替换 静态站点根目录下会替换成 `./` 其他会替换成 `../`
'dist_src_match' => '/public/static/',
$builder = new JKBuildHtmlBuilder()
在任何控制器裡放置一下語句即可大量產生全部靜態頁,你需要做的是把它放到後台的某個地方了。 頁面顯示是flush逐行顯示的,如果想用ajax自行搞一下程式碼當然也行。
$builder->buildAll();
也可以單一頁面生成,一般在列表頁的每行資料後面加一個生一个页面
按鈕:
$builder->buildOne($path, ['id' => 5]);
要注意的是單一頁面產生的path 一般為控制器和方法名,必須在靜態產生規則中聲明,否則會提示錯誤。
也可以封裝tp controller 的fetch方法,這樣可以邊開發邊生成。
protected function fetchHtml()
{
$builder = new JKBuildHtmlBuilder();
$builder->buildFromFetch( $html = $this->fetch(), input('get.') );
return $html;
}
dist_dir_name
設定資料夾下,靜態頁面會存取這些資源,如果放到這個資料夾外面,除非網站目錄不是這個目錄,否則訪問不到。原本tp的資源是放在public下任何位置的,但是有了靜態生成類,那麼就得按規則來以下是建議:
dist_rules.php
說明:鍵值對說明:
原TP模板檔案a連結路徑:
<?php
// +----------------------------------------------------------------------
// | 生成静态页的规则文件
// +----------------------------------------------------------------------
return [
// 这个是首页 带@的会生成在dist目录下,否则生成在子文件夹里;生成的html文件不带@
'@index' => 'index/index',
'@news' => 'news/index',
// 这个是带db的,表示要查询article表的id列,循环生成静态页
'news_:id' => ['news/find', 'article'],
// 这个是带自定义方法的,表示要执行getjobis方法返回id为键的二维数组,循环生成静态页
'job_:id' => ['jobs/find', 'func:getjobids'],
// 这个是请求tp的模块/控制器/方法,返回一个二维数组
'job_:id_:code' => ['index/index', 'func:dist/index/test'],
];
dist/site-pages
目錄下值可以是一個“請求路徑”,用控制器/方法
的形式即可,請求時會自動加上自訂模組名, 如果定義了路由則寫路由
值也可以是數組,第一個是請求路徑,會傳參請求;第二個是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檔中,不會停止生成
完全遵循996ICU 協議完美開源