(有点菜,高见请跟帖指教,谢谢:) .. )PHP生成静态新闻
kfq-3456
![]()
|
1#
kfq-3456 发表于2006-11-22
(有点菜,高见请跟帖指教,谢谢:) .. )PHP生成静态新闻
刚在群里发了这个,大家都说看不懂,哈哈,俺要是看了这个也看不太懂,因为有些是封装的
时间不多,这里就简单注释下看不懂的地方,希望大家给个意见,你们的意见就是对我辛苦劳动的认可, 高手不吝赐教!!! 这个函数其实是一个类中的方法 站点采用单一入口 url 就形如 http://*******/?play=news&key=addArt 这里的key=addArt就是指向类news的方法addrArt() OK,现在说说下面的这个: function addArt(){ global $DB; //数据库对象,在入口处已经有个方法定义了,所以global就OK了 if($_POST["submit"]){ //判断是否在后台提交 了发布按钮 // 以下是取得表单内容,这里不多说了,ptime可以用database' NOW()函数更方便点,省事不少 ![]() $sortID = $_POST["sortID"]; $tid = mktime(); $title = $_POST["title"]; $author = $_POST["author"]; $is_show = $_POST["is_show"]; $ptime = date("Y-m-d H:i:s"); $is_hot = "0"; $content = $_POST["content"]; $content = $this->strFiter($content); /*这里是简单过滤下,因为是管理自己输入的所以只定义格式,这个是父类定义的一个过滤方法 ,防止注入的已在入口处统一过滤,strFiter()如: function strFiter($str){ $str = str_replace( "<" , "<" , $str ); $str = str_replace( ">" , ">" , $str ); $str = str_replace( "\n" , "<br>" , $str ); $str = str_replace( " " , " " , $str ); return $str; } 呵呵,英文不错的你应该发现fiter这个好象少了一个l ,哈~,还好将错就错,对上了就没事*/ //下面是取得下一个主题,这个太笨拙了,改日在修改, $DB->query("SELECT title,url FROM mnrc_news WHERE tid < '$tid' ORDER BY tid DESC"); $nextTitle = $DB->row();//取得一行数据,返回数组 //好,下面是正式开始替换模板,说来搞笑,我本来用smarttemplage,但是她不提供一个替换生 //成,也可能是我不知道(应该是不知道,毕竟接触不久),我自己用str_replace()写了个替换,差点晕倒 $fp = fopen("templates/admin/article_model.htm" , "r");//打开模板文件 $fread = fread($fp,filesize("templates/admin/article_model.htm"));//读写整个 //下面几行开始替换变量,这样数据中不用存储内容字段,省掉空间 $fread = str_replace( "{title}" , $title , $fread ); $fread = str_replace( "{content}" , $content , $fread ); $fread = str_replace( "{ptime}" , $ptime , $fread ); $fread = str_replace( "{author}" , $author , $fread ); $fread = str_replace( "{HEADER}" , HEADER , $fread ); $fread = str_replace( "{FOOTER}" , FOOTER , $fread ); $fread = str_replace( "{AD}" , AD , $fread ); $fread = str_replace( "{newstitle}" , $nextTitle["title"] , $fread ); $fread = str_replace( "{path}" , $nextTitle["url"] , $fread ); // show relation news 显示相关新闻,模板形如 <a href="{r[url][1]}">{r[1]}</a>以下的显示栏 //目,显示展会信息类似 $DB->query("SELECT title,url FROM mnrc_news LIMIT 0,9"); $relation = $DB->fetchAll(); $relationnums = 1; foreach( $relation as $v ){ $fread = str_replace( "{r[$relationnums]}" , $v["title"] , $fread ); $fread = str_replace( "{r[url][$relationnums]}" , $v["url"] , $fread ); $relationnums++; } // show hot news $DB->query("SELECT title,url FROM mnrc_news ORDER BY tid DESC LIMIT 0,9"); $hot = $DB->fetchAll(); $hotnums = 1; foreach( $hot as $v ){ $fread = str_replace( "{r[title][$hotnums]}" , $v["title"] , $fread ); $fread = str_replace( "{r[url][$hotnums]}" , $v["url"] , $fread ); $hotnums++; } // show lead info $DB->query("SELECT title,url FROM mnrc_news LIMIT 0,8"); $leadInfo = $DB->fetchAll(); $leadInfonums = 1; foreach( $leadInfo as $v ){ $fread = str_replace( "{l[title][$leadInfonums]}" , $v["title"] , $fread ); $fread = str_replace( "{l[url][$leadInfonums]}" , $v["url"] , $fread ); $leadInfonums++; } // show exhibit meeting $DB->query("SELECT title,url FROM mnrc_news WHERE sortID = '500' ORDER BY tid DESC LIMIT 0,6"); $hot = $DB->fetchAll(); $hotnums = 1; foreach( $hot as $v ){ $fread = str_replace( "{z[title][$hotnums]}" , $v["title"] , $fread ); $fread = str_replace( "{z[url][$hotnums]}" , $v["url"] , $fread ); $hotnums++; } //替换结束,关闭打开的文件 fclose($fp); ############################################ OVER REPLACE ############################################# //下面要开始生成静态文件了 ///////////////////// 定义目录名,如 article/2006-11/ $artDir = "../article/"; $artDir.= date("Y-m")."/"; //////////////////// 如果还没该目录则自动创建 if( !file_exists( $artDir ) ){ mkdir( $artDir , 0777 ); } //// 文件地址,文件名如 22-12345.htm 这样整个URL就如 2006-11/22-12345.htm //////////////////////////// 比较好区分点 $url = date("Y-m") . "/" . date("d") . "-" . substr( mktime() , -5 ) . ".htm"; ////////////////////////// 打开文件,这里当然是没有的,自动创建一个,为空0 $f = fopen( "../article/".$url , "w"); /////////////////////////// 把替换后的文件写入创建的文件中 fwrite( $f , $fread ); ////////////////////////// 关闭文件 fclose($f); // 到这里已经生成了静态文章了,效果还算不错,感觉方法不太好就是了 @@@@@@@@@@@@@@@@ //最后插入数据库,就是一件很惬意的事情了 // INSERT INTO DATABASE $DB->query("INSERT INTO mnrc_news values('$sortID','$tid','$title','$author', '$url','$is_show','$ptime','$is_hot')"); ($DB->affRow() > 0) ? $this->goto("添加新闻成功") : $this->goto("操作失败"); }else{ //如果没有提交表单,显示增加新闻界面 $tpl = new SmartTemplate("admin/addArt.htm"); $DB->query("SELECT * FROM mnrc_news_sort"); $res = $DB->fetchAll(); foreach( $res as $k => $v ) { $res[$k] = $v; } $tpl->assign( "SORTINFO" , $res ); $tpl->output(); } } /////////////////////////////////////////// 实现有多种方式,我的也只是其中不太好的一种,所以各位看了后,给出个意见,一起提高吧,也算是给我鼓励 我现在还有好多东西要做,这个月底走人,老板恨不得我能象机器一样24小时加班....... [ 本帖最后由 kfq-3456 于 2006-11-22 11:22 编辑 ] |