<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>guangzhou</title>
    <description></description>
    <link>http://guangzhou.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>PHP 框架: CodeIgniter 分页教程</title>
        <author>guangzhou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://guangzhou.javaeye.com">guangzhou</a>&nbsp;
          链接：<a href="http://guangzhou.javaeye.com/blog/145567" style="color:red;">http://guangzhou.javaeye.com/blog/145567</a>&nbsp;
          发表时间: 2007年12月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          有些时候，你可能需要把数据库查询所得到的一篇文章或一组结果拆分成多页。在这时，你将需要写某种分页脚本。这对于从没有做过这个的开发者来说还是有一点难度的，但使用 <a href="http://codeigniter.org.cn/" target="_blank">CodeIgniter</a> 却是轻而易举就能完成的。<br />        CodeIgniter 具有非常容易使用的<a href="http://codeigniter.org.cn/user_guide/libraries/pagination.html" target="_blank">分页类</a>。在本教程中我会做一个从数据库返回一组结果并分页这些结果的简单例子。我将使用最新版本的 CI，写这篇文章时的版本是 1.5.1 。分页类并没有修改(至少我认为没有)，用最新的稳定版框架总是好的。现在，让我们开始吧。<br /><br />        <strong>配置和数据库设置</strong><br /><br />        很好，一切正常，当我们开始写一个 CI 应用程序时，我们要设置很多东西。我们首先打开 <strong>config.php</strong> 文件(可在 <strong>/system/application/config/</strong> 中找到)。在这里我们将输入站点根 URL。这是我的设置：<pre name="code" class="java">$config['base_url'] = "http://localhost/~yannick/pagination/";</pre>你的设置可能会和我的略有不同。<br /><br />        这个应用程序将使用一个数据库，所以我们下一步的工作是创建数据库，然后再以 CI 访问我们的数据库。要做到这一点请打开 <strong>database.php</strong>，这也定位在你的 <strong>config 文件夹</strong>中，并填写必要的信息，以便连接到你的数据库。您可以下载“例子代码”：如果你愿意可以使用例子代码和我的例子数据库。这将创建一个名为“<strong>christian_books</strong>”的表，并插入一些测试数据。同时，我想你现在可以猜一猜分页后是什么样？如果你猜对了一些“Christian Books”，你将是正确的。<br /><br />        <strong>控制器</strong><br /><br />        我们的基本配置文件和数据库设置已经完成，现在我们需要创建一个控制器。我将它命名为“<strong>books.php</strong>”，并且它将包含下列代码：<pre name="code" class="java">class Books extends Controller {
  function __construct() {
    parent::Controller();
    $this->load->helper('url');
    $this->load->database();
  }

  function index() {
    // load pagination class
    $this->load->library('pagination');
    $config['base_url'] = base_url().'index.php/books/index/';
    $config['total_rows'] = $this->db->count_all('christian_books');
    $config['per_page'] = '5';
    $config['full_tag_open'] = '&lt;p>';
    $config['full_tag_close'] = '&lt;/p>';

    $this->pagination->initialize($config);
                
    //load the model and get results
    $this->load->model('books_model');
    $data['results'] = $this->books_model->get_books($config['per_page'],$this->uri->segment(3));
                
    // load the HTML Table Class
    $this->load->library('table');
    $this->table->set_heading('ID', 'Title', 'Author', 'Description');
                
    // load the view
    $this->load->view('books_view', $data);
  }
}</pre>如果你读过我最近写的<a href="http://godbit.com/article/introduction-to-code-igniter" target="_blank">介绍 CI</a>的系列文章，那么，你将在这里看到许多很熟悉的内容。如果你没读过并且是新手，要想感受 CI 这种自由的话，要阅读上面的这篇文章，然后再回来继续看下面的内容。如果你已经加快了学习速度，那么，让我们继续看看上述代码更详细的描述。<br />        首先，我们在构造函数中装载 <a href="http://codeigniter.org.cn/user_guide/helpers/url_helper.html" target="_blank">URL 辅助函数</a>和数据库。当然，你不一定要创建一个构造函数并装载这些辅助函数，因为它可以很容易的在控制器中的其它函数/方法中装载，但是，如果辅助函数将用于控制器中的大多数/所有方法的话，我通常倾向于创建一个构造函数并把它们放在里面。<br />        其次，我们创建了一个名为 index() 的方法。这是一个非常基本的应用程序，正因如此，我们将只需要这种单一的方法，使我们装载分页类，模型和 HTML 表格类(我们稍后将讨论的内容) 。<br />        让我们开始吧！你会看到非常简单的使用分页类的方法。首先，我们配置要分页页面的 URL：<pre name="code" class="java">$config['base_url'] = base_url().'index.php/books/index/';</pre>这个 base_url() 函数不要与 $config[] 数组中的 base_url 相混淆。该 base_url() 函数来自 URL 辅助函数并且它代表整个应用程序的 URL。在上述代码中，连接到 base_url() 后面的内容是要分页页面的地址。<br />        然后，我们设置数据库中的总行数：<pre name="code" class="java">$config['total_rows'] = $this->db->count_all('christian_books');</pre>这个函数返回数据库中的所有行，如果你运行一个特定查询将返回某些行，并不一定是所有的行，然后，你可能会使用在<a href="http://codeigniter.org.cn/user_guide/database/results.html" target="_blank">记录辅助函数</a>中的 $query->num_row() 函数。<br />        $config['per_page'] 变量简单地告诉分页类每页显示多少条记录。$config['full_tag_open'] 和 $config['full_tag_close'] 变量说明使用什么标签包围分页链接。<br />        接下来，我们装载模型，我们将执行其中的一个方法：get_books()。它有两个参数，limit，这决定了每页显示多少项目，offset，它表示从哪行开始返回记录。你会发现，第一个参数(limit)从 $config['per_page'] 变量中取值，而第二个参数则通过 URL 辅助函数，从 URL 的第三段中取值：$this->uri->segment(3)。后者是这里非常有趣的原因。CI 的 URL 通常采取以下形式，<strong>www.your-site.com/index.php/class/function/ID</strong>，所以大家可以看到第三段(index.php 的后面)代表 ID。所以允许采用如下的 URL：<br /><br />        http://localhost/~yannick/pagination/index.php/books/index/10<br /><br />        URL 第三段的 10 将被插入到我们模型函数的第二个参数中：get_books(5, 10)，它表示偏移量(offset)。因此，我们的结果将返回数据库中前 10 条记录的后 5 条记录(因为根据前面的代码，我们每页显示 5 条记录)。非常妙，对不对？好了，我们先在停在这里休息一下，更详细的内容将在下一节中。<br />        现在，这里有一些新东西。在这里，我们装载 <a href="http://codeigniter.org.cn/user_guide/libraries/table.html" target="_blank">HTML 表格类</a>，这是新添加到 CI 1.5.0 版本中的。这个类允许你从数组或数据库结果中生成 HTML 表格。你可以进行相当多的定制，但在这个例子中，我使用他基本形式中的一种：我明确的指明表格的头部应该是什么。<pre name="code" class="java">$this->table->set_heading('ID', 'Title', 'Author', 'Description');</pre>如果我没有指明这一点，HTML 表格类将使用它们在数据库表中的名字作为表名。因此，举例来说，如果你的数据库表中有一个列名为“<strong>book_id</strong>”，则表格类将使用“<strong>book_id</strong>”。如果你不想它这样显示的话，则上述代码片断允许你指定一个更可读的字段名。<br />        最后，我们装载“视图”，并传递给它我们将用到的任何数据。都做好后，我们的控制器就完成了。现在，让我们来看看我们的模型，看看怎样在分页中发挥它的威力。<br /><br />        <strong>模型</strong><br /><br />        OK，这时候模型就开始重新调用你数据库里的信息了。在这个分页教程中，我们的模型将包含一个方法，它基于页面上的用户请求，从数据库中获取正确的结果。正如你所看到的，控制器方法有两个参数，一个 limit 和另一个 offset。然后，我们创建一个文件，命名为“<strong>books_model.php</strong>”，并在文件中输入下列代码：<pre name="code" class="java">class books_model extends Model {
  function __construct(){
    parent::Model();
  }

  function get_books($num, $offset) {
    $query = $this->db->get('christian_books', $num, $offset);        
    return $query;
  }
}</pre>大家可以看到，我们的模型‘<strong>books_model</strong>‘和方法 get_books()，本教程中包含了一个填充了图书记录的数据库，我们希望取得这些图书并显示在屏幕上。你会注意到我们调用 get_books() 的两个参数，分别是 $num 和 $offset。 $num 指明从数据库中取得的记录数，$offset 指明将从哪开始获取记录。<pre name="code" class="java">$query = $this->db->get('christian_books', $num, $offset);</pre>上面的代码将产生下面的 MySQL 查询(举例)：<pre name="code" class="java">SELECT * FROM christian_books LIMIT 10, 5</pre>5 代表 $num，10 代表 $offset。以上就是传给模型的所有内容了。我们存储这些结果在一个名为 $query 的变量中，然后把变量返回给调用它的方法。把这些结合起来，我们的模型就写完了。<br />        我们已经完成了 2/3 了，最后事情是，我们要创建视图。<br /><br />        <strong>视图</strong><br /><br />        记住，一个视图就是一个简单的 Web 页面或页面片段。所以，在这里我们的视图是一个在表格里显示图书的 Web 页面。让我们来看看代码：<pre name="code" class="java">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us" lang="en-us">
&lt;head>
&lt;meta http-equiv="content-type" c />
&lt;link rel="stylesheet" href='&lt;?php echo base_url(); ?>css/main.css' type="text/css" media="screen, projection" />
&lt;title>CodeIgniter Pagination Tutorial&lt;/title>
&lt;/head>
&lt;body>
&lt;h1>Christian Books&lt;/h1>
&lt;?php echo $this->table->generate($results); ?>
&lt;?php echo $this->pagination->create_links(); ?>
&lt;/body>
&lt;/html></pre>你可能会想，“这当然不能这么简单。”是的，这只是为本教程创建的视图。<pre name="code" class="java">$this->table->generate($results);</pre>首先，把从模型中得到的结果传递到 generate() 方法中，这样，我们将创建显示图书表格的 HTML 代码。<pre name="code" class="java">$this->pagination->create_links();</pre>接下来，我们分页类中的 create_links() 方法是最有用的，它创建各页页码的链接，包括“下一页”和“上一页”的链接。它看起来类似这样：<br /><br />        « First  &lt; 1 2 <strong>3</strong> 4 5 >  Last »<br /><br />        现在访问你的页面，并在显示页码的地方开心的玩一玩。你也可以从一页切换到另一页，看看 URL 是怎样变化的，并且 URL 的第三段表示显示在表格中结果的偏移量。<br /><br />        <strong>总结</strong><br /><br />        好了，上面我简单介绍了分页类，正如你看到的，添加分页功能到你的 CI 应用程序并不难。我也介绍了在 1.5.0 版本中新添加的 HTML 表格类，并且它也不是很难。这个类库使我们可以快速的创建 HTML 表格，以显示我们的结果。<br />        就这样了，我希望你在享受本教程的同时，会发现它内容翔实并对你有帮助。如果你有兴趣学习如何在没有 CI 框架帮助的情况下，在 PHP 中做分页程序，那么，我建议你看看 Jonathan Sampson 制作的<a href="http://www.sampsonresume.com/2007/02/01/screencast-php-pagination/" target="_blank">分页视频</a>. <br />        世界和平，上帝保佑。<br /><br />下载例子代码: <a href="http://godbit.com/files/ci_pagination_tut.zip" target="_blank">ci_pagination_tut.zip</a><br /><br />原文：<a href="http://godbit.com/article/pagination-with-code-igniter" target="_blank">http://godbit.com/article/pagination-with-code-igniter</a><br />翻译：<a href="http://codeigniter.org.cn/" target="_blank">CodeIgniter 中国</a><br />鸣谢：<a href="http://codeigniter.org.cn/forums/" target="_blank">CodeIgniter 中国开发者社区</a>的朋友们！
          <br/>
          <span style="color:red;">
            <a href="http://guangzhou.javaeye.com/blog/145567#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 03 Dec 2007 12:18:12 +0800</pubDate>
        <link>http://guangzhou.javaeye.com/blog/145567</link>
        <guid>http://guangzhou.javaeye.com/blog/145567</guid>
      </item>
      <item>
        <title>20 分钟创建小型博客系统的 MVC PHP 框架 - CodeIgniter</title>
        <author>guangzhou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://guangzhou.javaeye.com">guangzhou</a>&nbsp;
          链接：<a href="http://guangzhou.javaeye.com/blog/140316" style="color:red;">http://guangzhou.javaeye.com/blog/140316</a>&nbsp;
          发表时间: 2007年11月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          CodeIgniter 是一套给 PHP 网站<span href="http://phpchina.com/bbs/tag.php?name=%BF%AA%B7%A2" class="t_tag" onclick="tagshow(event)">开发</span>者使用的应用程序<span href="http://phpchina.com/bbs/tag.php?name=%BF%AA%B7%A2" class="t_tag" onclick="tagshow(event)">开发</span>框架和工具包。她提供一套丰富的标准库以及简单的接口和逻辑结构，其目的是使<span href="http://phpchina.com/bbs/tag.php?name=%BF%AA%B7%A2" class="t_tag" onclick="tagshow(event)">开发</span>人员更快速地进行项目<span href="http://phpchina.com/bbs/tag.php?name=%BF%AA%B7%A2" class="t_tag" onclick="tagshow(event)">开发</span>。使用 CodeIgniter 可以减少<span href="http://phpchina.com/bbs/tag.php?name=%B4%FA%C2%EB" class="t_tag" onclick="tagshow(event)">代码</span>的编写量，并将你的精力投入到项目的创造性<span href="http://phpchina.com/bbs/tag.php?name=%BF%AA%B7%A2" class="t_tag" onclick="tagshow(event)">开发</span>上。<br />
她是一个小巧但功能强大的 PHP 框架，作为一个简单而&ldquo;优雅&rdquo;的工具包，她可以为 PHP 程序员建立功能完善的 Web 应用程序。如果你是一个与人共享主机并且为客户要求的期限而烦恼的开发人员，如果你已经厌倦了那些傻大笨粗的框架，那么 CodeIgniter 就是你所需要的，如果...<br />
&nbsp;&nbsp;<br />
1. 你想要一个小巧的框架。<br />
2. 你需要出色的性能。<br />
3. 你需要广泛兼容标准主机上的各种 PHP 版本和配置(例如 PHP4)。<br />
4. 你想要一个几乎只需 0 配置的框架。<br />
5. 你想要一个不需使用命令行的框架。<br />
6. 你想要一个不需坚守限制性编码规则的框架。<br />
7. 你对 PEAR 这种大规模集成类库不感兴趣。<br />
8. 你不希望被迫学习一门模板语言(虽然可以选择你要求的模板解析器)。<br />
9. 你不喜欢复杂，热爱简单。<br />
10. 你需要清晰、完整的文档。<br />
&nbsp;&nbsp;<br />
中国<span href="http://phpchina.com/bbs/tag.php?name=%B9%D9%B7%BD" class="t_tag" onclick="tagshow(event)">官方</span>网站: <a href="http://codeigniter.org.cn/" target="_blank">http://codeigniter.org.cn</a> <br />
中国开发者社区: <a href="http://codeigniter.org.cn/forums" target="_blank">http://codeigniter.org.cn/forums</a><br />
Wiki 用户手册: <a href="http://codeigniter.org.cn/user_guide" target="_blank">http://codeigniter.org.cn/user_guide</a>
          <br/>
          <span style="color:red;">
            <a href="http://guangzhou.javaeye.com/blog/140316#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 13 Nov 2007 18:12:24 +0800</pubDate>
        <link>http://guangzhou.javaeye.com/blog/140316</link>
        <guid>http://guangzhou.javaeye.com/blog/140316</guid>
      </item>
  </channel>
</rss>