再次用CodeIgniter实现简易blog

  天变冷了,人也变得懒了不少,由于工作的需要,最近一直在学习CodeIgniter(CI)框架的使用,没有系统的从PHP基本语法学起,在网上靠百度谷歌,东拼西凑的实现了一些简单的功能。所以,老PHPer可以绕道了。

PHP实现简易blog

  参考该篇博客所实现的功能,重新用CI实现了一下。

  主要实现文章的添加、查看、删除、搜索。这里面最难实现的是文章分页,看似简单的功能,却费了一些功夫。

当然,离一个完整的系统还有很多功能没开发,这里只是简单引用了bootstrap的样式。

MVC模型                         

CI遵循于MVC模型,如果接触过其它基于MVC模型的web框架的话,理解起来还是比较简单的。

web的开发主要就是在这三个目录下进行。

  • 控制器(controllers目录) 是模型、视图以及其他任何处理 HTTP 请求所必须的资源之间的中介,并生成网页。
  • 模型(models目录) 代表你的数据结构。通常来说,模型类将包含帮助你对数据库进行增删改查的方法。
  • 视图(views目录) 是要展现给用户的信息。一个视图通常就是一个网页,但是在 CodeIgniter 中, 一个视图也可以是一部分页面(例如页头、页尾),它也可以是一个 RSS 页面, 或其他任何类型的页面。

注:本文中的CI运行基于WAMPServer 环境。

创建模型                                                           

打开phpMyAdmin创建表。

这里主要基于该表设计,表名为“myblog”。

在.../application/config/database.php 添加数据库连接。

mysql默认密码为空,数据库名为“test”。“myblog”表在“test”库下创建。

下面实现数据模型层代码,主要是以CI的规则来操作数据库。

.../application/models/News_model.php

<?php
class News_model extends CI_Model {
    public function __construct()
    {
        $this->load->database();
    }
    //获取所有blog
    public function blogs($w,$num,$offset)
    {    

        if($w == 1)
        {
            $query = $this->db->get(‘myblog‘,$num,$offset);
            return $query->result_array();

        }elseif(strpos($w,"title like"))
        {
            $query = $this->db->query("select * from myblog where $w order by id desc limit 5;");
            return $query->result_array();

        }else{

            $query = $this->db->get(‘myblog‘,$num,$offset);
            return $query->result_array();

        }

    }

    //查看一篇blog
    public function up_blogs($id = FALSE)
    {
        if ($id === FALSE)
        {
            $query = $this->db->get(‘myblog‘);
            return $query->result_array();
        }
        //更新点击数
        $this->db->query("update myblog set hits=hits+1 where id=‘$id‘;");
        $query = $this->db->get_where(‘myblog‘, array(‘id‘ => $id));
        return $query->row_array();
    }

    //添加一篇blog
    public function add_blogs()
    {
        $this->load->helper(‘url‘);
        //$slug = url_title($this->input->post(‘title‘), ‘dash‘, TRUE);
        $d = date("Y-m-d");
        $data = array(
            ‘title‘ => $this->input->post(‘title‘),
            ‘dates‘ => $d,
            ‘contents‘ => $this->input->post(‘text‘)
        );
        return $this->db->insert(‘myblog‘, $data);
    }
    //删除一篇blog
    public function del_blogs($id = FALSE){

        $this->load->helper(‘url‘);

        if ($id === FALSE)
        {
            $query = $this->db->get(‘myblog‘);
            return $query->result_array();
        }
        $array = array(
            ‘id‘ => $id
        );
        return $this->db->delete("myblog",$array);

    }
}

创建控制                                                        

控制层一直起着承前启后的作用,前是前端页面,后是后端数据库。

.../application/controllers/News.php

<?php
class News extends CI_Controller {
    public function __construct()
    {
        parent::__construct();
        $this->load->model(‘news_model‘);
        $this->load->helper(‘url_helper‘);
    }
    public function index()
    {
        $this->load->library(‘calendar‘); //加载日历类
        parse_str($_SERVER[‘QUERY_STRING‘], $_GET);
        $this->load->library(‘pagination‘);//加载分页类
        $this->load->model(‘news_model‘);//加载books模型
        $res = $this->db->get(‘myblog‘);//进行一次查询
        $config[‘base_url‘] = base_url().‘index.php/news/index‘;//设置分页的url路径
        $config[‘total_rows‘] = $res->num_rows();//得到数据库中的记录的总条数
        $config[‘per_page‘] = ‘3‘;//每页记录数
        $config[‘prev_link‘] = ‘Previous ‘;
        $config[‘next_link‘] = ‘ Next‘;

        $this->pagination->initialize($config);//分页的初始化

        if (!empty($_GET[‘key‘])) {
            $key = $_GET[‘key‘];
            $w = " title like ‘%$key%‘";

        }else{
            $w=1;

        }

        $data[‘blogs‘] = $this->news_model->blogs($w,$config[‘per_page‘],$this->uri->segment(3));//得到数据库记录

        $this->load->view(‘templates/header‘);
        $this->load->view(‘news/index‘, $data);
        $this->load->view(‘templates/footer‘);

    }
    public function view($id = NULL)
    {
        $this->load->library(‘calendar‘);
        $data[‘blogs_item‘] = $this->news_model->up_blogs($id);
        if (empty($data[‘blogs_item‘]))
        {
            show_404();
        }
        $data[‘title‘] = $data[‘blogs_item‘][‘title‘];

        $this->load->view(‘templates/header‘);
        $this->load->view(‘./news/view‘, $data);
        $this->load->view(‘templates/footer‘);
    }

    public function del($id = NULL)
    {
        $this->news_model->del_blogs($id);
        //通过js跳回原页面
        echo‘
            <script language="javascript">
                alert("create success!");
                window.location.href="http://localhost/CI_blog/index.php/news/";
            </script> ‘;
    }

    public function create()
    {
        $this->load->library(‘calendar‘); //加载日历类

        $this->load->helper(‘form‘);
        $this->load->library(‘form_validation‘);
        $data[‘title‘] = ‘Create a news item‘;
        $this->form_validation->set_rules(‘title‘, ‘Title‘, ‘required‘);
        $this->form_validation->set_rules(‘text‘, ‘Text‘, ‘required‘);
        if ($this->form_validation->run() === FALSE)
        {
            $this->load->view(‘templates/header‘, $data);
            $this->load->view(‘news/create‘);
            $this->load->view(‘templates/footer‘);
        }
        else
        {
            $this->news_model->add_blogs();

            //跳回blog添加页面
            echo‘
            <script language="javascript">
                alert("create success!");
                window.location.href="http://localhost/CI_blog/index.php/news/create";
            </script> ‘;

        }

    }

}

创建视图                                                         

为了让页面好看,使用了bootstrap。

定义页头:

.../application/views/templates/header.php

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <meta name="description" content="">
    <meta name="author" content="">
    <link rel="icon" href="../../favicon.ico">

    <title>Blog Template for Bootstrap</title>

    <!-- Bootstrap core CSS -->
    <link href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet">

    <link href="//v3.bootcss.com/examples/blog/blog.css" rel="stylesheet">

    <script src="//v3.bootcss.com/assets/js/ie-emulation-modes-warning.js"></script>

  </head>

定义页尾:

.../application/views/templates/footer.php

 <footer class="blog-footer">
      <p>Blog template built for <a href="http://getbootstrap.com">Bootstrap</a> by <a href="https://twitter.com/mdo">@mdo</a>.</p>
      <p>
        <a href="#">Back to top</a>
      </p>
    </footer>

    <!-- Bootstrap core JavaScript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
    <script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
    <script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
    <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
    <script src="//v3.bootcss.com/assets/js/ie10-viewport-bug-workaround.js"></script>
  </body>
</html>

不过,这里使用的bootstrap并非引用的本地。而是使用的CDN加速点。

blog首页

.../application/views/news/index.php

<body>

    <div class="blog-masthead">
      <div class="container">
        <nav class="blog-nav">
          <a class="blog-nav-item active" href="#">Blog</a>
          <a class="blog-nav-item" href="//localhost/CI_blog/index.php/news/create">Create</a>
          <a class="blog-nav-item" href="#">Press</a>
          <a class="blog-nav-item" href="#">New hires</a>
          <a class="blog-nav-item" href="//localhost/CI_blog/index.php/login">Login</a>
      <form class="navbar-form navbar-right" method="get">
            <div class="form-group">
              <input type="text" name="key" placeholder="sreach" class="form-control">
            </div>
            <button type="submit" class="btn btn-success">Srecch</button>
          </form>

        </nav>
      </div>
    </div>

    <div class="container">

      <div class="row">

        <div class="col-sm-8 blog-main">

          <div class="blog-post">
        <br>

          <?php foreach ($blogs as $blogs_item): ?>

        <h2 class="blog-post-title"><?php echo $blogs_item[‘title‘]; ?></h2>

        <p class="blog-post-meta">
          <?php echo $blogs_item[‘dates‘]; ?>
          Reading:<?php echo $blogs_item[‘hits‘]; ?></a>
        </p>

        <div class="main">
          <?php echo iconv_substr($blogs_item[‘contents‘],0,100); ?>...
        </div>
        <p><a href="<?php echo site_url(‘news/view/‘.$blogs_item[‘id‘]); ?>">View article</a></p>
        <p><a href="<?php echo site_url(‘news/del/‘.$blogs_item[‘id‘]); ?>">Delete</a></p>

        <?php endforeach; ?>
        <!--翻页链接-->
        <br><br><?php echo $this->pagination->create_links();?>

          </div><!-- /.blog-post -->

        </div><!-- /.blog-main -->

        <div class="col-sm-3 col-sm-offset-1 blog-sidebar">
          <div class="sidebar-module sidebar-module-inset">
            <h4>About</h4>
            <p>Etiam porta <em>sem malesuada magna</em> mollis euismod. Cras mattis consectetur purus sit amet fermentum. Aenean lacinia bibendum nulla sed consectetur.</p>
          </div>
      <div class="sidebar-module sidebar-module-inset">
            <?php echo $this->calendar->generate(); ?>
          </div>
          <div class="sidebar-module">
            <h4>Archives</h4>
            <ol class="list-unstyled">
              <li><a href="#">March 2014</a></li>
              <li><a href="#">February 2014</a></li>
              <li><a href="#">January 2014</a></li>
              <li><a href="#">December 2013</a></li>
              <li><a href="#">November 2013</a></li>
              <li><a href="#">October 2013</a></li>
              <li><a href="#">September 2013</a></li>
              <li><a href="#">August 2013</a></li>
              <li><a href="#">July 2013</a></li>
              <li><a href="#">June 2013</a></li>
              <li><a href="#">May 2013</a></li>
              <li><a href="#">April 2013</a></li>
            </ol>
          </div>
          <div class="sidebar-module">
            <h4>Elsewhere</h4>
            <ol class="list-unstyled">
              <li><a href="#">GitHub</a></li>
              <li><a href="#">Twitter</a></li>
              <li><a href="#">Facebook</a></li>
            </ol>
          </div>
        </div><!-- /.blog-sidebar -->

      </div><!-- /.row -->

    </div><!-- /.container -->

blog添加页面

.../application/views/news/create.php

<!-- ckeditor编辑器源码文件 -->
  <script src="//cdn.ckeditor.com/4.5.5/standard/ckeditor.js"></script>
<body>

    <div class="blog-masthead">
      <div class="container">
        <nav class="blog-nav">
          <a class="blog-nav-item" href="//localhost/CI_blog/index.php/news">Blog</a>
          <a class="blog-nav-item active" href="#">Create</a>
          <a class="blog-nav-item" href="#">Press</a>
          <a class="blog-nav-item" href="#">New hires</a>
          <a class="blog-nav-item" href="#">About</a>
        </nav>
      </div>
    </div>

    <div class="container">

      <div class="blog-header">
        <h2 class="blog-title"><?php echo $title; ?></h2>
        <p class="lead blog-description">Please add an article.</p>
      </div>

      <div class="row">

        <div class="col-sm-8 blog-main">

          <div class="blog-post">

      <?php echo validation_errors(); ?>

      <?php echo form_open(‘news/create‘); ?>

        <label for="title">Title</label><br/>
        <input type="input" name="title" /><br/>

        <label for="text">Contents</label><br/>
        <textarea rows="10" cols="80" name="text"></textarea><br/>
        <script type="text/javascript">CKEDITOR.replace(‘text‘);</script>

        <input type="submit" name="submit" value="Create news item" />

      </form>

          </div><!-- /.blog-post -->

        </div><!-- /.blog-main -->

        <div class="col-sm-3 col-sm-offset-1 blog-sidebar">
          <div class="sidebar-module sidebar-module-inset">
            <h4>About</h4>
            <p>Etiam porta <em>sem malesuada magna</em> mollis euismod. Cras mattis consectetur purus sit amet fermentum. Aenean lacinia bibendum nulla sed consectetur.</p>
          </div>
      <div class="sidebar-module sidebar-module-inset">
            <?php echo $this->calendar->generate(); ?>
          </div>
          <div class="sidebar-module">
            <h4>Archives</h4>
            <ol class="list-unstyled">
              <li><a href="#">March 2014</a></li>
              <li><a href="#">February 2014</a></li>
              <li><a href="#">January 2014</a></li>
              <li><a href="#">December 2013</a></li>
              <li><a href="#">November 2013</a></li>
              <li><a href="#">October 2013</a></li>
              <li><a href="#">September 2013</a></li>
              <li><a href="#">August 2013</a></li>
              <li><a href="#">July 2013</a></li>
              <li><a href="#">June 2013</a></li>
              <li><a href="#">May 2013</a></li>
              <li><a href="#">April 2013</a></li>
            </ol>
          </div>
          <div class="sidebar-module">
            <h4>Elsewhere</h4>
            <ol class="list-unstyled">
              <li><a href="#">GitHub</a></li>
              <li><a href="#">Twitter</a></li>
              <li><a href="#">Facebook</a></li>
            </ol>
          </div>
        </div><!-- /.blog-sidebar -->

      </div><!-- /.row -->

    </div><!-- /.container -->

这里使用了ckeditor 编辑器的使用我们可以创建带格式的文章。同样引的CDN。

最后,还要在routes.php文件中添加以下配置。

.../application/config/routes.php

$route[‘news/create‘] = ‘news/create‘;
$route[‘news/view‘] = ‘news/view/$1‘;
$route[‘news/del‘] = ‘news/del/$1‘;
$route[‘news/news‘] = ‘news‘;
$route[‘news‘] = ‘news‘;
$route[‘default_controller‘] = ‘pages/view‘;

好了,主要代码就这些了。感兴趣去github上看完整代码吧!

https://github.com/defnngj/ci_blog

PS:这只是为了练习而已,所以,各个功能很乱,并无打算写一个完整的系统。

时间: 2024-10-21 20:17:24

再次用CodeIgniter实现简易blog的相关文章

django开发个人简易Blog——数据模型

提到数据模型,一定要说一下MVC,MVC框架是现代web开发中最流行的开发框架,它将数据与业务逻辑分开,减小了应用之间的高度耦合.个人非常喜欢MVC开发框架,除了具有上述特性,它使得web开发变得非常灵活,在ASP.NET上表现的尤为强烈,传统的ASP.NET开发常常用到好多臃肿的服务器端控件,定制起来非常麻烦而且具有局限性.近年来,MVC遍地开发,在java.php.ruby..NET,甚至javascript中都有对应的MVC框架,当然了,django也是其中之一. 数据模型作为MVC的一部

django开发个人简易Blog—nginx+uwsgin+django1.6+mysql 部署到CentOS6.5

前面说完了此项目的创建及数据模型设计的过程.如果未看过,可以到这里查看,并且项目源码已经放大到github上,可以去这里下载. 代码也已经部署到sina sea上,地址为http://fengzheng.sinaapp.com/ 先跳过视图展示及表单处理的部分,先介绍一下如何部署. 标题中已经把部署环境介绍的很清楚了: 服务器:CentOS6.5 其实就是我的开发机 mysql:Server version: 5.1.73 Source distribution nginx版本: nginx/1

django开发个人简易Blog——构建项目结构

开发之前第一步,就是构造整个的项目结构.这就好比作一幅画,第一步就是描绘轮廓,有了轮廓,剩下的就是慢慢的填充细节.项目结构规划如下图: 项目结构描述: 本项目以fengzhengBlog为根目录. admin.blogapp是两个app目录,用于实现项目主要功能:包括模型定义.视图定义等 css.js.images分别为样式文件.js.图片的静态文件存放目录. template目录存放模板文件. ueEditor是富文本编辑器uEditor的目录. settings.py是全局配置文件,urls

Django初体验——搭建简易blog

前几天在网上看到了篇采用Django搭建简易博客的视频,好奇心驱使也就点进去学了下,毕竟自己对于Django是无比敬畏的,并不是很了解,来次初体验. 本文的操作环境:ubuntu.python2.7.Django1.8.6.Pycharm5.其实自从使用了ubuntu之后就很神奇的喜欢上了它,真的用起来方便很多. 1.Django项目文件并创建blog应用 (1)可以在终端中建立Django项目,使用django-admin startproject ...直接上图: 建立blog应用: (2)

PHP实现简易blog

最近,有时间看了点PHP的代码.参考PHP100教程做了简单的blog,网易云课堂2012年的教程,需要的可以找一下,这里面简单的记录一下. 首先是集成环境,这里选用的WAMP:http://www.wampserver.com/en/ 首先通过,phpMyAdmin创建一张blog表. 纯界面操作,过程比较简单,需要注意的是id是主键,并且设置auto_increnent 选项,表示该字段为空时自增.其它字段就比较随便了,注意类型和长度即可. 创建数据连接                  

基于diango简易BLOG图片预览

注册界面 登陆界面 博客主界面 个人站点主页 文章详情页 个人博客后台 添加文章页 修改密码页 原文地址:https://www.cnblogs.com/yxiaodao/p/9689709.html

django1.10版本解决CSRF问题

>>> import django >>> django.get_version() '1.10.6' (本文誊抄自之前自行编写的CSDN文档中) CSRF是(Cross-Site Request Forgery)跨站请求伪造,简单的用于防止恶意网站上的表单或者JavaScript利用用户登录过的认证信息,对网站进行某些操作,利用Django进行web开发过程中,如不对app下的views.py脚本和template下的html文件做重写,在进行POST时就会出现403

0537-实战将lnmp服务中的数据库独立分离到服务器

前面安装的nginx和php,mysqld的服务要加入开机自启动,加入方法如下: vi /etc/rc.local添加如下内容为开机自启动 [[email protected] extra]# vi /etc/rc.local 追加到/etc/rc.local文件最后面 #### /application/nginx/sbin/nginx /application/php/sbin/php-fpm /etc/init.d/mysqld start 备份所有库(不需要备份所有库只需要备份wordp

关于Python-Django数据库的一个小问题

最近在阅读Django web开发指南学习Python-Django框架,在练习创建简单blog时,发现出现的状况和书中内容不符: 1.就是目前新的Django版本没有了syncdb这个指令,取而代之的是migrate和makemigrations 2.按照书中编写完简易blog后,使用该框架创建简易blog后保存会出现错误,提示OperationalError: no such table: blog_blogpost,由于涉及到了数据库,而错误中又提示找不到blog_blogpost表,猜测