news_section.html 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="utf-8" lang="utf-8">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=0" />
  6. <title>读取新闻条目 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档</title>
  7. <link rel="shortcut icon" href="http://codeigniter.org.cn/user_guide/../images/design/favicon.ico" type="image/x-icon" />
  8. <link rel="stylesheet" type="text/css" media="all" href="../userguide.css" />
  9. <link rel="search" href="http://codeigniter.org.cn/user_guide/../CodeIgniterSearch.xml" type="application/opensearchdescription+xml" title="CodeIgniter 搜索"/>
  10. <link rel="canonical" href="http://codeigniter.org.cn/user_guide/tutorial/news_section.html" />
  11. <script type="text/javascript" src="../nav/mootools.js-ver=20130324.js"></script>
  12. <script type="text/javascript" src="../nav/mootools-more.js-ver=20130324.js"></script>
  13. <script type="text/javascript" src="../nav/nav.js-ver=20130324.js"></script>
  14. <script type="text/javascript" src="../nav/user_guide_menu.js-ver=20130324.js"></script>
  15. <meta name="robots" content="all" />
  16. <meta name="author" content="ExpressionEngine Dev Team" />
  17. <meta name="description" content="CodeIgniter 中文手册, CodeIgniter 用户指南, CodeIgniter User Guide, Wiki 文档" />
  18. </head>
  19. <body>
  20. <!-- START NAVIGATION -->
  21. <div id="nav">
  22. <div id="nav_inner">
  23. <script type="text/javascript">create_menu('../');</script>
  24. </div>
  25. </div>
  26. <script type="text/javascript">_setNavigation();</script>
  27. <div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="切换目录" alt="切换目录" /></a></div>
  28. <div id="masthead" class="clearfix">
  29. <div class="topbar-hd"><h1>CodeIgniter 用户指南 版本 2.2.0</h1></div>
  30. <div class="topbar-tip">编辑文档、查看近期更改请 <a href="#">登录</a> 或 <a href="#">注册</a>  <a href="#">找回密码</a></div> <div id="breadcrumb_right"><a href="../toc.html">目录页</a></div>
  31. </div>
  32. <!-- END NAVIGATION -->
  33. <!-- START BREADCRUMB -->
  34. <table cellpadding="0" cellspacing="0" border="0" style="width:100%">
  35. <tr>
  36. <td id="breadcrumb">
  37. <a href="#" target="_blank">CodeIgniter 中国首页</a>&nbsp;&#8250;&nbsp;
  38. <a href="../index.html">用户指南首页</a>&nbsp;&#8250;&nbsp;<a href="index.html">教程</a>&nbsp;&#8250;&nbsp;读取新闻条目 </td>
  39. <td id="searchbox">
  40. <form method="get" action="http://www.google.com.hk/search" target="google_window">
  41. <input type="hidden" name="client" value="pub-0176846097796333"></input>
  42. <input type="hidden" name="forid" value="1"></input>
  43. <input type="hidden" name="ie" value="UTF-8"></input>
  44. <input type="hidden" name="oe" value="UTF-8"></input>
  45. <input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.org.cn/user_guide/" />
  46. 搜索用户指南&nbsp;
  47. <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />
  48. &nbsp;
  49. <input type="submit" class="submit" name="sa" value="Go" />
  50. </form>
  51. </td>
  52. </tr>
  53. </table>
  54. <!-- END BREADCRUMB -->
  55. <div style="clear:both;text-align:right;padding: 6px 40px 0 0;">
  56. <a href="#" target="_blank">查看原文</a>
  57. </div>
  58. <!--<br clear="all" />--><!-- START CONTENT -->
  59. <div id="content">
  60. <h1>教程 &minus; 读取新闻条目</h1>
  61. <p>在上一节中,我们通过如何写出一个包含静态页面的类来了解了一些这个框架的基本概念。我们也根据自定义路由规则重新梳理了URI。现在是时候向大家介绍动态内容和如何使用数据库了。</p>
  62. <h2>创建你的数据模型</h2>
  63. <p>数据库的运算并不是在控制类中进行的,而是在数据模型中,这样他们就可以在后面很容易地被反复使用。数据模型就是对你的数据库或其他数据存储方式进行取回、插入和更新的地方,它们的功能是展示你的数据(They represent your data)。</p>
  64. <p>打开 <dfn>application/models</dfn> 文件夹新建一个文件 <dfn>news_model.php</dfn> ,代码如下。确保你已经按照 <a href="../database/configuration.html">这里</a>的说明配置了自己的数据库并且数据库服务器与PHP.ini有相应配置。</p>
  65. <pre>
  66. &lt;?php
  67. class News_model extends CI_Model &#123;
  68. public function __construct()
  69. &#123;
  70. $this-&gt;load-&gt;database();
  71. &#125;
  72. &#125;
  73. </pre>
  74. <p>这段代码和早前写过的控制器的代码类似。它创建了一个继承 CI_Model 的数据模型,并用来载入数据库。通过 <var>$this-&gt;db</var> 对象就可以使用数据库类了。</p>
  75. <p>在对数据库进行查询前,我们要先建一个数据表。连接你的数据库并执行下面的 SQL 命令,并在里面加些内容。</p>
  76. <pre>
  77. CREATE TABLE news (
  78. id int(11) NOT NULL AUTO_INCREMENT,
  79. title varchar(128) NOT NULL,
  80. slug varchar(128) NOT NULL,
  81. text text NOT NULL,
  82. PRIMARY KEY (id),
  83. KEY slug (slug)
  84. );
  85. </pre>
  86. <p>现在数据库和数据模型都设置好了,我们需要一个方法来把我们的文章从数据库中读取出来。数据库抽象层已经包含在CodeIgniter的 <a href="../database/active_record.html">Active Record模式</a> 中了。这样可以确保只写一次查询就可以应用到 <a href="../general/requirements.html">所有的数据库系统</a>上。在你的数据库模型中添加如下代码。</p>
  87. <pre>
  88. public function get_news($slug = FALSE)&#123;
  89. if ($slug === FALSE)
  90. &#123;
  91. $query = $this-&gt;db-&gt;get('news');
  92. return $query-&gt;result_array();
  93. &#125;
  94. $query = $this-&gt;db-&gt;get_where('news', array('slug' => $slug));
  95. return $query-&gt;row_array();
  96. &#125;
  97. </pre>
  98. <p>通过上面的代码可以实现两个不同的查询,你可以得到所有的新闻纪录,也可以通过 <a href="#" title="a URL friendly version of a string">slug</a>得到某一篇新闻。你可能注意到了 <var>$slug</var> 变量在查询前并没有被检验过(sanitized),因为Active Record类已经把这个工作做完啦。</p>
  99. <h2>显示新闻</h2>
  100. <p>既然查询已经写完了,我们就要把这个数据模型和用来显示新闻内容的视图联系起来了。其实这个工作在我们之前写的pages控制类中就可以实现,但为了更清楚地向大家说明,我们来定义一个新的news控制类 <dfn>application/controllers/news.php</dfn>,代码如下。</p>
  101. <pre>
  102. &lt;?php
  103. class News extends CI_Controller &#123;
  104. public function __construct()
  105. &#123;
  106. parent::__construct();
  107. $this-&gt;load-&gt;model('news_model');
  108. &#125;
  109. public function index()
  110. &#123;
  111. $data['news'] = $this-&gt;news_model-&gt;get_news();
  112. &#125;
  113. public function view($slug)
  114. &#123;
  115. $data['news_item'] = $this-&gt;news_model-&gt;get_news($slug);
  116. &#125;
  117. &#125;
  118. </pre>
  119. <p>看看上面的代码就会发现和我们之前写过的文件相似。首先,__construct方法是父级类 (<dfn>CI_Controller</dfn>) 的构造函数,并调用了数据模型,这样这个控制器中的其他方法就能使用那个数据模型了。</p>
  120. <p>其次,这里有两个方法分别用来显示所有的新闻和某一条。在第二个方法中可以看到 <var>$slug</var> 变量被传递给了数据模型中的方法。数据模型就是用这个slug来确定需要返回哪一篇文章的。</p>
  121. <p>现在通过数据模型,数据已经被控制器获得了,但还无法显示出来。下面我们就要把数据传递给视图了。</p>
  122. <pre>
  123. public function index()&#123;
  124. $data['news'] = $this-&gt;news_model-&gt;get_news();
  125. $data['title'] = 'News archive';
  126. $this-&gt;load-&gt;view('templates/header', $data);
  127. $this-&gt;load-&gt;view('news/index', $data);
  128. $this-&gt;load-&gt;view('templates/footer');
  129. &#125;
  130. </pre>
  131. <p>上面的代码从数据模型中获得了所有新闻的记录,并把它们赋值给了一个变量。页面的标题也赋给了 <var>$data['title']</var> ,这些所有的数据都会传递给视图。现在你需要创建一个视图来显示这些新闻。新建 <dfn>application/views/news/index.php</dfn> 代码如下。</p>
  132. <pre>
  133. &lt;?php foreach ($news as $news_item): ?&gt;
  134. &lt;h2&gt;&lt;?php echo $news_item['title'] ?&gt;&lt;/h2&gt;
  135. &lt;div class="main"&gt;
  136. &lt;?php echo $news_item['text'] ?&gt;
  137. &lt;/div&gt;
  138. &lt;p&gt;&lt;a href="http://[你的域名]/index.php/news/&lt;?php echo $news_item['slug'] ?&gt;"&gt;View article&lt;/a&gt;&lt;/p&gt;
  139. &lt;?php endforeach ?&gt;
  140. </pre>
  141. <p>在这里,每条新闻都被循环出来展示给读者了。你可以看到我们的模板是用PHP和HTML混着写的,如果你更喜欢用模板语言的话,你可以用CodeIgniter的 <a href="../libraries/parser.html">模板解析器类</a> 或者第三方模板解析器(模板引擎)。</p>
  142. <p>新闻概述页面已经做好了,现在还缺少每一篇文章的页面。之前写好的数据模型现在就可以非常简单地用来实现这个功能啦。你只需要添加一些代码到控制器并且创建一个视图。把下面的代码添加到news控制器中。</p>
  143. <pre>
  144. public function view($slug)&#123;
  145. $data['news_item'] = $this-&gt;news_model-&gt;get_news($slug);
  146. if (empty($data['news_item']))
  147. &#123;
  148. show_404();
  149. &#125;
  150. $data['title'] = $data['news_item']['title'];
  151. $this-&gt;load-&gt;view('templates/header', $data);
  152. $this-&gt;load-&gt;view('news/view', $data);
  153. $this-&gt;load-&gt;view('templates/footer');
  154. &#125;
  155. </pre>
  156. <p>这里,<var>$slug</var> 变量作为参数传递给了 <var>get_news()</var> 方法,这样就可以返回特定的某一篇文章了。现在剩下的一件事就是创建视图 <dfn>application/views/news/view.php</dfn>了,代码如下。</p>
  157. <pre>
  158. &lt;?php
  159. echo '&lt;h2&gt;'.$news_item['title'].'&lt;/h2&gt;';
  160. echo $news_item['text'];
  161. </pre>
  162. <h2>设置路由</h2>
  163. <p>因为之前设置了通配符路由规则,现在你需要额外的路由来显示刚刚写的控制器。按照下面的代码修改你的路由文件 &#40;<dfn>application/config/routes.php</dfn>&#41; ,这样就确保了请求调用的是news控制器而不是之前设置的pages控制器。第一行代码表示的是控制器中通过slug读取的那条新闻。</p>
  164. <pre>
  165. $route['news/(:any)'] = 'news/view/$1';
  166. $route['news'] = 'news';
  167. $route['(:any)'] = 'pages/view/$1';
  168. $route['default_controller'] = 'pages/view';
  169. </pre>
  170. <p>把浏览器的地址改回根目录,在后面加上 <dfn>index.php/news</dfn> 来看看你的新闻页面吧。</p><p>&nbsp;</p>
  171. <div id="Contributors">
  172. 翻译贡献者:
  173. 250351515, csfhc, Hex, irini, kphcdr, odissey, scncpb, 就是欠揍</div>
  174. <div id="DocDate">
  175. 最后修改: 2014-06-10 14:10:10</div>
  176. </div>
  177. <!-- END CONTENT -->
  178. <div id="footer">
  179. <p>
  180. 上一个主题:&nbsp;&nbsp;<a href="static_pages.html">加载静态内容</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;<a href="#top">页首</a>
  181. &nbsp;&middot;&nbsp;&nbsp;<a href="../index.html">用户指南首页</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;下一个主题:&nbsp;&nbsp;<a href="create_news_items.html">创建新闻条目</a> </p>
  182. <p><a href="#">CodeIgniter</a> &nbsp;&middot;&nbsp; 版权所有 &#169; 2006-2013 &nbsp;&middot;&nbsp; <a href="#">Ellislab, Inc.</a></p>
  183. <p>中文化: <a href="#">CodeIgniter 中国</a> &nbsp;&middot;&nbsp; 制作: Hex &nbsp;&middot;&nbsp; 版本: 1.30 &nbsp;&middot;&nbsp; 鸣谢: 子非鱼</p>
  184. </div>
  185. </body>
  186. </html>