## 知识点:
1、工作思路
2、前台链接修改
3、链接地址静态化
4、后台静态生成模板搭建
5、全站静态化生成
6、封装生成静态化方法
7、内容页生成
8、列表页生成
[TOC]
## 一、工作思路
### 1、相关文章
ThinkPHP5.0---静态方法
https://www.cnblogs.com/qq597585136/p/7228678.html
ThinkPHP 的页面静态化功能的实现(一)
https://blog.csdn.net/sinat_35861727/article/details/54971392
ThinkPHP 的页面静态化功能的实现(二)
https://blog.csdn.net/sinat_35861727/article/details/54971805
ThinkPHP 的页面静态化功能的实现(三)
https://blog.csdn.net/sinat_35861727/article/details/54972916
thnkphp5行为扩展html静态缓存源码下载
http://www.yunshare.net/Article/12/7.html
当后台开启静态(即判断 static==1 ),那么前台控制器就要控制链接地址为静态链接,否则就是动态链接
具体实现,就是在前台初始化操作中判断
### 2、控制器设置
~~~
public function _initialize() {
// 判断缓存中是否有静态化配置项
if(!cache('static')){
$static = DB::name('config')->where('varname','static')->value('value');
cache('static',$static);
}
$this->assign('static',cache('static'));
}
~~~
### 3、模板判断
内容动态链接
http://www.demo.cn/index/index/show/id/87/catid/28.html
内容静态链接
http://www.demo.cn/show_x_y.shtml
模板中判断是否开启静态
~~~
{if condition='$static'}../show_{$vo.catid}_{$vo.id}.shtml{else/}{:url('show',['id'=>$vo.id,'catid'=>$vo.catid])}{/if}
~~~
## 二、前台链接修改
### 1、分类链接
分类动态链接
http://www.demo.cn/index/index/fenlei/id/28.html?page=1
分类静态链接
http://www.demo.cn/list_x_y.shtml
备注:x-分类id,y-分页
### 2、内容链接
内容动态链接
http://www.demo.cn/index/index/show/id/87/catid/28.html
内容静态链接
http://www.demo.cn/show_x_y.shtml
备注:x-分类id,y-内容id
## 三、链接地址静态化
### (一)后台设置静态开关
~~~
public function _initialize() {
// 判断缓存中是否有静态化配置项
if(!cache('static')){
$static = DB::name('config')->where('varname','static')->value('value');
cache('static',$static);
}
$this->assign('static',cache('static'));
}
~~~
### (二)前台判断
~~~
http://www/index/index/category/id/28.html?page=1
http://www/category_x_y.shtml [x-分类id,y-分页]
{if condition='$static'}../category_{$vo.id}_1.shtml{else/}{:url('category',['id'=>$vo.id])}{/if}
http://www/index/index/info/id/87/catid/28.html
http://www/show_x_y.shtml [x-分类id,y-内容id]
{if condition='$static'}../show_{$vo.catid}_{$vo.id}.shtml{else/}{:url('info',['id'=>$vo.id,'catid'=>$vo.catid])}{/if}
首页文章
<a href="{if condition='$static'}../show_{$vo.catid}_{$vo.id}.shtml{else/}{:url('info',['id'=>$vo.id,'catid'=>$vo.catid])}{/if}">
<img src="__UPLOADS__/{$vo.thumb}" alt="{$vo.title}">
</a>
首页分类
<a href="{:url('category',['id'=>$vo.catid])}">{$vo.catid|getCatInfoById=catname}</a>
列表页文章
<a href="{if condition='$static'}../../../../show_{$vo.catid}_{$vo.id}.shtml{else/}{:url('info',['id'=>$vo.id,'catid'=>$vo.catid])}{/if}" rel="bookmark">
{$vo.title}
</a>
列表页分类
<a href="{if condition='$static'}../../../../list_{$vo.catid}_1.shtml{else/}{:url('category',['id'=>$vo.catid])}{/if}">
{$vo.catid|getCatInfoById=catname}
</a>
内容页文章
<a href="{if condition='$static'}http://{$Think.server.HTTP_HOST}/show_{$vo.catid}_{$vo.id}.shtml{else/}{:url('info',['id'=>$vo.id,'catid'=>$vo.catid])}{/if}">
<img src="__UPLOADS__/{$vo.thumb}" alt="{$vo.title}">
</a>
内容页分类
<a href="{if condition='$static'}http://{$Think.server.HTTP_HOST}/list_{$vo.catid}_1.shtml{else/}{:url('category',['id'=>$vo.catid])}{/if}">
{$vo.catid|getCatInfoById=catname}
</a>
菜单项
<ul class="sub-menu">
{volist name="vo.son" id="voson"}
<li>
<a href="{if condition='$static'}http://{$Think.server.HTTP_HOST}/list_{$voson.id}_1.shtml{else/}{:url('category',['id'=>$voson.id])}{/if}">
{$voson.catname}
</a>
</li>
{/volist}
</ul>
~~~
## 四、后台静态生成模板搭建
### (一)新建“发布管理”菜单
1、菜单>发布管理>静态生成
2、新建控制器Staticpage和模板“staticpage/index”
3、完善控制器和模板
## 五、全站静态化生成
主要目标:生成首页
~~~
public function index(){
$url = 'http://www/index.php'; //动态页面地址
$fn = ROOT_PATH . 'public/index.html'; //生成文件名
$content = file_get_contents($url);
$fs = fopen($fn, 'w');
fwrite($fs, $content);
return view();
}
~~~
## 六、封装生成静态化方法
~~~
protected $domain = '';
public function _initialize(){
$this->domain = "http://" . input('server.HTTP_HOST'); // 获取域名
}
public function createHtml($visitUrl, $createName){
$url = $this->domain . '/index.php/index/index/' . $visitUrl; //动态页面地址
$fn = ROOT_PATH . 'public/' . $createName; //生成文件名
$content = file_get_contents($url);
$fs = fopen($fn, 'w');
fwrite($fs, $content);
}
~~~
## 七、内容页生成
~~~
public function createInfo(){
if(request()->isPost()){
// 获取模型中所有的tablename
$models = Db::name('models')->column('tablename');
foreach ($models as $name) {
$lists = Db::name($name)->field('id,catid')->select();
if(count($lists)){
foreach ($lists as $value) {
$visitUrl = 'info/id/'.$value['id'].'/catid/'.$value['catid'];
$createName = 'a/show_'.$value['catid'].'_'.$value['id'].'.shtml';
$this->createHtml($visitUrl, $createName);
}
}
}
return success('内容页生成成功!');
}
}
~~~
## 八、列表页生成
### (一)思路分析
顶层分类没有文章的
每个分类ID对应一个模型ID
每个模型对应一张数据表
查询数据表分页操作
两个参数:一个是分类ID;一个是页数
页数:总共记录数;每页显示多少条
配置文件:\application\index\config.php
算法:$num = ceil($count/5); //进一取整函数
ceil() 函数向上舍入为最接近的整数。
返回不小于 x 的下一个整数,x 如果有小数部分则进一位。
ceil() 返回的类型仍然是 float,因为 float 值的范围通常比 integer 要大。
功 能:返回大于或者等于指定表达式的最小整数
### (二)分页配置
~~~
<?php
return [
'paginate' => [
'type' => 'layui',
'var_page' => 'page',
'list_rows' => '5',
'newstyle' => true,
],
];
~~~
### (三)后台操作
#### 1、生成分类
~~~
public function createCategory(){
if(request()->isPost()){
$ids = Db::name('category')->where('modelid','neq',0)->column('id');
foreach ($ids as $id) {
// 根据分类ID获取相应数据表名
$tablename = getModInfoById($id, 'tablename');
// 获取数据表中相应分类记录数,再计算出页数
$count = Db::name($tablename)->where('catid', $id)->count();
if($count){
$num = ceil($count/5); //进一取整函数
for($i = 1; $i<$num+1; $i++){
$visitUrl = 'category/id/'.$id.'?page='.$i;
$createName = 'a/list_'.$id.'_'.$i.'.shtml';
$this->createHtml($visitUrl, $createName, true, $id);
}
}
}
return success('分类页生成成功!');
}
}
~~~
#### 2、根据分类ID获取相应模型信息
~~~
function getModInfoById($id=0, $field=''){
//模型ID、
$modelId = getCatInfoById($id, 'modelid');
if($field == ''){
//获取单条数据
return Db::name('models')->where('id',$modelId)->find();
}else{
//获取某个字段
return Db::name('models')->where('id',$modelId)->value($field);
}
}
~~~
#### 3、创建静态页
~~~
public function createHtml($visitUrl, $createName){
$url = $this->domain . '/index.php/index/index/' . $visitUrl; //动态页面地址
$fn = ROOT_PATH . 'public/' . $createName; //生成文件名
$content = file_get_contents($url);
$fs = fopen($fn, 'w');
fwrite($fs, $content);
}
~~~
#### 4、创建静态页升级
动态支持列表页传递页码参数
~~~
public function createHtml($visitUrl, $createName, $hasPage = false, $catid = 0){
$url = $this->domain . '/index.php/index/index/' . $visitUrl; //动态页面地址
$fn = ROOT_PATH . 'public/' . $createName; //生成文件名
$content = file_get_contents($url);
if($hasPage){
$content = preg_replace("(<a[^>]*page[=|/](\d+).+?>(.+?)<\/a>)", "<a href='category_".$catid."_$1.shtml'>$2</a>", $content);
}
$fs = fopen($fn, 'w');
fwrite($fs, $content);
}
~~~
- Layer无刷新不跳转弹框提示信息
- 整合ThinkPHP+实用代码
- TP整合Layer插件实现无刷新
- 自定义助手函数
- 添加信息失败后不跳转
- 三种无限级分类
- TP常用代码
- 自定义公共函数
- TP模型管理专题
- TP模型管理之添加模型
- sfox_newmodel.sql
- TP模型管理之删除模型
- TP模型管理之编辑模型
- TP模型管理之字段添加
- sfox_newmodel.sql_edit
- layer_hplus.js_edit
- TP模型管理之字段删除
- TP模型管理之字段编辑
- TP模型管理之预览模型
- TP模型管理之公共函数
- layer_hplus.js_修订一
- TP模型管理之预览模型静态页
- 后台内容管理系统
- 分类树显示
- 内容列表显示
- 信息发布
- 编辑信息
- layer_hplus.js
- myJs第一版
- myJs第二版
- myJs第三版
- myJs第四版
- TP5插件用法
- Datatables
- WebUploader
- bootstrap-fileinput
- UEditor
- 简单调用
- 路径问题
- 跨域多图上传
- 跨域单图上传
- UEditor图片跨域上传解决方案
- 定制工具栏图标
- ajaxFileUpload
- LayUI
- 图片上传
- layui分页
- 搜索页
- 搜索优化及删除
- Uploadify
- TP5前端应用
- 静态首页
- 前台首页功能实现
- 自定义标签库
- 前台模板继承应用
- 首页自定义标签改进
- 文章内容页
- 自定义标签改进
- 自定义标签修正
- 图片等比例自动缩放
- 后台权限管理
- 角色管理
- 规则管理
- 权限设置
- 会员管理
- 权限管理
- 前台登录注册功能
- 注册登录
- 阿里大于手机注册
- 阿里大于升级阿里云短信服务
- 自动登录完成
- PHP异位或加密实现自动登陆
- 微信开发
- 分享接口
- 静态页面实现微信分享
- 动态页微信分享
- 页面静态化
- 1-全站静态化前期配置
- 2-链接地址静态化
- TP5常用片段代码
- 加载静态资源路径与常量
- thinkphp5预定义常量
- 删除某文件夹的内容
- 解压插件包
- 异步提交插件
- 其他功能
- 背景音乐
- 手机访问PC网站自动跳转到手机网站代码
- 手机微信音乐MP3播放器
- 后盾之网页背景音乐
- 播放器宽度自适应
- 前台首页数据调用
- 视频列表
- 搜索分页
- H5解决苹果(IOS)不能自动播放音乐
- 清空缓存
- 文件处理常识
- 删除路径下的所有文件夹和文件
- 一键清空缓存
- 评论留言
- 格式化时间
- 替换微博内容的URL地址@用户与表情
- PHP正则理解
- jQuery评论插件
- TP空操作
- TP路由
- 跨域访问
- 设置请其头允许跨域请求
- 模板前台判断手机访问跳转手机网址代码
- PHP遍历一个文件夹下所有文件和子文件夹
- PHP获取视频的第一帧与时长
- TP5数据库
- 链式操作原理
- update替换字段部分内容
- 后台开发
- 后台登录页居中显示
- TP5自带验证码
- JS & JQuery专题
- 二级城市联动菜单
- 模板引擎
- 混合模板编译
- 黄永成TP微博开发
- 消息推送
- memcache安装
- 插件开发
- 插件介绍
- 插件钩子
- 浅谈初步理解钩子
- 插件钩子(hooks)分析
- 插件钩子简单理解
- 控制器调用插件
- 钩子通用处理函数
- 插件基类代码
- 插件测试代码
- 浅谈钩子与插件
- 技术综合
- 常用代码
- PHP
- 56个PHP开发常用代码片段(上)
- 56个PHP 开发常用代码片段(中)
- 56个PHP 开发常用代码片段(下)
- sublime text安装自动补全注释的插件
- 影音视频开发
- 视频
- H5视频直播扫盲
- 音乐
- 语音
- PHP实现语音播报功能
- MUI
- 窗体操作