ci手册教程2

读取新闻条目

打开 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的用法不详细讲了。

通过观察我们可以发现,控制器传给视图的数组大致是

ci手册教程2这样的,传递到视图中,直接使用$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'];

ci手册教程2

最后的显示