在线文档教程

新闻栏目 | 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,然后查看新闻页面。