drupal 7 实现自定义 pager 分页功能

  最近在写一个drupal界面,要显示一个表格,需要分页。但是drupal自带的分页都是基于SQL查询的,而我这次要做的是从mongo中查询数据显示(虽然是从mongo中查询,其实是抽象出了一个model),所以就想研究一下如何在drupal中实现不基于SQL查询的分页功能。

  看了drupal官方文档,发现drupal默认的pager非常依赖于SQL查询,很难满足我的需求。后来虽然找到一个从mongo查询实现的分页,但是想了想还是决定自己写一个比较通用的工具,将来需要分页的地方多着呢!

 1 function pager_without_sql($quantity, $limit, $page = 0, $url = null) {
 2   global $base_path;
 3   if (!$url) {
 4     $url = $base_path.current_path();
 5   }
 6   $total = ceil($quantity / $limit);
 7   $first_page = 0;
 8   $last_page = $total - 1;
 9   $cur_page = $page;
10   $previous_page = $cur_page - 1 > $first_page ? $cur_page - 1 : $first_page;
11   $next_page = $cur_page + 1 < $last_page ? $cur_page + 1 : $last_page;
12   $start_page = $cur_page - 4 > $first_page ? $cur_page - 4 : $first_page;
13   $end_page = $cur_page + 4 < $last_page ? $cur_page + 4 : $last_page;
14   $page_array = array();
15   $page_array[‘first‘] = array(
16     ‘page‘ => $first_page,
17     ‘name‘ => ‘首页‘,
18     ‘link‘ => $url . ‘?page=‘ . $first_page,
19     ‘class‘ => ‘pager-first‘
20   );
21   $page_array[‘previous‘] = array(
22     ‘page‘ => $previous_page,
23     ‘name‘ => ‘上一页‘,
24     ‘link‘ => $url . ‘?page=‘ . $previous_page,
25     ‘class‘ => ‘pager-previous‘
26   );
27   if ($start_page > $first_page) {
28     $page_array[‘before_start‘] = array(
29       ‘page‘ => ‘‘,
30       ‘name‘ => ‘...‘,
31       ‘link‘ => ‘‘,
32       ‘class‘ => ‘pager-ellipsis‘
33     );
34   }
35   for ($i = $start_page; $i <= $end_page; $i++) {
36     $page_array[$i] = array(
37       ‘page‘ => $i,
38       ‘name‘ => $i + 1,
39       ‘link‘ => ($i == $cur_page ? ‘‘ : $url . ‘?page=‘ . $i),
40       ‘class‘ => ‘pager-item‘
41     );
42   }
43   if ($end_page < $last_page) {
44     $page_array[‘after_end‘] = array(
45       ‘page‘ => ‘‘,
46       ‘name‘ => ‘...‘,
47       ‘link‘ => ‘‘,
48       ‘class‘ => ‘pager-ellipsis‘
49     );
50   }
51   $page_array[‘next‘] = array(
52     ‘page‘ => $next_page,
53     ‘name‘ => ‘下一页‘,
54     ‘link‘ => $url . ‘?page=‘ . $next_page,
55     ‘class‘ => ‘pager-next‘
56   );
57   $page_array[‘last‘] = array(
58     ‘page‘ => $last_page,
59     ‘name‘ => ‘末页‘,
60     ‘link‘ => $url . ‘?page=‘ . $last_page,
61     ‘class‘ => ‘pager-last‘
62   );
63   if ($total > 1) {
64     foreach ($page_array as $index => $page) {
65       $items[$index] = array(
66         ‘class‘ => array($page[‘class‘]),
67         ‘data‘ => $page[‘link‘]?‘<a href="‘.$page[‘link‘].‘">‘.$page[‘name‘].‘</a>‘:$page[‘name‘],
68       );
69     }
70     $pager_string = ‘<h2 class="element-invisible">‘ . t(‘Pages‘) . ‘</h2>‘ . theme(‘item_list‘, array(
71       ‘items‘ => $items,
72       ‘attributes‘ => array(‘class‘ => array(‘pager‘)),
73     ));
74     $pager_form = array(
75       ‘#markup‘ => $pager_string,
76     );
77     return $pager_form;
78   }
79 }

  传入的参数就是数据总条数、每页条数、当前页数。将返回的pager放到form里就OK啦。页码是通过get方式传递的,查询中的limit就要自己注意啦。

  小白一只,还请大家多多指教!

时间: 11-09

drupal 7 实现自定义 pager 分页功能的相关文章

简单的beego分页功能代码

一个简单的beego分页小插件(源代码在最下面): 支持条件查询 支持参数保留 支持自定义css样式 支持表/视图 支持参数自定义 默认为pno 支持定义生成链接的个数 使用方式: 1)action中,引入包,然后如下使用: /** * 日志列表 */ func (this *LogController) List() { pno, _ := this.GetInt("pno") //获取当前请求页 var tlog []m.Tb_log var conditions string =

ASP.NET中利用DataGrid的自定义分页功能

ASP.NET中利用DataGrid的自定义分页功能和存储过程结合实现高效分页 ASP.Net中的DataGrid有内置分页功能, 但是它的默认的分页方式效率是很低的,特别是在数据量很大的时候,用它内置的分页功能几乎是不可能的事,因为它会把所有的数据从数据库读出来再进行分页, 这种只选取了一小部分而丢掉大部分的方法是不可去取的. 在最进的一个项目中因为一个管理页面要管理的数据量非常大,所以必须分页显示,并且不能用DataGrid的内置分页功能,于是自己实现分页. 下面介绍一下我在项目中用到的分页

asp.net mvc 简易通用自定义Pager实现分页

asp.net mvc 简易通用自定义Pager实现分页 Intro 一个WEB应用程序中经常会用到数据分页,本文将实现一个简单通用的分页组件,包含一个 PagerModel (用来保存页码信息),一个 HtmlHelper 的 Pager 扩展方法和一个 PagedListModel<T> 分页数据模型. PagerModel 分页模型 PagerModel 用来保存分页信息,代码实现如下: 1 /// <summary> 2 /// PagerModel 分页模型 3 ///

{oldboy-django][2深入django]分页功能

1 django自带分页 1.1 分页模板 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/boots

【APS.NET Core】- Razor Page 使用jqgrid实现分页功能

本文将使用jqgrid在Razor Page中实现分页功能. 前台 List.cshtml代码如下: 1 @page 2 @model ListModel 3 @{ 4 Layout = "~/Pages/Shared/_Index.cshtml"; 5 } 6 7 <script> 8 $(function () { 9 gridList(); 10 }); 11 12 function gridList() { 13 var $gridList = $("#g

Ecmall系统自带的分页功能

在Ecmall的二次开发中,分页是必不可少的.这个系统已经自带了分页功能,下面来看看如何使用这个分页. 下面是一个自定义的类,用于查看订单的详细情况.关键在于get_order_data()这个方法,分页的使用也在这个方法的内部了.应该有的注释都有了,应该会比较容易懂,我不就多说了. <?php define('NUM_PER_PAGE', 15); // 每页显示数量 class NowaMagicApp extends MallbaseApp { public function index(

yii自定义CLinkPager分页

在components中自定义LinkPager,并继承CLinkPager 代码如下: <?php /** * CLinkPager class file. * * @author liang.pingzheng * @QQ 327168521 */ class PLinkPager extends CLinkPager { const CSS_TOTAL_PAGE='total_page'; const CSS_TOTAL_ROW='total_row'; /** * @var string

JDBC使用数据库来完成分页功能

本篇讲诉如何在页面中通过操作数据库来完成数据显示的分页功能.当一个操作数据库进行查询的语句返回的结果集内容如果过多,那么内存极有可能溢出,所以在大数据的情况下分页是必须的.当然分页能通过很多种方式来实现,而这里我们采用的是操作数据库的方式,而且在这种方式中,最重要的是带限制条件的查询SQL语句: select name from user limit m,n 其中m与n为数字.n代表需要获取多少行的数据项,而m代表从哪开始(以0为起始),例如我们想从user表中先获取前五行数据项(1-5)的na

asp.net mvc 自定义pager封装与优化

asp.net mvc 自定义pager封装与优化 Intro 之前做了一个通用的分页组件,但是有些不足,从翻页事件和分页样式都融合在后台代码中,到翻页事件可以自定义,再到翻页和样式都和代码分离, 自定义分页 pager 越来越容易扩展了. HtmlHelper Pager扩展 Pager V1.0 : 1 /// <summary> 2 /// Pager V1.0 3 /// </summary> 4 /// <param name="helper"&