【问题标题】:CodeIgniter pagination won't go past first pageCodeIgniter 分页不会超过第一页
【发布时间】:2015-02-05 01:38:59
【问题描述】:

我有一个博客页面,我尝试使用 CodeIgniter 对其进行分页。编号和限制似乎工作正常,除了当我尝试前往另一个页面时不断收到 404。

奇怪的是导致这个问题的正常罪魁祸首是正确的。 baseUrl 和 uri_segment。

我的控制器如下所示:

$config                = array();
$config["base_url"]    = $this->config->site_url("/blog");
$config["total_rows"]  = $this->blog_model->count();
$config["per_page"]    = 2;
$config["uri_segment"] = 2;
$config["num_links"] = round($config["total_rows"] / $config["per_page"]);

$config['use_page_numbers'] = TRUE;

$this->pagination->initialize($config);
$page = ($this->uri->segment(2)) ? $this->uri->segment(2) : 0;

$this->load->view('blog', array(
    'user' => $this->user,
    'blog' => $this->blog_model->loadPosts($config['per_page'], $page),
    'links' => $this->pagination->create_links(),
    'footer' => $this->blog_model->loadFooter()
));

然后在我的模型中,我正在抓取帖子

public function loadPosts($limit, $start)
{
    $this->db->limit($limit, $start);
    $this->db->order_by("date", "desc");
    //this loads the contact info
    $query = $this->db->get('entries');
    return $query->result();
}

我的完整网址是www.mysite.com/blog,然后分页显示为www.mysite.com/blog/2

对于 base_Url 我也试过base_url() . "/blog";

我尝试将 uri_segment 设置为 1 和 3,但似乎没有任何效果。

我也尝试过使用路由并添加只是为了看看它是否会做任何事情:

$route['blog/(:num)'] = 'blog/$1';

【问题讨论】:

  • 你不需要使用uri->segment。在您的控制器函数中设置一个参数,它将采用您的段的值。例如函数示例($page = 0)。这样不会出错。另外,删除你的路由规则,因为它什么都不做,以后可能会很棘手。
  • @AdrienXL 我正想尝试任何路线。一旦我看到它什么也没做,我就已经禁用它了。我总是不得不设置一个 uri_segment 并且我已经阅读了许多文章指出没有它分页将根本不起作用。如果不使用它,我将如何在控制器中进行设置?

标签: php codeigniter


【解决方案1】:

如果你的代码在 index 方法中,你可以使用这行代码:

$route['blog/:any'] = "blog/index/$1";

因为你使用了segment(2),你应该把blog/index/$1改为blog/ :任何

【讨论】:

  • 这是错误的答案。 blog /abc 将重定向到索引函数。但它似乎应该重定向 abc 函数。仅对于数字它应该重定向索引函数。还有$1 使用了不必要和错误的方式。
  • 尝试使用example.com/blog/test。它将执行index函数而不是test函数。你也用错了$1。看这里ellislab.com/codeigniter/user-guide/general/routing.html如何使用$1,$2
【解决方案2】:

假设包含您的分页代码的函数名称是 index(),您应该将路由更改为:

$route['blog/(:num)'] = 'blog/index/$1';

在你的 index() 函数中,添加 $page 参数:

public function index($page = 1){
...

【讨论】:

  • 我用 .htaccess 删除了索引,我还需要更改路线吗?将 $page 变量传递给函数后,我会在哪里调用它?
  • 而不是$page = ($this->uri->segment(2)) ? $this->uri->segment(2) : 0;使用参数中给定的那个
  • 好的,很酷。我使用了该路线,这似乎解决了未找到的问题(谢谢!),但我仍然对 $page.xml 感到困惑。当我使用该 $page 时,下一页会返回与第一页相同的结果。
  • 如果是这样,那么我猜你的第一页不是 1 它是 0 ($page = 0)
  • 另外$config["uri_segment"] = 2;应该改成$config["uri_segment"] = 3;
【解决方案3】:

在您的路线中,如果可以的话,请尝试添加任意数量的 :anys 或 :nums:

$route['blog'] = 'blog/index'; // For the first level
$route['blog/(:any)/(:any)'] = 'blog/index/$1/$2'; // For extra "uri" segments.

// base_url pagination

$config["base_url"] = base_url("blog"); // Is preferred

【讨论】:

    【解决方案4】:

    您可以保持其他代码不变。只需将其添加到您的 routes.php 文件中:

    $route['blog/:num'] = "blog/index";
    //Assumes your code is inside the index method.
    //If not, use this way:
    //$route['blog/:num'] = "blog/YOUR_METHOD_NAME";
    

    【讨论】:

      【解决方案5】:

      您不能将参数传递给控制器​​的 index() 函数,就像它是一个随机函数一样。

      如果你尝试使用 controller/var 而不是 controller/function/var,CodeIgniter 将在控制器中搜索一个不存在的函数 var()。当您尝试访问 blog/2 时会发生这种情况:2() 不是您控制器中的函数。

      您可以在控制器中创建一个新函数,比如 page(),然后将代码移入其中。这样,您将致电blog/page/2。函数page() 将存在并且不会得到 404。也不要重新定义您的 base_url 以进行分页。

      $config["base_url"] = site_url("blog/page");
      

      如果你绝对需要像/blog/2 这样的 URL,另一种解决方案:

      $route['blog/(:any)'] = 'blog/index/$1'; 
      

      重新映射也可能是一个解决方案:http://www.codeigniter.com/user_guide/general/controllers.html#remapping

      【讨论】:

      • 那么,如果我理解正确的话,您希望我将所有代码移出索引并将其放入一个函数中,然后在索引中调用该函数?
      • @zazvorniki;不是真的,在上面的答案中,我解释说您可以将当前在 index() 中的代码移动到一个新函数并使用该函数而不是 index()。作为替代解决方案,您可以使用路由将参数发送到索引函数。这就是您目前正在尝试做的事情,但没有成功。
      猜你喜欢
      • 2020-10-20
      • 1970-01-01
      • 1970-01-01
      • 2013-10-28
      • 2013-10-28
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多