教程 - 创建新闻条目

现在你已经知道了怎样用CodeIgniter从数据库中读取数据,但还不知道怎样往数据库中写入数据。在这一节中,你将学到通过怎么扩展之前写过的新闻控制器和数据模型来实现这一功能。

创建一个表单

为了向数据库里输入数据,你需要创建一个表单来输入需要被存储的信息。这就是说你需要一个带两个输入域的表单,一个用来输入标题,一个用来输入内容。另外,你可以通过数据模型中的标题来取得slug。在 application/views/news/create.php 创建一个新的视图。

  1. <h2>Create a news item</h2>
  2. <?php echo validation_errors(); ?>
  3. <?php echo form_open('news/create') ?>
  4. <label for="title">Title</label>
  5. <input type="input" name="title" /><br />
  6. <label for="text">Text</label>
  7. <textarea name="text"></textarea><br />
  8. <input type="submit" name="submit" value="Create news item" />
  9. </form>
这里只有两个东西可能你不熟悉,一个是 _form_open()_ 函数,一个是 _validation_errors()_ 函数。 第一个由 [表单辅助函数]($6988c0114fd4a42b.md) 提供,用来提供表单元素和一些额外功能,例如添加隐藏的 [安全类]($edeeadd85c75566c.md)。第二个用来报告表单验证中出现的错误信息。 回到新闻控制器,在这里你需要做两件事,一件是检查表单是否被提交了,另一件是检查提交的数据是否能够通过验证规则。你需要用到 [表单验证]($5d722601a627d898.md) 库来做这些。
  1. public function create()
  2. {
  3. $this->load->helper('form');
  4. $this->load->library('form_validation');
  5.  
  6. $data['title'] = 'Create a news item';
  7.  
  8. $this->form_validation->set_rules('title', 'Title', 'required');
  9. $this->form_validation->set_rules('text', 'text', 'required');
  10.  
  11. if ($this->form_validation->run() === FALSE)
  12. {
  13. $this->load->view('templates/header', $data);
  14. $this->load->view('news/create');
  15. $this->load->view('templates/footer');
  16.  
  17. }
  18. else
  19. {
  20. $this->news_model->set_news();
  21. $this->load->view('news/success');
  22. }
  23. }

上面的代码中添加了一些功能,前几行载入了表单辅助函数和表单验证库,这样,表单验证的规则就被设定好了。 set_rules() 方法包含三个参数,第一个是输入域的名称,第二个是错误信息的名称,第三个是错误信息的规则——在这里的规则是输入内容的文本域必填。

正如上面所展示的,CodeIgniter拥有一个强大的表单验证库。你可以 从这里了解到这个库的更多内容

继续,你会看到一个用来检查表单验证是否运行成功的条件。如果没有成功,显示表单,如果提交成功并且通过了验证,则会调用数据模型。这之后会加载一个显示成功信息的视图。在这里 application/views/news/success.php 创建一个新的视图用来显示成功信息。

数据模型

现在只剩一件事要做了,那就是写一个方法用来向数据库中写入数据。你将用到Acitve Record类来插入信息,并用到输入类来获得post数据。打开之前创建的数据模型加入下面的代码:

  1. public function set_news()
  2. {
  3. $this->load->helper('url');
  4.  
  5. $slug = url_title($this->input->post('title'), 'dash', TRUE);
  6.  
  7. $data = array(
  8. 'title' => $this->input->post('title'),
  9. 'slug' => $slug,
  10. 'text' => $this->input->post('text')
  11. );
  12.  
  13. return $this->db->insert('news', $data);
  14. }

这个新的方法是用来维护向数据库插入新闻条目的。第三行包含了一个新的函数url_title()。这个函数是由 URL辅助函数 提供的,用来组织(strips down)你输入的字符串,将空格的地方替换成横线(-),确保其中全都是小写字母。这样之后剩下的就是一个漂亮的slug,可以很好地用来创建URI。

我们来继续准备一会儿要向$data数组输入的记录。这里的每个元素都对应着早前创建的数据表中的每一列。你可能注意到了这里有个新的方法叫 post() ,它是由 输入类提供的。这个方法可以确保数据是被过滤过(sanitized)的,从而保护你不被其他人恶意攻击。这个输入类是默认加载的。最后,就是将 $data 数组插入到我们的数据库。

设置路由

在你向你的CI程序添加新闻条目之前,你还要向 config/routes.php 里添加一个额外的规则。确保你的文件包含下列代码。这样可以保证CodeIginter将“create”看做一个方法来正确显示,而不是把它显示成一个slug为“create”的新闻页面。

  1. $route['news/create'] = 'news/create';
  2. $route['news/(:any)'] = 'news/view/$1';
  3. $route['news'] = 'news';
  4. $route['(:any)'] = 'pages/view/$1';
  5. $route['default_controller'] = 'pages/view';

现在在你的浏览器输入你本地CI程序的地址并在后面加上 index.php/news/create 。恭喜你,你刚刚完成了你的第一个CI程序!添加些新闻来看看其他你创造的页面吧!

翻译贡献者:cinewer, csfhc, Hex, irini