php搭建个人博客

这几天不知道该干些什么,就想着完善一下博客。

基本的发表文章功能已经实现了,就估摸着加个评论回复 可以和其他人交流 比较有意思

然后开始百度 php实现评论回复功能 看了下,不想看。。。 就直接打开之前收藏的 实验楼的 php实现留言本看下怎么实现留言回复,评论回复跟留言回复差差不多的样子

先把源码下载了,看数据库设计  

*** 这几天在想实现这个功能的时候 发现 要实现一个功能 就要设计好一个数据表 在设计数据表的过程中 程序的逻辑 和 细节会慢慢在脑海中清晰 这是一个很棒的过程 ***

 

 

php搭建个人博客 

 

昨天断网了。。。,学校12点断网  蛋疼,今天补上。。。

 

看了下,发现没什么卵用 主要字段 id, nickname, content, createtime 感觉有用, reply,replytime,并没有什么用,别人回复很多条的时候reply怎么存?status 后台管理审核评论时需要,但是我想先把最简单的功能实现了再说,

 

然后开始找 别人的博客,看看怎么写,。。。 翻着目录程序结构都不清不楚, 还是算了,缓一会儿,

去群里问一下,  大神就一句话, 无限分类    ,然而我一脸懵逼,好高大上的词汇啊

php搭建个人博客

继续问大神,大神给我解释了,一个类可以有无限多个子类的子类, 嗯, 一头雾水是吧,我直接百度 搜到了这么一篇文章 php无限分类

http://www.cnblogs.com/php-js/p/php-classify.html

要实现 评论的回复, 关键就在于 无限级分类,一个类有多个子类,它的子类也有多个子类,这样无限循环下去,就是无限级分类 一级、二级、三级、。。。。。。

 

正好,我可以先实现文章分类,趁机学习无限极分类,文章分类花了一个晚上的时间,主要是看其它博客是怎么实现的 我学习了 Startblog ,

开始在开源社区找到这个博客的时候 大喜 都是用ci做的功能简单轻型博客,嘿嘿嘿,省去了好多功夫,我甚至可以对照着Startblog把后面的功能全部完善了,不过这样也不太好,主要目的还是学习,锻炼自己,不能一味的照搬前人。 这样没有任何益处

好了,代码下好,收悉的结构,进入到目录 /application/models/ 下 打开 Category_model.php 嗯,不错,是我想要的类型php搭建个人博客

(好像有点无耻啊hhhhhh)

继续,把controller 类都打开  一点点看懂, 这里贴出我的版本 

 

在尝试无限级分类的过程中,暂时学不会, 就直接写一级分类了

我的category表:

php搭建个人博客

好low 啊 QAQ ,受不了了,先掐死我自己

感觉没啥东西,就是一个 select * from category,把所有分类都查询出来

还有一个 function 是 根据 category 查询出属于这个分类的blog,就是这么简单

 

Category_model.php

class Category_Model extends CI_Model {public function __construct() {parent::__construct();$this->load->database();}public function getAllCategory() {$sql = "select * from category";$data_tmp = $this->db->query($sql)->result_array();foreach ($data_tmp as $value) {$category_id = $value['id'];$data["$category_id"]['id'] = $value['id'];$data["$category_id"]['category'] = $value['category'];}return $data;}public function getAllBlogs($category_id) {$sql = "select * from blogs where category={$category_id}";$data = $this->db->query($sql)->result_array();return $data;}}

 

 

然后控制类,根据category_model查询到的内容输出 就行了


Categoy.php

 

class Category extends CI_Controller {public function show($id) {$this->load->helper('url');$this->load->model('category_model');$data['data'] = $this->category_model->getAllBlogs($id);$data['cur_category'] = $this->category_model->getCategory($id);$data['all_category'] = $this->category_model->getAllCategory();$this->load->view('templates/header', $data);$this->load->view('pages/category_show', $data);$this->load->view('templates/footer');}}

效果图:

php搭建个人博客

好像没什么效果啊

这么简单的东西,还弄了一天 

 

php搭建个人博客

其实,整个摸索得过程,慢慢理解,花了很长时间,之后再是运用 

分类做完了,发现,无限级分类 没用上。。。QAQ

没事,现在可以开始写评论回复了,先构思个一两天  php搭建个人博客

嗯,设计数据表,

我参照了 php无限级分类实现评论回复功能 我记得是之前在csdn上看到过,不过都一样的,没关系了,下载好源码,开始探索。。。

我去,原生php,牛逼啊大兄弟,直接不想翻了,它的数据表示这样的:

php搭建个人博客

 

id nickname content create_time,一般就这样, 关键的是 parent_id 靠这个id 查找评论的子级评论,也就是回复

根据我自己的摸索,我设计了一张comments 表

贴上 :

php搭建个人博客

blog_id 用于 标记所属文章,我结合 model来说明

和 category 差不多 传入 blog_id 查询出 对 id 为blog_id 的文章的所有 comment 这是getComment function, 

getTreeComment function是通过递归实现 无限级分类评论回复

$parent 参数传入 comment 的cid 作为 上级id  ,  如果有comment 的 parent 等于上一级的 cid 也就是它是 上一级comment 的回复,就把它存进 $tree

初始 $parent = 0.

Comments_model.php

 

class Comments_Model extends CI_Model {public function __construct() {parent::__construct();$this->load->database();}public function addComment($data) {$this->db->insert('comments', $data);return $this->db->insert_id();}public function getComment($blog_id) {$sql = "select * from comments where blog_id={$blog_id} order by created ASC";$query = $this->db->query($sql)->result_array();return $query;}private function getTreeComments($comments, $parent,) {global $tree;foreach ($comments as $comment) {if ($comment['parent'] == $parent) {$tree[] = $comment;$this->getTreeComments($comments, $comment['cid'],);}}return $tree;}}


但是由于 输出 视图的效果不是我想要的,所以我改了下, 不在controller里实现 tree 而是在输出视图的时候通过 递归 

 

 

等下去上体育课,晚上回来再补上。。。

 

上代码,

comment.php

 

<?phpif (count($comments) > 0) {function ListComments($comments, $parent) {foreach ($comments as $row) {if ($row['parent'] == $parent) {?><div class="col-md-11 col-md-offset-1">            <div class="row">                <div class="col-md-10">                    <p><strong><?php echo $row['nickname'];?></strong> said at <?php echo date('d-m-Y h:i A',strtotime($row['created']));?><br>                    <?php echo $row['content']; ?></p>                </div>                <div class="col-md-2">                    <a class="comment-reply-link" href="#comment-reply" οnclick="commentReply(<?php echo $row['cid'];?>, this)">reply</a>                </div>            </div>            <hr>            <?php                            ListComments($comments, $row['cid']);                            echo '</div>';                        }                    }                }                ListComments($comments, 0);            }?>

好像很乱,。。。。

 

糟糕的代码 php搭建个人博客

效果图:

 

php搭建个人博客


 

实现阶梯式评论回复视图效果 的关键在于 无限级分类 递归的出口点

选对了出口点 才能实现

还有一个评论框 效果, 直接上图:

php搭建个人博客

点击reply后:

 

php搭建个人博客

然后cancel reply继续恢复到原来的位置, 这个实现 需要js 

comment_reply.js

 

function commentReply(parent, c) {var response = document.getElementById('comment-post');document.getElementById('comment-parent').value = parent;document.getElementById('cancel-reply').style = '';c.parentNode.parentNode.appendChild(response);}function cancelReply() {var commentPlace = document.getElementById('comment-place'),response = document.getElementById('comment-post');document.getElementById('comment-parent').value = 0;document.getElementById('cancel-reply').style = 'display:none';commentPlace.appendChild(response);}

嗯,到此,评论回复 基本完成。

 

上一篇:JsonPath的应用


下一篇:结构体中包含unoin