使用PHP CodeIgniter 框架搭建一个简易的Blog

使用PHP CodeIgniter 框架搭建一个简易的Blog

准备工作

php.ini配置文件中添加所在时区

根据PHP开发规范,修改Visual Studio Code中行尾结束符为\n,即 Unix 格式换行符(LF)

下载 CodeIgniter 3.1.10 并解压到网站根目录,按照自己的信息来修改 config.phpdatabase.php

下载Bootstrap到网站根目录(参考之前的文章)

移除index.php(请参考官方文档操作)

简单规划

分为两个类:

  • Welcome类,用于浏览者访问使用
  • Admin类,用于管理员日常操作

Welcome类包含文章列表和文章查看等功能 Admin类包含管理员登录,文章添加,文章修改和删除,账号的修改等功能

创建数据库类(Model)

在模型中创建两个函数来提供分页所需的数据,一个是文章总数,一个是查询一定范围的数据

/**
 * 查询总数
 */
public function post_counts()
{
    return $this->db->count_all('blog_main');
}

/**
 * 获取文章列表
 */
public function get_post_list($limit,$start)
{
    $this->db->limit($limit, $start);
    $query = $this->db->get('blog_main');

    if ($query->num_rows() > 0)
    {
        foreach ($query->result() as $row)
        {
            $data[] = $row;
        }
        return $data;
    }
    return FALSE;
}

创建Welcome

<?php
// 防止非法访问当前的 PHP 文件
defined('BASEPATH') OR exit('No direct script access allowed');

class Welcome extends CI_Controller {
...
...
...
}

类名和类文件的命名规则应当一致,首字母大写,如有多个单词,使用下划线分割。

构造函数

public function __construct()
{
    parent:: __construct();
    $this->load->helper("url");
    $this->load->library("pagination");
    $this->load->model('Blog_post_model');
}

具有构造函数的类会在每次创建新对象时先调用此方法,非常适合在使用对象之前做一些初始化工作,在构造函数中加载的数据会在整个类中生效,不必在每个方法中再次加载。(更多关于构造函数的内容,请参考PHP官方文档及文末给出的参考资料)

创建默认方法

public function index()
{       
    $config['base_url'] = base_url() . 'index.php/welcome/index/';
    $config['total_rows'] = $this->Blog_post_model->post_counts();
    $config['per_page'] = 6;
    $config["uri_segment"] = 3;
    $this->pagination->initialize($config);
    $page = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0;      
    $result['results'] = $this->Blog_post_model->get_post_list($config['per_page'],$page);
    $result["links"] = $this->pagination->create_links();       
    $this->load->view('welcome',$result);
}

创建视图

创建模板 将经常使用的静态HTML当作模板,降低代码重复度,方便调用。

新建页头文件 application/views/templates/header.php 并添加以下代码:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title>博客</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link href="<?php echo base_url();?>static/css/bootstrap.css" rel="stylesheet">
        <link href="<?php echo base_url();?>static/css/style.css" rel="stylesheet">    
    </head>
    <body>

再新建个页脚文件 application/views/templates/footer.php ,然后添加以下代码:


    <script src="<?php echo base_url();?>static/jquery/jquery-3.3.1.js"></script>   
    <script src="<?php echo base_url();?>static/js/bootstrap.js"></script>
    <script src="<?php echo base_url();?>static/js/scripts.js"></script>    
    </body>
</html>

创建welcome试图文件

<div class="container-fluid header">
    <div class="row">
        <div class="col-md-12">
            <h2>
                博客
            </h2>           
        </div>
    </div>
</div>
<div class="container">
    <div class="row">
        <div class="col-md-12">
            <?php foreach($results as $obj): ?>
            <div class="artList border shadow p-3 mb-5 bg-white rounded">
                <h3 style="margin-bottom:30px">
                    <a href="<?php echo site_url();?>/Welcome/browse_post/<?php echo $obj->id;?>"><?php echo $obj->title;?></a>
                </h3>
                <p>
                    <?php                           
                        $data = $obj->content;
                        $data=strip_tags($data);//去除html标记
                        $pattern = "/&[a-zA-Z]+;/";//去除特殊符号
                        $data=preg_replace($pattern,'',$data);
                        $data=mb_strimwidth($data,0,255,"......");
                        echo $data;                         
                    ?>
                </p>
                <p>
                    <a href="<?php echo site_url();?>/main/conView/<?php echo $obj->id;?>">阅读更多</a>
                    <span class="float-right">更新时间:<?php echo date("Y-m-d",$obj->create_time);?></span>
                </p>                    
            </div>              
            <?php endforeach; ?>            
        </div>
    </div>  
    <?php echo $links ?>
</div>

修改routes

$route['default_controller'] = 'Welcome';

将默认控制器改成Welcome,那么在浏览器中输入http://www.xxx.com时,CI框架会开始寻找Welcome类,然后调用index方法,index方法会处理数据然后返回视图welcome到浏览器。

以上就是CI框架工作的大致流程。

文章详情页面

(未完待续)


本文参考:

Visual Studio Code: How to show line endings

What is the function of __construct() in CodeIgniter?

Constructors and Destructors