设为首页 收藏本站
查看: 1035|回复: 0

[经验分享] PHP 仿博客园 个人博客(2)

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-8-26 07:44:40 | 显示全部楼层 |阅读模式
  先谢谢大家的鼓励与支持,这是第2篇了。也是这个博客系统最核心的东西。这个博客写完后,我会把它放在我的博客网站。这里也有我的一个简历。
  废话不多说了,上一篇有个核心概念就是 give action do something !
  这篇我就用代码来解释这个概念是啥意思,先看我的 post.class.php . 这个文件是我们的数据层处理类。
  
DSC0000.png
  简单介绍一下这个model 类,它继承了一个数据库基类来做crud 等常用操作, 每次初始化时就会初始化一个数据库对象 $db. 我们就用这个对象来操作我们的数据。
  对于数据操作有2个重要方法 storePostFormValues( ) , storeDiaryFormValues( ),它们2个方法是数据流的开始。
  还有2个方法很有意思,addChildNumber( ), reduceChildNumber( ),  它们负责在插入或删除文档时的 一个暗箱操作。因为我的文档可以用多个分类,所以在操作文档的时候,要考虑到一个问题,就是 category 表中有个字段 记录了该分类下的 文档数量。所以要动态地改变这些数目的值。
  
  下面配合 post.php 控制器,我们就可以开始我们数据的流程了(我的控制器还不是一个类,所以无法生成API文档。因为这还不是真正地MVC架构。)所以在MVC之前,这个也能更利于的理解MVC到底是神马东东,以及你自己如何去应用,写出自己的MVC。
  以下的情形都是假设:
  $action = "天上掉下个女朋友给我吧!"; 让我们传入这个控制器看会发生神马事情。



require_once( "config/config.php" );
session_start( );
$action = isset( $_GET['action'] ) ? $_GET['action'] : "";
$username = isset( $_SESSION['username'] ) ? $_SESSION['username'] : "";
if( !$username )
{
header("Location: index.php?action=login");
exit;
}

  这里我们有个重要流程控制语句 switch , 这个单词是 开关的意思; 所以当上面那个 $action = "天上掉下个女朋友给我吧!"; 传入 switch 时,只有2种可能,一种是开,一种是关。这里有点双关地意思,有些同学可能看出来了。嘿嘿!
  言归正传:看看我们的 switch 是如何开关这些 $action , 很明显 天上不会掉个女朋友给我,因为控制器里没有这个开关,所以只能还是说说代码的事。



switch( $action )
{
case "newPost" :
newPost( );
break;
case "delete" :
delete( ) ;
break;
case "updatePost":
updatePost( );
break;
case "IsDraft":
listDraft( );
break;
case "logout" :
logout( );
break;
case "isPost":
listPost( );
break;
case "diffentCategoryPost":
diffentCategoryPost( );
break;
case "unCategory":
unCategory( );
break;
default :
listPost( );
break;
}
  
  每个switch都应该定义默认的 开关,这样当没有女朋友的时候,可以确保我们还有基友。
  如何传入 action 呢?
  来看这样一个url,也就是我们的后台框架的导航, post.php?action=isPost 这个是一个标准的action, 我们每个url 其实都是由这些action组成的,也可以加入其他的一些参数到我们的url 中, 这样我们可以在控制器定义的方法中 GET (得到这些变量的值),然后我们可以多些控制。
  好了,当这个url 到达我们的控制器后,我们接收判断,然后打开一个 isPost 的开关,这样我们就可以调用后面的方法了,想想 开关灯,开关电脑,开关就是我们经常做的事。
  这里我们只是换了一个地方。
  ok 。 来看看这个开关的下面的方法。



function listPost( )
{
$results = array( );
$results['pageTitle'] = "Post List" ;
$results['path'] = "<a href='?action=isPost' >随笔</a>";
// set the message
if ( isset( $_GET['error'] ) )
{
if ( $_GET['error'] == "InsertedFailed" ) $results['errorMessage'] = "文档添加失败";
if ( $_GET['error'] == "postDeleteFailed" ) $results['errorMessage'] = "文档删除失败";
}
if ( isset( $_GET['status'] ) )
{
if ( $_GET['status'] == "changesSaved" ) $results['statusMessage'] = "文档保存了!";
if ( $_GET['status'] == "Deleted" ) $results['statusMessage'] = "文档删除了!";
if ( $_GET['status'] == "Inserted" ) $results['statusMessage'] = "你添加了新的文档!";
if ( $_GET['status'] == "SaveToDraft" ) $results['statusMessage'] = "文档保存到了草稿箱!";
}
// 文档的分类浏览
$db = MySQL::getInstance( );
$pagination = new Pagination;
$cat = new Category;
$results['categories'] =  $cat->getCategoryList("post");
$pagination->countSQL = "select * from post where type = 'post' " ;
$db->Query( $pagination->countSQL );
$pagination->totalRecords = $db->RowCount( );
$records = $db->HasRecords( $pagination->rebuiltSQL( ) );
if( $records )
{
$results['posts'] = $db->QueryArray( $pagination->rebuiltSQL( ) );
require_once(TEMPLATE_PATH . "/post/post_list.php");
}
else
{
require_once(TEMPLATE_PATH . "/post/post_list.php");
}
}
  
我们定义了一个数组,$results = array( ); 这个数组的作用明显,它将保存我们从 model 中获取的任何数据,也可以保存从url上 GET 的特殊参数。然后将在我们下面require_once(*****) 包含的模版中显示出来, 路径定义在了 path 变量中。
  同时我们会接收2个提示参数,
  error , 表示操作出现错误,任何人都在所难免,包括电脑,谁都会犯错,关键是去承认,电脑做的很好,他们勇于承认错误。
  status; 表示状态,就是成功的操作。

$pagination = new Pagination;
这个类是我们的分页类,我们传入一个 总的数量给它,然后它自己会算出总页数,每跳转一个页面,相当于刷新了一次,所以大家的做法就是,在构造器里 GET(获取)url上的page 的值,
让我们知道是当前那一页了。同时我们重新生成了查询的语句,后面加上一条限制的语句,类似 limit $start(起始的id), $offset(长度); 原理就是从这个id起,往后给我10 条记录;
我的设定就是 10 条,你也可以更灵活。

$cat = new Category;
这个类后面会详细说,也是非常重要的分类model。这里我们就是简单获取 这个类型下的所有分类,显示在侧边栏,我已经完成了。有图有真相!

DSC0001.png


  
这样 我们的 $results 数组中就储存了我们页面所需的所有数据。 好的,来看看我们的模版,是怎么输出的。
  


DSC0002.gif DSC0003.gif View Code


  1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2 <html>
  3     <head>
  4         <title>
  5             博客后台管理</title>
  6             <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  7             <link rel="stylesheet" type="text/css" href="assert/css/blog.css" />           
  8     </head>   
  9     <body id="Posts">
10             <table id="BodyTable" border="0" cellpadding="0" cellspacing="0" width="100%">
11                 <tr>
12                     <td id="Header" colspan="2"><div id="SiteNav"></div>            
13                         <div id="BlogTitle">
14                             Arist's Blog
15                         </div>
16                         <div id="Site Title">
17                             <b><blockquote>Hinging there, everything will be fine.</blockquote></b>
18                         </div>
19                     </td>
20                 </tr>
21                 <tr>
22                     <td>
23                         <div id="LeftNavHeader">操作</div>
24                     </td>
25                     <td class="NavHeaderRow">
26                         <ul id="TopNav">
27                             <li><a href="post.php?action=IsPost">随笔</a></li>
28                             <li><a href="article.php?action=IsArticle">文章</a></li>
29                             <li><a href="diary.php?action=IsDiary">日记</a></li>
30                             <li><a href="comment.php?action=IsComment">评论</a></li>
31                             <li><a href="photo.php?action=IsPhoto">相片</a></li>                           
32                         </ul>
33                         <div id="SubNav">
34                             当前位置:&nbsp;<?php if( isset( $results['path'] )) echo $results['path']; ?>
35                         </div>
36                     </td>
37                 </tr>
38                 <tr>
39                     <td class="NavLeftCell">                        
40                         <div class="left_nav">
41                             <ul id="LinksActions">
42                                 <li><a href="article.php?action=newArticle">&raquo; 添加新文章</a></li>
43                             </ul>
44                         </div>
45                         <div id="CategoriesHeader" class="LeftNavHeader">
46                             分类
47                         </div>
48                         <div class="left_nav">
49                             <ul id="LinksCategories">
50                             <li><a href="category.php?action=ListCat&type=article">[编辑分类]</a></li>
51                             <li><a href="article.php?action=IsArticle">[所有分类]</a></li>
52                             <li><a href="article.php?action=unCategory">[未分类]</a></li>
53 <?php
54 if( isset( $results['categories'] )  && ! empty( $results['categories'] ) ){
55     foreach( $results['categories'] as $category ){
56     echo <<<EOB
57                     <li><a href="article.php?action=diffentCategoryArticle&catID={$category['category_id']}">{$category['name']}({$category['count_child_number']})</a></li>
58 EOB;
59     }
60 }
61 ?>
62                             </ul>
63                         </div>
64                     </td>
65                     <td id="Body">
66                         <div id="Main">
67                 <div id="Editor_Messages">
68                 <!-- 显示提示信息 -->
69                 <?php
70                     if( isset( $results['statusMessage'] )){echo  $results['statusMessage'];}
71                     if( isset( $results['errorMessage'] )){echo  $results['errorMessage'];}
72                 ?>
73                 </div>
74 <div id="Editor_Results">
75     <div id="Editor_Results_Header" class="CollapsibleHeader">
76         <span id="Editor_Results_headerTitle">文章(主要用于转载,发布原创博文要通过“随笔”)</span>
77     </div>
78     <div id="Editor_Results_Contents">     
79 <?php  
80     if( isset( $results['posts'] )){
81     echo <<<EOB
82             <table id="Listing" class="Listing" cellspacing="0" cellpadding="0" border="0" style='width:98%;'>
83                 <tr>
84                     <th valign="bottom">
85                         标题
86                     </th>
87                     <th width="40">
88                         发布<br />
89                         状态
90                     </th>
91                     <th valign="bottom" width="50">
92                         评论
93                     </th>
94                     <th width="50">
95                         页面<br />
96                         浏览
97                     </th>              
98                     <th valign="bottom" width="40">
99                         操作
100                     </th>
101                     <th valign="bottom" width="40">
102                         操作
103                     </th>
104                 </tr>
105         
106 EOB;
107         foreach( $results['posts'] as $post ){
108             $time = date("Y-m-d H:i:s", $post['create_time']);
109             if( $post['status'] == "1" ){
110                 $post['status']  = "发布";
111             }    else {
112                 $post['status']  = "<b>未发布</b>";
113             }
114             echo <<<EOB
115             <tr id="entry_{$post['post_id']}" class="Alt">
116                 <td>{$post['title']} ({$time})</td>
117                 <td>{$post['status']}</td>
118                 <td>{$post['view_count']}</td>
119                 <td>{$post['comment_count']}</td>
120                 <td><a href="article.php?action=editArticle&postID={$post['post_id']}">编辑</a></td>
121                 <td><a href="JavaScript:if(confirm('从数据库中删除这篇文档?')==true){window.location='article.php?action=delete&postID={$post['post_id']}';}">删除</a></td>   
122             </tr>
123 EOB;
124         }
125             echo "</table>";               
126             if( isset( $pagination) ){$pagination->createLinks( ) ;}
127     } else {
128         echo "当前无内容!";
129     }
130
131 ?>   
132
133     </div>
134 </div>
135
136
137 <span id="currentPostId"></span>
138
139                         </div>
140                     </td>
141                 </tr>
142             </table>
143             <div id="blog_top_nav_block">
144                 <div id="site_nav">
145                 </div>
146                 <div id="login_area">         
147                  <span id="span_userinfo"><b><?php  echo $_SESSION['username']; ?> </b>&nbsp; <a href="?action=logout">logout</a></span>
148                 </div>
149                 <div class="clear"></div>
150             </div>
151             <table id="Footer" border="0" cellpadding="0" cellspacing="0" width="100%">
152                 <tr>
153                     <td colspan="2">
154                         <div>
155                             &copy; <?php echo date("Y", time( ) ); ?> Arist
156                         </div>
157                     </td>
158                 </tr>
159             </table>
160     </body>
161 </html>
  以上只是显示数据,人人都会啊。
  
  我们怎么操作这些数据呢?
  操作,就像是一种控制能力。 学生时代踢足球,我对球场有一种很强的控制能力,大学足球比赛拿了1次冠军,1次亚军,1次季军,大四没去,中学更是无数荣誉。
  我的位置是中卫,在足球场上,这个位置,你得有统观全局的能力,也得有很强的个人能力,还有指挥能力;扯的远了,现在天天坐在电脑前,这些东西也早就没了,
  就剩下些经验之谈。不过其中滋味,你也须也体验过。
  
  我这个博客有个缺点,每次你对数据库进行一次读写操作,你得刷新啊!我知道这对服务器的负载很大,但是我觉得如果一个新技术你没有完全吃透,盲目运用,只会适得其反。
  所以暂时我还是牺牲服务器的响应时间,内存消耗,来获得一种相对的稳定!
  
  所以我对全局还不是很了解,还有很多未知地领域没有涉入,如深入ajax,深入php,c 。。。 不多说了。
  好了,看看怎么对数据进行CRUD 吧!
  DELETE 删除
先看这个指令 post.php?action=delete&amp;postID=132
  当我们确认要删除时,这里有个注意的地方,我们能先要对该文档所属的分类下的 count_child_number 这个字段进行 一个减 1 的操作。
  为什么? 因为我也开始犯了个逻辑错误,删除后我才调用这个方法,还记得嘛!reduceChildNumber( ) 有趣地地方就是这里,让我受益匪浅!也让我调试了N久!
  
  所以:当你的语法都没错的时候,可能是你的逻辑错了!或是方法错了!这就是我的注释! 请看:



  $post = new Post;
$filter['post_id'] = isset( $_GET['postID'] ) ? ( int )$_GET['postID'] : "";
//  !important 在数据删除之前 先将该分类下的文章数量减 1
// 否则你不知道删除那个分类下的文章数量
// 我犯了个逻辑错误 先删除了 文档, 然后查该文档的分类ID;永远也查不到,因为已经不存在了。
$post->reduceChildNumber( "category", ( int ) $_GET['postID'] );
$result = $post->delete("post", $filter );
  这里我们只要初始化我们文章头顶的那个 model 就可以轻松调用 delete() 方法。
  
  CREATE 插入
  先看这个指令 post.php?action=newPost
  说实话,我很久没有插入了。呵呵! 看控制方法:


View Code


function newPost( )
{
$results['action'] = "newPost" ;
$results['pageTitle'] = " Add New post" ;
$results['newPost'] = "true";
$results['path'] = "<a href='?action=isPost' >随笔</a>&raquo; <span>添加随笔</span>" ;
$post = new Post;
$cat = new Category;
$results['categories'] =  $cat->getCategoryList( "post");
// 新建文档
if( isset( $_POST['saveChanged'] ))
{   
$post-> storePostFormValues( $_POST );
$result = $post->insertPost( );
if( $result )
{
$post->addChildNumber( "category", $_POST['category'] );
header("Location: post.php?action=isPost&status=Inserted");
}
else
{
header("Location: post.php?action=isPost&error=InsertedFailed");
}
// 保存到草稿箱
} else if( isset( $_POST['saveDraft']) )
{
$post = new Post;
$post-> storePostFormValues( $_POST );
$post->saveDraft( );
header("Location: post.php?action=isPost&status=postSaveToDraft");
// cancel
} else if( isset( $_POST['cancel'] ))
{
header("Location: post.php?action=isPost");
}
else
{
require_once(TEMPLATE_PATH . "/post/post_edit.php");
}
}
  
  我们使用一个模版来同时进行文档的插入和更新。关键就是 isset( ),当我们调用控制器的 newPost 方法时,我们并没有往模版中传入文档。
  所以在模版中,我们用 isset() 来做判断时,我们获得了空值,是个好东西;这样我们不会输出任何内容到模版中去。这样,我们等待用户提交表单,在这里,我为了省事,暂时没有对表单进行过滤,不过我留了个后门以后来更新。 好的,假设我们的表单被提交了,(也被你基本的过滤了)。
  
我们调用 post model中 的 storePostFormValues( ) , storeDiaryFormValues( ); 记得嘛,这个方法把所有的表单内容放入一个数组,在做了基本的类型检查之后,
  到这里已经成功一半了。下面就是 insert***()。 这就是mysql 万能数据库操作类的好处,它能帮你处理各种表单,各种类型。当然你如果要求更细,更多,你可以继承它,扩展
  它的方法,或新建方法。 到这里离完成还有一步,addChildNumber( )。 当你为你的文档选择分类时,同时也要在相应的分类表中的 count_child_number中加 1 。
  如果用户选择将文档放入草稿箱的话,只需插入一个 type = PostDraft 的文档记录。
  
  UPDATE 更新
  先看这个指令 post.php?action=updatePost&amp;postID=132
  更新首先就要获得这个文档的数据,postID, 同样是 GET方法得到。 这样我们就可以初始化表单中的 value 值了。 isset( ) 在这里起了关键作用,不是嘛?
  后面的部分大同小异, storePostFormValues( ) , storeDiaryFormValues( ); 然后你调用 post model update***( ) 。
  看代码:


View Code


function updatePost( )
{
$results['action'] = "updatePost";
$results['pageTitle'] = "Edit post";
$post = new Post;
$cat = new Category;
$results['categories'] =  $cat->getCategoryList("post");
if( isset( $_POST['saveChanged'] ))
{
// do update
$post->storePostFormValues( $_POST );
$post->updatePost( );
header("Location: post.php?action=isPost&status=changesSaved") ;                    
} else if( isset( $_POST['cancel'] ) )
{
header("Location: post.php?action=isPost&status=Cancel");
}else
{
// get the post     
$postID = isset( $_GET['postID'] ) ?  $_GET['postID'] : " ";
$results['post'] = $post->getPostByID( $postID );
require_once(TEMPLATE_PATH . "/post/post_edit.php");
}
}
  
  
  到这里就差不多了,我们实现了几乎所有的基本操作。
  几点说明,这些action 有的是导航,有的是生成的,大部分是固定的。自己看着用吧。 下篇说说 分类的事!还有就是这篇博客写完后会放在一个网站上 www.anyui.net
  你如果想要源码学习的话,我会提供下载。谢谢你花这么长时间听我唠叨, 看到这句的人,祝你们 昨天 6,1 快乐,嘿嘿。
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-104215-1-1.html 上篇帖子: php执行多个存储过程 下篇帖子: Netbeans+CodeIgniter搭建PHP开发环境
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表