目录 搜索
欢迎 目录 快速参考图 基本信息 服务器要求 许可协议 变更记录 关于CodeIgniter 安装 下载 CodeIgniter 安装指导 从老版本升级 疑难解答 介绍 开始 CodeIgniter 是什么? CodeIgniter 速记表 支持特性 应用程序流程图 模型-视图-控制器 架构目标 教程 内容提要 加载静态内容 创建新闻条目 读取新闻条目 结束语 常规主题 CodeIgniter URL 控制器 保留字 视图 模型 辅助函数 使用 CodeIgniter 类库 创建你自己的类库 使用 CodeIgniter 适配器 创建适配器 创建核心系统类 钩子 - 扩展框架的核心 自动装载资源 公共函数 URI 路由 错误处理 缓存 调试应用程序 以CLI方式运行 管理应用程序 处理多环境 PHP替代语法 安全 开发规范 类库参考 基准测试类 日历类 购物车类 配置类 Email 类 加密类 文件上传类 表单验证详解 FTP 类 图像处理类 输入类 Javascript 类 语言类 装载类 迁移类 输出类 分页类 模板解析器类 安全类 Session 类 HTML 表格类 引用通告类 排版类 单元测试类 URI 类 User-Agent 类 表单验证 XML-RPC 和 XML-RPC 服务器 Zip 编码类 缓存适配器 适配器参考 适配器 数据库类 Active Record 类 数据库缓存类 自定义函数调用 数据库配置 连接你的数据库 数据库快速入门例子代码 字段数据 数据库维护类 查询辅助函数 数据库类 查询 生成查询记录集 表数据 事务 数据库工具类 JavaScript类 辅助函数参考 数组辅助函数 CAPTCHA 辅助函数 Cookie Helper 日期辅助函数 目录辅助函数 下载辅助函数 Email 辅助函数 文件辅助函数 表单辅助函数 HTML辅助函数 Inflector 辅助函数 语言辅助函数 数字辅助函数 路径辅助函数 安全辅助函数 表情辅助函数 字符串辅助函数 文本辅助函数 排版辅助函数 URL 辅助函数 XML 辅助函数
文字

CodeIgniter 用户指南 版本 2.1.0

编辑文档、查看近期更改请 登录 或 注册  找回密码
查看原文

教程 − 读取新闻条目

在上一节中,我们通过如何写出一个包含静态页面的类来了解了一些这个框架的基本概念。我们也根据自定义路由规则重新梳理了URI。现在是时候向大家介绍动态内容和如何使用数据库了。

创建你的数据模型

数据库的运算并不是在控制类中进行的,而是在数据模型中,这样他们就可以在后面很容易地被反复使用。数据模型就是对你的数据库或其他数据存储方式进行取回、插入和更新的地方,它们的功能是展示你的数据(They represent your data)。

打开 application/models 文件夹新建一个文件 news_model.php ,代码如下。确保你已经按照 这里的说明配置了自己的数据库。

<?php
class News_model extends CI_Model {

  public function __construct()
  {
    $this->load->database();
  }
}

这段代码和早前写过的控制器的代码类似。它创建了一个继承 CI_Model 的数据模型,并用来载入数据库。通过 $this->db 对象就可以使用数据库类了。

在对数据库进行查询前,我们要先建一个数据表。连接你的数据库并执行下面的 SQL 命令,并在里面加些内容。

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)
);

现在数据库和数据模型都设置好了,我们需要一个方法来把我们的文章从数据库中读取出来。数据库抽象层已经包含在CodeIgniter的 Active Record模式 中了。这样可以确保只写一次查询就可以应用到 所有的数据库系统上。在你的数据库模型中添加如下代码。

public function get_news($slug = FALSE)
{
  if ($slug === FALSE)
  {
    $query = $this->db->get('news');
    return $query->result_array();
  }
  
  $query = $this->db->get_where('news', array('slug' => $slug));
  return $query->row_array();
}

通过上面的代码可以实现两个不同的查询,你可以得到所有的新闻纪录,也可以通过 slug得到某一篇新闻。你可能注意到了 $slug 变量在查询前并没有被检验过(sanitized),因为Active Record类已经把这个工作做完啦。

显示新闻

既然查询已经写完了,我们就要把这个数据模型和用来显示新闻内容的视图联系起来了。其实这个工作在我们之前写的pages控制类中就可以实现,但为了更清楚地向大家说明,我们来定义一个新的news控制类 application/controllers/news.php,代码如下。

<?php
class News extends CI_Controller {

  public function __construct()
  {
    parent::__construct();
    $this->load->model('news_model');
  }

  public function index()
  {
    $data['news'] = $this->news_model->get_news();
  }

  public function view($slug)
  {
    $data['news'] = $this->news_model->get_news($slug);
  }
}

看看上面的代码就会发现和我们之前写过的文件相似。首先,__construct方法是父级类 (CI_Controller) 的构造函数,并调用了数据模型,这样这个控制器中的其他方法就能使用那个数据模型了。

其次,这里有两个方法分别用来显示所有的新闻和某一条。在第二个方法中可以看到 $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 代码如下。

<?php foreach ($news as $news_item): ?>

    <h2><?php echo $news_item['title'] ?></h2>
    <div id="main">
        <?php echo $news_item['text'] ?>
    </div>
    <p><a href="news/<?php echo $news_item['slug'] ?>">View article</a></p>

<?php endforeach ?>

在这里,每条新闻都被循环出来展示给读者了。你可以看到我们的模板是用PHP和HTML混着写的,如果你更喜欢用模板语言的话,你可以用CodeIgniter的 模板解析器类 或者第三方模板解析器(模板引擎)。

新闻概述页面已经做好了,现在还缺少每一篇文章的页面。之前写好的数据模型现在就可以非常简单地用来实现这个功能啦。你只需要添加一些代码到控制器并且创建一个视图。把下面的代码添加到news控制器中。

public function view($slug)
{
  $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');
}

这里,$slug 变量作为参数传递给了 get_news() 方法,这样就可以返回特定的某一篇文章了。现在剩下的一件事就是创建视图 application/views/news/view.php了,代码如下。

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

设置路由

因为之前设置的通配符路由路由规则,现在你需要额外的路由来显示刚刚写的控制器。按照下面的代码修改你的路由文件 (application/config/routes.php) ,这样就确保了请求调用的是news控制器而不是之前设置的pages控制器。第一行代码表示的是控制器中通过slug读取的那条新闻。

$route['news/(:any)'] = 'news/view/$1';
$route['news'] = 'news';
$route['(:any)'] = 'pages/view/$1';
$route['default_controller'] = 'pages/view';

把浏览器的地址改回根目录,在后面加上 index.php/news 来看看你的新闻页面吧。

 

翻译贡献者: Hex, irini
最后修改: 2012-02-27 23:33:57
上一篇: 下一篇: