11.2.9 实现BLOG归档显示的功能
BLOG系统通常会提供按年月归档显示日志的功能,本BLOG系统也将实现这一功能。该功能会将某年某月下的所有日志文章列出,方便用户按时间查看每天的日志文章。
浏览归档显示的日志文章,不需要用户登录。向浏览归档日志文章程序传入的参数是一个年月值字符串,程序根据该值找到日志所在目录,从而获取日志文章的文件内容,然后将文件内容显示到Web界面上。代码11-12是该程序的实现,程序命名为archives.php,如下所示。
代码11-12 归档显示日志文章的程序archives.php
01 <?php
02 $ok=false;
03
04 if(!isset($_GET['ym'])||empty($_GET['ym']))//请求参数中的目录信息
05 {
06 $ok=true;
07 $msg='请求参数错误;<a href="index.php">返回首页</a>';
08 }
09
10 $folder_array=array();//归档目录后的所有目录存在此数组中
11 $dir='contents';
12 $folder=$_GET['ym'];
13 if(!is_dir($dir.'/'.$folder))//找到contents目录下的所有归档目录
14 {
15 $ok=true;
16 $msg='请求参数错误;<a href="index.php">返回首页</a>';
17 }
18
19 $dh=opendir($dir);//打开目录
20 if($dh)
21 {
22 $filename=readdir($dh);//读取指定目录下的所有目录
23 while($filename)
24 {
25 if($filename!='.'&&$filename!='..')
26 {
27 $folder_name=$filename;
28 array_push($folder_array,$folder_name);
29 }
30 $filename=readdir($dh);
31 }
32 }
33 rsort($folder_array);//对目录进行排序
34
35 $post_data=array();
36 $dh=opendir($dir.'/'.$folder);
37
38 while(($filename=readdir($dh))!==FALSE)
39 {
40 if(is_file($dir.'/'.$folder.'/'.$filename))
41 {
42 $file=$filename;
43 $file_name=$dir.'/'.$folder.'/'.$file;
44
45 if(file_exists($file_name))//判断文件是否存在
46 {
47 $fp=@fopen($file_name,'r');
48 if($fp)
49 {
50 flock($fp,LOCK_SH);
51 $result=fread($fp,filesize($file_name));//读取文件
52 }
53 flock($fp,LOCK_UN);
54 fclose($fp);
55 }
56 $temp_data=array();
57 $content_array=explode('|',$result);
58 //以下是文件中的3个日志信息
59 $temp_data['SUBJECT']=$content_array[0];//读取标题
60 $temp_data['DATE']=date('Y-m-d H:i:s',$content_array[1]);//读取日期
61 $temp_data['CONTENT']=$content_array[2];//读取内容
62 array_push($post_data,$temp_data);
63 }
64 }
65 ?>
66
67 <!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN"
68 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
69 <html>
70 <head>
71 <title>基于文本的简易BLOG</title>
72 <link rel="stylesheet"type="text/css"href="style.css"/>
73 </head>
74 <body>
75
76 <div id="container">
77 <div id="header">
78 <h1>我的BLOG</h1>
79 </div>
80 <div id="title">
81 ----I have dream……
82 </div>
83 <div id="left">
84 <?php
85 if($ok==false)
86 {
87 foreach($post_data as$post)
88 {
89 ?>
90 <div id="blog_entry">
91 <div id="blog_title"><?echo$post['SUBJECT'];?></div>
92 <div id="blog_body">
93 <div id="blog_date"><?echo$post['DATE'];?></div>
94 <?php echo$post['CONTENT'];?>
95 </div><!--blog_body-->
96 </div><!--blog_entry-->
97 <?php}
98 }
99 else{
100 echo$msg;
101 }
102 ?>
103 </div>
104
105 <div id="right">
106 <div id="sidebar">
107 <div id="menu_title">关于我</div>
108 <div id="menu_body">
109 我是个PHP爱好者
110 <br/><br/>
111 <a href="login.php">登录</a>
112 </div>
113 </div>
114 <br/>
115 <div id="sidebar">
116 <div id="menu_title">日志归档</div>
117 <?php foreach($folder_array as$ym)
118 {
119 $entry=$ym;
120 $ym=substr($ym,0,4).'-'.substr($ym,4,2);
121 echo'<div id="menu_body"><a href="archives.php?ym='.$entry.'">'.$ym.'</a></div>';
122 }
123 ?>
124 </div>
125 </div>
126
127 <div id="footer">
128 CopyRight 2011
129 </div>
130 </div>
131
132 <body>
133 </html>
134 <?php close($dh);?>
【代码解析】archives.php首先判断是否传入参数ym,该参数的值类似于201112,表示日志的归档年月。如果没有传入该参数,程序将提示错误信息,如代码第4~8行所示;如果传入的参数值没有其对应的目录,也会提示错误信息,如代码第10~17行所示。
接着,程序会在对应年月的目录下找出日志文章所在文件,这是一个循环查找的过程,如代码第38~64行所示。程序会判断当前文件是目录还是普通文件,如代码第40行所示。如果是普通文件,程序将打开该文件并读取文件内容,存入数组当中。如果不是普通文件,则继续循环查找当前目录下的文件,直到找出所有普通文件(及日志文章所在文件)为止。从BLOG首页可以访问archives.php,结果如图11-17所示。