读取新闻条目
打开 application/models/ 目录,新建一个文件 News_model.php ,然后写入下面的代码。 确保你的数据库配置正确。(数据库配置不再详细讲解,使用phpmyadmin)
<?php
class News_model extends CI_Model {
public function __construct()
{
$this->load->database();
}
}
这段代码和之前的控制器的代码有点类似,它继承 了CI_Model 创建了一个新模型, 并加载了数据库类。数据库类可以通过 $this->db 对象访问。
模型中连接数据库必须写
$this->load->database();
这一句,并写在
__construct()
函数中,这个函数是加载各种类库所需要的,在控制器中也需要。
建立好数据库后,使用 CodeIgniter 的数据库抽象层查询构造器, 通过它你可以编写你的查询代码,并在所有支持的数据库平台上运行。 向你的模型中添加如下代码。
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();
}
上面这段代码中,if语句判断$slug是否为真,如果$slug是假的,那么获取所有新闻条目,返回的
return $query->result_array();
内容容可以理解为一个二维数组,将数据库中的数据以表格形式呈现。
$query = $this->db->get('news');
数据库的查询语句。
如果$slug是真的,那么用
$query = $this->db->get_where('news', array('slug' => $slug));
获取一条内容,并用
return $query->row_array();
返回一条数据,可以理解为一个一维数组,数组的下标为变量名。
通过这个代码,你可以执行两种不同的查询,一种是获取所有的新闻条目,另一种 是根据它的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() 方法,
parent::__construct();
调用父类(CI_Controller)中的构造函数,
$this->load->model('news_model');
$this->load->helper('url_helper');
加载模型和URL辅助函数。只有这样,才能建立这个模型和这个控制器的关系。因为虽然他们在同一个文件目录下,属于同一个项目,但如果项目比较庞大,需要多个控制器和模型,就会分辨不清哪个控制器和哪个模型连接。
其次,有两个方法用来显示新闻条目,一个显示所有的(index()),另一个显示特定的(view($slug))。 你可以看到第二个方法中调用模型方法时传入了 $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['news'] = $this->news_model->get_news();
$data['title'] = 'News archive';
从模型中获取所有的新闻条目,并赋值给一个变量,另外页面的标题赋值给了 $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/'.$news_item['slug']); ?>">View article</a></p>
<?php endforeach; ?>
这里,通过一个循环将所有的新闻条目显示给用户,foreach的用法不详细讲了。
通过观察我们可以发现,控制器传给视图的数组大致是
这样的,传递到视图中,直接使用$data数组的下标就可以了。
新闻的列表页就做好了,但是还缺了显示特定新闻条目的页面,之前创建的模型可以很容易的 实现该功能,你只需要向控制器中添加一些代码,然后再新建一个视图就可以了。
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'];
最后的显示