在Codeigniter中过滤,排序和分页

时间:2010-03-11 21:04:04

标签: php codeigniter content-management-system query-string

我最近开始使用CodeIgniter,因为我正在寻找一个非常轻量级的框架,它似乎是最佳选择。

我是整个MVC的新手,享受它,但我似乎非常简单。

我正在编写CMS,需要一种方法来过滤,排序和分页结果。我习惯用querystrings来做这件事,所以我会有以下几点:

articles.php?order=title&sort=desc&filter=articletitle&page=5

我不知道如何在CI中执行此操作,因此我只是在配置中启用了EnableQueryStrings,它工作正常,但我感觉它可能不是最优雅的解决方案。

我想我可以

index.php/articles/index/order/title/sort/desc/filter/articletitle/page/5

但对我而言,这似乎非常不灵活,如果我不需要排序,我将如何确保我正在查看正确的uri段呢?

任何想法?

6 个答案:

答案 0 :(得分:3)

您是否尝试过实施_remap功能?它会将所有查询重定向到控制器,并允许您根据需要实现尽可能多的(或少数)。

然后你可以这样做:

class Articles extends Controller
{
    // Note: No need for a "order" or even an "index" function!
    public function _remap()
    {
        $assoc = $this->uri->uri_to_assoc( 4 );
        /* $assoc is now 
           array( "order"=>"title",
                  "sort"=>"desc",
                  "filter"=>"articletitle", 
                  "page"=>5); */
    }
}

答案 1 :(得分:2)

我遇到了很多次这个问题,最后决定尝试妥善解决。

我的解决方案涉及组合路径/查询字符串方法(它需要a solution like the one Stephen linked to)。

网址的格式如下:

http://www.myapp.dev/controller/index/10?order_by=id+asc&status=open

然后可以将这些可选的$ _GET参数用作查询条件,您可以根据需要使用任意数量,而不会搞砸CI的分页偏移量。

默认情况下,CodeIgniter的Pagination库不支持在URI结束之前放置偏移量。让CI支持这一点的技巧是扩展分页库,如下所示:http://pastie.org/1393513

然后,在你的控制器中,你可以像这样初始化分页:

$config['url_format'] = site_url('controller/index/{offset}?'.http_build_query($params));
$config['total_rows'] = $this->model->count_rows();
$config['per_page'] = 5;
$this->pagination->initialize($config);

请注意,不需要uri_segment,因为自定义Pagination :: initialize方法会根据{offset}字符串中url_format的位置来检测它。

使用$this->pagination->create_links()构建的链接会在适当的位置插入偏移量,并保留尾部查询字符串。

答案 2 :(得分:0)

我不喜欢CodeIgniter破坏查询字符串的事实。查询字符串非常适合可选参数。试图将可选参数放在URI段中,事情开始变得奇怪。

这样的网址看起来有点像黑客:

index.php/articles/index/order/title/sort/desc/filter/articletitle/page/5

出于这个原因,我将CodeIgniter配置为使用URI段和查询字符串的混合。 This answer shows you how you can achieve this.

答案 3 :(得分:0)

默认情况下,您无法使用查询字符串,这有点尴尬。我通过在表单帖子中发送排序首选项然后将该首选项存储在用户的会话中,在一些领域的当前项目中克服了这个问题。

答案 4 :(得分:0)

您可以随时执行以下操作:

www.yourdomain.com/articles/order-title/sort-desc/filter-articletitle/page-5

通过.htaccess删除index.php。然后在每个URI段上展开“ - ”。

$order = $this->uri->segment(2, 0);
$sort = $this->uri->segment(3, 0);
$filter = $this->uri->segment(4,0);
$page = $this->uri->segment(5, 0;

if(!empty($order)){
    $order = explode('-', $order);
} else {
    $order = 'defaultorder';
}

/** And so on for the rest of the URI segments **/

甚至删除整个爆炸中的等式,然后执行:

www.yourdomain.com/articles/title/desc/articletitle/5

$order = $this->uri->segment(2, 0);
$sort = $this->uri->segment(3, 0);
$filter = $this->uri->segment(4,0);
$page = $this->uri->segment(5, 0;

这是使用Code Igniter的大多数主要业务进行排序和分页的方式。

答案 5 :(得分:0)

就个人而言,我是Lou建议的忠实粉丝或路径/查询字符串组合,但我认为我的方法比他简单。

我的解决方案将每页参数与您的过滤参数一起放在查询字符串中,例如

http://mysite.com/admin/contacts?status=open&per_page=20

这要归功于分页类的page_query_string选项。这是:

$query_string = some_function_to_get_your_filter_query_string_params();

$config['base_url'] = site_url("admin/contacts?". $query_string);
$config['total_rows'] = $total_rows;
$config['per_page'] = $per_page;
$config['page_query_string'] = TRUE;
$this->pagination->initialize($config);