新闻栏目 | News section
新闻部分
在最后一节中,我们通过编写一个包含静态页面的类来研究框架的一些基本概念。我们通过添加自定义路由规则来清除URI。现在是引入动态内容并开始使用数据库的时候了。
设置你的模型
与其在控制器中直接写入数据库操作,不如将查询放在模型中,以便以后可以轻松地重用它们。模型是在数据库或其他数据存储中检索、插入和更新信息的地方。它们代表你的数据。
打开application / models /
目录并创建一个名为News_model.php
的新文件并添加以下代码。确保您已按照此处所述正确配置数据库。
<?php
class News_model extends CI_Model {
public function __construct()
{
$this->load->database(
}
}
此代码与前面使用的控制器代码类似。它通过扩展CI_Model并加载数据库库。这将使数据库类通过$this->db对象。
在查询数据库之前,必须创建一个数据库模式。连接到您的数据库并运行下面的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)
现在已经建立了数据库和模型,您需要一种方法从我们的数据库中获取我们的所有帖子。为此,将使用CodeIgniter随附的数据库抽象层 - Query Builder。这使得可以编写一次'查询'并使它们在所有支持的数据库系统上工作。将以下代码添加到您的模型中。
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(
}
有了这个代码,你可以执行两个不同的查询。你可以得到所有的新闻记录,或通过它的slu get获得一个新闻项目。您可能已经注意到该$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 Helper函数,因为我们稍后会在视图中使用它们中的一个。
接下来,有两种方法可以查看所有新闻项目,另一种方法用于查看特定新闻项目。你可以看到$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']
元素和所有数据传递给视图。现在您需要创建一个视图来呈现新闻项目。创造应用程序/视图/新闻/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; ?>
在这里,每个新闻项目被循环起来并显示给用户。您可以看到,我们用PHP编写了模板,并将其与HTML混合使用。如果您喜欢使用模板语言,可以使用CodeIgniter的模板分析器类或第三方解析器。
新闻概述页面现在已经完成,但是仍然没有显示单个新闻项目的页面。先前创建的模型是以这样的方式创建的,因此它可以很容易地用于此功能。您只需要向控制器添加一些代码并创建一个新视图。回到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/view/news/view.php
将以下代码放入此文件中。
<?php
echo '<h2>'.$news_item['title'].'</h2>';
echo $news_item['text'];
选路
由于之前创建的通配符路由规则,您需要额外的路由来查看您刚刚创建的控制器。修改你的路由文件(application / config / routes.php
),使其如下所示。这确保请求到达News
控制器而不是直接进入Pages
控制器。第一行将URI与控制器中的view()
方法连接起来News
。
$route['news/(:any)'] = 'news/view/$1';
$route['news'] = 'news';
$route['(:any)'] = 'pages/view/$1';
$route['default_controller'] = 'pages/view';
将浏览器指向文档根目录,然后是index.php/news,然后查看新闻页面。