由于自己 没有很多时间去打理自己的博客,索性就把博客换成了Wordpress了,但是我又不想丢失掉之前的资源,幸好之前的页面都是伪静态的html页面,所以就想着把这些页面全部静态化处理转换成html页面让用户依然能够访问到,我查阅了一下ThinkPHP的文档,有这么一个函数buildhtml(),这个函数是2.x的时代有的,我尝试着用了一下,但是没有成功,经过一番思考,想到了一个比较好的方法,把这个问题解决了。
这个方法是使用ob_start()和ob_get_clean()这两个函数,先将网页输出到缓冲区,然后提取到变量中,最后输出到对应的*.html文件中去,下面是相关的代码,给大家分享一下:
<?php namespace Home\Controller; use Think\Controller; class indexController extends Controller { //将$details内容写入到$postion的文件夹中的$filename文件 private function WriteToFile($detail,$filename,$postion="./RM/"){ $filename = $postion.$filename; file_put_contents($filename, $detail); } //这个函数 的目的是把codeorg这个数据库对应的页面全部生成html文件 //注意,一定要先创建相关的文件夹才行,例如我的输出位置是"./RM/codeorg/sid/"这个文件夹 public function buildHtml(){ //首先连接数据库 $Model = M("codeorg"); //查询到文章的sid记录 $SidList = $Model->field("ID") ->select(); //我的页面是在CodeorgController输出的 $AppCtrl = new \Home\Controller\CodeorgController(); //循环 foreach ($SidList as $key => $sidArr) { //我要生成的页面名称sid的值 $_GET["sid"]=$sidArr["ID"]; //开启输出缓冲 ob_start(); //执行原来的那个显示页面的函数 //注意你的输出页面的函数中的$this->display("xxx:XXX");其中display函数必须要指明模板 //不能使用display()默认空的参数, //因为当前你在buildHtml函数中,display()的默认模板位置是不对的 $AppCtrl->displaycode();//显示一个页面,实际上是把页面输出到了缓冲区 $out = ob_get_clean();//获取到缓冲区域内容 //写入文件 $this->WriteToFile($out,$sidArr["ID"].".html","./RM/codeorg/sid/"); } } ?>
上面的代码值得说的地方就是,你在ob_start()和ob_get_clean()之间的页面输出操作,在ThinkPHP中,如果$this->display()输出操作不指定display()的模板的话,那么display()的参数将会是 “控制器:ACTION” 这个路径,所以当你在其他控制器中调用页面输出的时候,如果display()没有指定参数的话,会默认到当前调用的控制器.
转载请注明:悠然品鉴 » ThinkPHP生成静态页面