由于开发一套系统需要,经过朋友推荐CodeIgniter php框架,所以有了这次简单的快速上手教程。

官网地址:https://www.codeigniter.com
中文官网:https://codeigniter.org.cn
中文文档:https://codeigniter.org.cn/user_guide

 加载静态内容

新建一个控制器来处理静态页面,控制器就是一个简单的类,它是整个 Web 应用程序的 “粘合剂” 。

例如,当访问下面这个 URL 时:
http://example.com/news/latest/10
通过这个 URL 就可以推测出来,有一个叫做 “news” 的控制器,被调用的方法为 “latest” , 这个方法的作用应该是查询 10 条新闻条目并显示在页面上。在 MVC 模式里,会经常看到下面 格式的 URL :
http://example.com/[controller-class]/[controller-method]/[arguments]

新建一个文件 application/controllers/Pages.php:

<?php
class Pages extends CI_Controller {
    public function view($page = 'home')
    {
    }
}

创建了一个 Pages 类,有一个方法 view 并可接受一个 $page 参数。 Pages 类继承自 CI_Controller 类,这意味着它可以访问 CI_Controller 类( system/core/Controller.php )中定义的方法和变量。

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

<html>
    <head>
        <title>CodeIgniter Tutorial</title>
    </head>
    <body>
        <h1><?php echo $title; ?></h1>

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

        <em>&copy; 2017</em>
    </body>
</html>

 在控制器中添加逻辑

刚刚新建了一个控制器,里面有一个 view() 方法,这个方法接受一个参数 用于指定要加载的页面,静态页面模板位于 application/views/pages/ 目录。
在该目录中,再新建两个文件 home.php 和 about.php ,在每个文件里随便 写点东西然后保存它们。

为了加载这些页面,需要先检查下请求的页面是否存在:

public function view($page = 'home')
{
  if ( ! file_exists(APPPATH.'views/pages/'.$page.'.php'))
    {
        // Whoops, we don't have a page for that!
        show_404();
    }
    $data['title'] = ucfirst($page); // Capitalize the first letter
    $this->load->view('templates/header', $data);
    $this->load->view('pages/'.$page, $data);
    $this->load->view('templates/footer', $data);
}

当请求的页面存在,将包括页面和页脚一起被加载并显示给用户,如果不存在, 会显示一个 “404 Page not found” 错误。
第一行检查页面是否存在,file_exists() 是个原生的 PHP 函数,用于检查某个 文件是否存在,show_404() 是个 CodeIgniter 内置的函数,用来显示一个默认的 错误页面。
在页头文件中,$title 变量用来自定义页面的标题,它是在这个方法中赋值的, 但是注意的是并不是直接赋值给 title 变量,而是赋值给一个 $data 数组的 title 元素。
最后要做的是按顺序加载所需的视图,view() 方法的第二个参数用于向视图传递参数, $data 数组中的每一项将被赋值给一个变量,这个变量的名字就是数组的键值。 所以控制器中 $data[‘title’] 的值,就等于视图中的 $title 的值。

 创建数据模型

数据库的查询操作应该放在模型里,而不是写在控制器里,这样可以很方便的重用它。 模型正是用于从数据库或者其他存储中获取、新增、更新数据的地方。

打开 application/models/ 目录,新建一个文件 News_model.php ,然后写入下面的代码:

<?php
class News_model extends CI_Model {
    public function __construct()
    {
        $this->load->database();
    }
}

在查询数据库之前,要先创建一个数据库表。连接的数据库,运行下面的 SQL 语句(MySQL),并添加一些测试数据:

CREATE TABLE news (
    id int(11) NOT NULL AUTO_INCREMENT,
    title varchar(128) NOT NULL,
    slug varchar(128) NOT NULL,
    text text NOT NULL,
    PRIMARY KEY (id),
    KEY slug (slug)
);

NSERT INTO `news` (`id`, `title`, `slug`, `text`) VALUES
(1, '好世界', 'you', '这是内容这是内容这是内容这是内容这是内容这是内容这是内容这是内容这是内容这是内容这是内容这是内容这是内容这是内容这是内容'),
(2, 'Hello World', 'me', 'This is content.This is content.This is content.This is content.This is content.This is content.This is content.This is content.This is content.This is content.This is content.This is content.This is content.This is content.');

通过这个代码,可以执行两种不同的查询,一种是获取所有的新闻条目,另一种 是根据它的 slug 来获取新闻条目。应该注意到,$slug 变量在执行查询之前 并没有做检查, 查询构造器 会自动帮检查的。

 显示新闻

查询已经写好了,接下来需要将模型绑定到视图上,向用户显示新闻条目了。 这可以在之前写的 Pages 控制器里来做,但为了更清楚的阐述,定义了一个新的 News 控制器,创建在 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()
    {
        $data['news'] = $this->news_model->get_news();
    }
    public function view($slug = NULL)
    {
        $data['news_item'] = $this->news_model->get_news($slug);
    }
}

首先是 __construct() 方法,它调用父类(CI_Controller)中的构造函数,并加载模型。这样模型就可以 在这个控制器的其他方法中使用了。另外它还加载了 URL 辅助函数 , 因为在后面的视图中会用到它。

其次,有两个方法用来显示新闻条目,一个显示所有的,另一个显示特定的。 可以看到第二个方法中调用模型方法时传入了 $slug 参数,模型根据这个 slug 返回特定的新闻条目。
现在,通过模型,控制器已经获取到数据了,但还没有显示。下一步要做的就是, 将数据传递给视图:

public function index()
{
    $data['news'] = $this->news_model->get_news();
    $data['title'] = 'News archive';
    $this->load->view('templates/header', $data);
    $this->load->view('news/index', $data);
    $this->load->view('templates/footer');
}

上面的代码从模型中获取所有的新闻条目,并赋值给一个变量,另外页面的标题赋值给了 $data[‘title’] 元素,然后所有的数据被传递给视图。现在需要创建一个视图文件来 显示新闻条目了,新建 application/views/news/index.php 文件并添加如下代码:

<h2><?php echo $title; ?></h2>
<?php foreach ($news as $news_item): ?>
    <h3><?php echo $news_item['title']; ?></h3>
    <div class="main">
        <?php echo $news_item['text']; ?>
    </div>
    <p><a href="<?php echo site_url('news/view/'.$news_item['slug']); ?>">View article</a></p>
<?php endforeach; ?>

新闻的列表页就做好了,但是还缺了显示特定新闻条目的页面,之前创建的模型可以很容易的 实现该功能,只需要向控制器中添加一些代码,然后再新建一个视图就可以了。回到 News 控制器,使用下面的代码替换掉 view() 方法:

public function view($slug = NULL)
{
    $data['news_item'] = $this->news_model->get_news($slug);
    if (empty($data['news_item']))
    {
        show_404();
    }
    $data['title'] = $data['news_item']['title'];
    $this->load->view('templates/header', $data);
    $this->load->view('news/view', $data);
    $this->load->view('templates/footer');
}

并没有直接调用 get_news() 方法,而是传入了一个 $slug 参数, 所以它会返回相应的新闻条目。最后剩下的事是创建视图文件 application/views/news/view.php 并添加如下代码:

<?php
echo '<h2>'.$news_item['title'].'</h2>';
echo $news_item['text'];

创建新闻条目

为了向数据库中写入数据,需要先创建一个表单用来填写要存储的信息,这意味着 的表单里需要包含两项:一项代表标题,另一项代表内容。可以在模型中通过代码 从标题中提取出 slug。在文件 application/views/news/create.php 中创建一个新视图:

<h2><?php echo $title; ?></h2>
<?php echo validation_errors(); ?>
<?php echo form_open('news/create'); ?>
    <label for="title">Title</label>
    <input type="input" name="title" /><br />
    <label for="text">Text</label>
    <textarea name="text"></textarea><br />
    <input type="submit" name="submit" value="Create news item" />
</form>

这里有两个地方可能还不熟悉:form_open() 函数 以及 validation_errors() 函数。
第一个函数是由 表单辅助函数 提供的,用于生成 form 元素,并添加一些额外的功能,如添加一个隐藏的 CSRF 保护字段 , 第二个函数用于显示表单验证的错误信息。
回到的 News 控制器,将要在这里做两件事:检查表单是否被提交,以及提交的数据是否能通过验证规则。 可以使用 表单验证类 来做到这一点。

public function create()
    {
        $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->set_news();
            $this->load->view('news/success');
        }
    }

上面的代码添加了不少功能,前几行代码加载了 表单辅助函数 和 表单验证类。然后,设置了表单验证规则, set_rules() 方法有三个参数:表单中字段的名称,错误信息中使用的名称,以及验证规则。在这个例子中, 规则为 title 和 text 字段是必填的。

接下来,可以看到一个判断条件检查表单验证是否成功通过,如果没有通过,将显示出表单, 如果通过了验证,则会调用模型。然后,加载视图显示出成功信息。新建一个视图文件 application/views/news/success.php 并写上成功的信息:

<?php
echo "成功";

写一个方法将数据保存到数据库中,将会使用 输入类 获取用户提交的数据, 并使用 查询构造器类 向数据库中插入数据。打开之前创建的模型文件,添加以下代码:

public function set_news()
{
    $this->load->helper('url');
    $slug = url_title($this->input->post('title'), 'dash', TRUE);
    $data = array(
        'title' => $this->input->post('title'),
        'slug' => $slug,
        'text' => $this->input->post('text')
    );
    return $this->db->insert('news', $data);
}

新加的这个方法用于向数据库插入数据,第三行有一个新方法 url_title() , 这个方法由 URL 辅助函数 提供,用于将字符串 中的所有空格替换成连接符(-),并将所有字符转换为小写。 这样其实就生成了一个 slug ,可以很好的用于创建 URI 。
然后继续准备将要被插入到数据库中的记录,将其赋值给 $data 数组, 数组中的每一项都对应之前创建的数据库表中的一列,这里应该看到又出现了一个新方法, 来自 输入类 的 post() 方法,这个方法可以对数据进行过滤, 防止其他人的恶意攻击。输入类默认已经加载了。最后,将 $data 数组插入到的数据库中。

本博客所有内容采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可

转载文章请声明:CodeIgniter简单上手 : https://iiong.com/codeigniter-notes.html

分类: 编程技术

淮城一只猫

永远年轻,永远热泪盈眶

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*