annotate includes/pager.inc @ 13:134d4b2e75f6

updated quicktabs and google analytics modules
author danieleb <danielebarchiesi@me.com>
date Tue, 29 Oct 2013 13:48:59 +0000
parents ff03f76ab3fe
children
rev   line source
danielebarchiesi@0 1 <?php
danielebarchiesi@0 2
danielebarchiesi@0 3 /**
danielebarchiesi@0 4 * @file
danielebarchiesi@0 5 * Functions to aid in presenting database results as a set of pages.
danielebarchiesi@0 6 */
danielebarchiesi@0 7
danielebarchiesi@0 8
danielebarchiesi@0 9 /**
danielebarchiesi@0 10 * Query extender for pager queries.
danielebarchiesi@0 11 *
danielebarchiesi@0 12 * This is the "default" pager mechanism. It creates a paged query with a fixed
danielebarchiesi@0 13 * number of entries per page.
danielebarchiesi@0 14 */
danielebarchiesi@0 15 class PagerDefault extends SelectQueryExtender {
danielebarchiesi@0 16
danielebarchiesi@0 17 /**
danielebarchiesi@0 18 * The highest element we've autogenerated so far.
danielebarchiesi@0 19 *
danielebarchiesi@0 20 * @var int
danielebarchiesi@0 21 */
danielebarchiesi@0 22 static $maxElement = 0;
danielebarchiesi@0 23
danielebarchiesi@0 24 /**
danielebarchiesi@0 25 * The number of elements per page to allow.
danielebarchiesi@0 26 *
danielebarchiesi@0 27 * @var int
danielebarchiesi@0 28 */
danielebarchiesi@0 29 protected $limit = 10;
danielebarchiesi@0 30
danielebarchiesi@0 31 /**
danielebarchiesi@0 32 * The unique ID of this pager on this page.
danielebarchiesi@0 33 *
danielebarchiesi@0 34 * @var int
danielebarchiesi@0 35 */
danielebarchiesi@0 36 protected $element = NULL;
danielebarchiesi@0 37
danielebarchiesi@0 38 /**
danielebarchiesi@0 39 * The count query that will be used for this pager.
danielebarchiesi@0 40 *
danielebarchiesi@0 41 * @var SelectQueryInterface
danielebarchiesi@0 42 */
danielebarchiesi@0 43 protected $customCountQuery = FALSE;
danielebarchiesi@0 44
danielebarchiesi@0 45 public function __construct(SelectQueryInterface $query, DatabaseConnection $connection) {
danielebarchiesi@0 46 parent::__construct($query, $connection);
danielebarchiesi@0 47
danielebarchiesi@0 48 // Add pager tag. Do this here to ensure that it is always added before
danielebarchiesi@0 49 // preExecute() is called.
danielebarchiesi@0 50 $this->addTag('pager');
danielebarchiesi@0 51 }
danielebarchiesi@0 52
danielebarchiesi@0 53 /**
danielebarchiesi@0 54 * Override the execute method.
danielebarchiesi@0 55 *
danielebarchiesi@0 56 * Before we run the query, we need to add pager-based range() instructions
danielebarchiesi@0 57 * to it.
danielebarchiesi@0 58 */
danielebarchiesi@0 59 public function execute() {
danielebarchiesi@0 60
danielebarchiesi@0 61 // Add convenience tag to mark that this is an extended query. We have to
danielebarchiesi@0 62 // do this in the constructor to ensure that it is set before preExecute()
danielebarchiesi@0 63 // gets called.
danielebarchiesi@0 64 if (!$this->preExecute($this)) {
danielebarchiesi@0 65 return NULL;
danielebarchiesi@0 66 }
danielebarchiesi@0 67
danielebarchiesi@0 68 // A NULL limit is the "kill switch" for pager queries.
danielebarchiesi@0 69 if (empty($this->limit)) {
danielebarchiesi@0 70 return;
danielebarchiesi@0 71 }
danielebarchiesi@0 72 $this->ensureElement();
danielebarchiesi@0 73
danielebarchiesi@0 74 $total_items = $this->getCountQuery()->execute()->fetchField();
danielebarchiesi@0 75 $current_page = pager_default_initialize($total_items, $this->limit, $this->element);
danielebarchiesi@0 76 $this->range($current_page * $this->limit, $this->limit);
danielebarchiesi@0 77
danielebarchiesi@0 78 // Now that we've added our pager-based range instructions, run the query normally.
danielebarchiesi@0 79 return $this->query->execute();
danielebarchiesi@0 80 }
danielebarchiesi@0 81
danielebarchiesi@0 82 /**
danielebarchiesi@0 83 * Ensure that there is an element associated with this query.
danielebarchiesi@0 84 * If an element was not specified previously, then the value of the
danielebarchiesi@0 85 * $maxElement counter is taken, after which the counter is incremented.
danielebarchiesi@0 86 *
danielebarchiesi@0 87 * After running this method, access $this->element to get the element for this
danielebarchiesi@0 88 * query.
danielebarchiesi@0 89 */
danielebarchiesi@0 90 protected function ensureElement() {
danielebarchiesi@0 91 if (!isset($this->element)) {
danielebarchiesi@0 92 $this->element = self::$maxElement++;
danielebarchiesi@0 93 }
danielebarchiesi@0 94 }
danielebarchiesi@0 95
danielebarchiesi@0 96 /**
danielebarchiesi@0 97 * Specify the count query object to use for this pager.
danielebarchiesi@0 98 *
danielebarchiesi@0 99 * You will rarely need to specify a count query directly. If not specified,
danielebarchiesi@0 100 * one is generated off of the pager query itself.
danielebarchiesi@0 101 *
danielebarchiesi@0 102 * @param SelectQueryInterface $query
danielebarchiesi@0 103 * The count query object. It must return a single row with a single column,
danielebarchiesi@0 104 * which is the total number of records.
danielebarchiesi@0 105 */
danielebarchiesi@0 106 public function setCountQuery(SelectQueryInterface $query) {
danielebarchiesi@0 107 $this->customCountQuery = $query;
danielebarchiesi@0 108 }
danielebarchiesi@0 109
danielebarchiesi@0 110 /**
danielebarchiesi@0 111 * Retrieve the count query for this pager.
danielebarchiesi@0 112 *
danielebarchiesi@0 113 * The count query may be specified manually or, by default, taken from the
danielebarchiesi@0 114 * query we are extending.
danielebarchiesi@0 115 *
danielebarchiesi@0 116 * @return SelectQueryInterface
danielebarchiesi@0 117 * A count query object.
danielebarchiesi@0 118 */
danielebarchiesi@0 119 public function getCountQuery() {
danielebarchiesi@0 120 if ($this->customCountQuery) {
danielebarchiesi@0 121 return $this->customCountQuery;
danielebarchiesi@0 122 }
danielebarchiesi@0 123 else {
danielebarchiesi@0 124 return $this->query->countQuery();
danielebarchiesi@0 125 }
danielebarchiesi@0 126 }
danielebarchiesi@0 127
danielebarchiesi@0 128 /**
danielebarchiesi@0 129 * Specify the maximum number of elements per page for this query.
danielebarchiesi@0 130 *
danielebarchiesi@0 131 * The default if not specified is 10 items per page.
danielebarchiesi@0 132 *
danielebarchiesi@0 133 * @param $limit
danielebarchiesi@0 134 * An integer specifying the number of elements per page. If passed a false
danielebarchiesi@0 135 * value (FALSE, 0, NULL), the pager is disabled.
danielebarchiesi@0 136 */
danielebarchiesi@0 137 public function limit($limit = 10) {
danielebarchiesi@0 138 $this->limit = $limit;
danielebarchiesi@0 139 return $this;
danielebarchiesi@0 140 }
danielebarchiesi@0 141
danielebarchiesi@0 142 /**
danielebarchiesi@0 143 * Specify the element ID for this pager query.
danielebarchiesi@0 144 *
danielebarchiesi@0 145 * The element is used to differentiate different pager queries on the same
danielebarchiesi@0 146 * page so that they may be operated independently. If you do not specify an
danielebarchiesi@0 147 * element, every pager query on the page will get a unique element. If for
danielebarchiesi@0 148 * whatever reason you want to explicitly define an element for a given query,
danielebarchiesi@0 149 * you may do so here.
danielebarchiesi@0 150 *
danielebarchiesi@0 151 * Setting the element here also increments the static $maxElement counter,
danielebarchiesi@0 152 * which is used for determining the $element when there's none specified.
danielebarchiesi@0 153 *
danielebarchiesi@0 154 * Note that no collision detection is done when setting an element ID
danielebarchiesi@0 155 * explicitly, so it is possible for two pagers to end up using the same ID
danielebarchiesi@0 156 * if both are set explicitly.
danielebarchiesi@0 157 *
danielebarchiesi@0 158 * @param $element
danielebarchiesi@0 159 */
danielebarchiesi@0 160 public function element($element) {
danielebarchiesi@0 161 $this->element = $element;
danielebarchiesi@0 162 if ($element >= self::$maxElement) {
danielebarchiesi@0 163 self::$maxElement = $element + 1;
danielebarchiesi@0 164 }
danielebarchiesi@0 165 return $this;
danielebarchiesi@0 166 }
danielebarchiesi@0 167 }
danielebarchiesi@0 168
danielebarchiesi@0 169 /**
danielebarchiesi@0 170 * Returns the current page being requested for display within a pager.
danielebarchiesi@0 171 *
danielebarchiesi@0 172 * @param $element
danielebarchiesi@0 173 * An optional integer to distinguish between multiple pagers on one page.
danielebarchiesi@0 174 *
danielebarchiesi@0 175 * @return
danielebarchiesi@0 176 * The number of the current requested page, within the pager represented by
danielebarchiesi@0 177 * $element. This is determined from the URL query parameter $_GET['page'], or
danielebarchiesi@0 178 * 0 by default. Note that this number may differ from the actual page being
danielebarchiesi@0 179 * displayed. For example, if a search for "example text" brings up three
danielebarchiesi@0 180 * pages of results, but a users visits search/node/example+text?page=10, this
danielebarchiesi@0 181 * function will return 10, even though the default pager implementation
danielebarchiesi@0 182 * adjusts for this and still displays the third page of search results at
danielebarchiesi@0 183 * that URL.
danielebarchiesi@0 184 *
danielebarchiesi@0 185 * @see pager_default_initialize()
danielebarchiesi@0 186 */
danielebarchiesi@0 187 function pager_find_page($element = 0) {
danielebarchiesi@0 188 $page = isset($_GET['page']) ? $_GET['page'] : '';
danielebarchiesi@0 189 $page_array = explode(',', $page);
danielebarchiesi@0 190 if (!isset($page_array[$element])) {
danielebarchiesi@0 191 $page_array[$element] = 0;
danielebarchiesi@0 192 }
danielebarchiesi@0 193 return (int) $page_array[$element];
danielebarchiesi@0 194 }
danielebarchiesi@0 195
danielebarchiesi@0 196 /**
danielebarchiesi@0 197 * Initializes a pager for theme('pager').
danielebarchiesi@0 198 *
danielebarchiesi@0 199 * This function sets up the necessary global variables so that future calls
danielebarchiesi@0 200 * to theme('pager') will render a pager that correctly corresponds to the
danielebarchiesi@0 201 * items being displayed.
danielebarchiesi@0 202 *
danielebarchiesi@0 203 * If the items being displayed result from a database query performed using
danielebarchiesi@0 204 * Drupal's database API, and if you have control over the construction of the
danielebarchiesi@0 205 * database query, you do not need to call this function directly; instead, you
danielebarchiesi@0 206 * can simply extend the query object with the 'PagerDefault' extender before
danielebarchiesi@0 207 * executing it. For example:
danielebarchiesi@0 208 * @code
danielebarchiesi@0 209 * $query = db_select('some_table')->extend('PagerDefault');
danielebarchiesi@0 210 * @endcode
danielebarchiesi@0 211 *
danielebarchiesi@0 212 * However, if you are using a different method for generating the items to be
danielebarchiesi@0 213 * paged through, then you should call this function in preparation.
danielebarchiesi@0 214 *
danielebarchiesi@0 215 * The following example shows how this function can be used in a page callback
danielebarchiesi@0 216 * that invokes an external datastore with an SQL-like syntax:
danielebarchiesi@0 217 * @code
danielebarchiesi@0 218 * // First find the total number of items and initialize the pager.
danielebarchiesi@0 219 * $where = "status = 1";
danielebarchiesi@0 220 * $total = mymodule_select("SELECT COUNT(*) FROM data " . $where)->result();
danielebarchiesi@0 221 * $num_per_page = variable_get('mymodule_num_per_page', 10);
danielebarchiesi@0 222 * $page = pager_default_initialize($total, $num_per_page);
danielebarchiesi@0 223 *
danielebarchiesi@0 224 * // Next, retrieve and display the items for the current page.
danielebarchiesi@0 225 * $offset = $num_per_page * $page;
danielebarchiesi@0 226 * $result = mymodule_select("SELECT * FROM data " . $where . " LIMIT %d, %d", $offset, $num_per_page)->fetchAll();
danielebarchiesi@0 227 * $output = theme('mymodule_results', array('result' => $result));
danielebarchiesi@0 228 *
danielebarchiesi@0 229 * // Finally, display the pager controls, and return.
danielebarchiesi@0 230 * $output .= theme('pager');
danielebarchiesi@0 231 * return $output;
danielebarchiesi@0 232 * @endcode
danielebarchiesi@0 233 *
danielebarchiesi@0 234 * A second example involves a page callback that invokes an external search
danielebarchiesi@0 235 * service where the total number of matching results is provided as part of
danielebarchiesi@0 236 * the returned set (so that we do not need a separate query in order to obtain
danielebarchiesi@0 237 * this information). Here, we call pager_find_page() to calculate the desired
danielebarchiesi@0 238 * offset before the search is invoked:
danielebarchiesi@0 239 * @code
danielebarchiesi@0 240 * // Perform the query, using the requested offset from pager_find_page().
danielebarchiesi@0 241 * // This comes from a URL parameter, so here we are assuming that the URL
danielebarchiesi@0 242 * // parameter corresponds to an actual page of results that will exist
danielebarchiesi@0 243 * // within the set.
danielebarchiesi@0 244 * $page = pager_find_page();
danielebarchiesi@0 245 * $num_per_page = variable_get('mymodule_num_per_page', 10);
danielebarchiesi@0 246 * $offset = $num_per_page * $page;
danielebarchiesi@0 247 * $result = mymodule_remote_search($keywords, $offset, $num_per_page);
danielebarchiesi@0 248 *
danielebarchiesi@0 249 * // Now that we have the total number of results, initialize the pager.
danielebarchiesi@0 250 * pager_default_initialize($result->total, $num_per_page);
danielebarchiesi@0 251 *
danielebarchiesi@0 252 * // Display the search results.
danielebarchiesi@0 253 * $output = theme('search_results', array('results' => $result->data, 'type' => 'remote'));
danielebarchiesi@0 254 *
danielebarchiesi@0 255 * // Finally, display the pager controls, and return.
danielebarchiesi@0 256 * $output .= theme('pager');
danielebarchiesi@0 257 * return $output;
danielebarchiesi@0 258 * @endcode
danielebarchiesi@0 259 *
danielebarchiesi@0 260 * @param $total
danielebarchiesi@0 261 * The total number of items to be paged.
danielebarchiesi@0 262 * @param $limit
danielebarchiesi@0 263 * The number of items the calling code will display per page.
danielebarchiesi@0 264 * @param $element
danielebarchiesi@0 265 * An optional integer to distinguish between multiple pagers on one page.
danielebarchiesi@0 266 *
danielebarchiesi@0 267 * @return
danielebarchiesi@0 268 * The number of the current page, within the pager represented by $element.
danielebarchiesi@0 269 * This is determined from the URL query parameter $_GET['page'], or 0 by
danielebarchiesi@0 270 * default. However, if a page that does not correspond to the actual range
danielebarchiesi@0 271 * of the result set was requested, this function will return the closest
danielebarchiesi@0 272 * page actually within the result set.
danielebarchiesi@0 273 */
danielebarchiesi@0 274 function pager_default_initialize($total, $limit, $element = 0) {
danielebarchiesi@0 275 global $pager_page_array, $pager_total, $pager_total_items, $pager_limits;
danielebarchiesi@0 276
danielebarchiesi@0 277 $page = pager_find_page($element);
danielebarchiesi@0 278
danielebarchiesi@0 279 // We calculate the total of pages as ceil(items / limit).
danielebarchiesi@0 280 $pager_total_items[$element] = $total;
danielebarchiesi@0 281 $pager_total[$element] = ceil($pager_total_items[$element] / $limit);
danielebarchiesi@0 282 $pager_page_array[$element] = max(0, min($page, ((int) $pager_total[$element]) - 1));
danielebarchiesi@0 283 $pager_limits[$element] = $limit;
danielebarchiesi@0 284 return $pager_page_array[$element];
danielebarchiesi@0 285 }
danielebarchiesi@0 286
danielebarchiesi@0 287 /**
danielebarchiesi@0 288 * Compose a URL query parameter array for pager links.
danielebarchiesi@0 289 *
danielebarchiesi@0 290 * @return
danielebarchiesi@0 291 * A URL query parameter array that consists of all components of the current
danielebarchiesi@0 292 * page request except for those pertaining to paging.
danielebarchiesi@0 293 */
danielebarchiesi@0 294 function pager_get_query_parameters() {
danielebarchiesi@0 295 $query = &drupal_static(__FUNCTION__);
danielebarchiesi@0 296 if (!isset($query)) {
danielebarchiesi@0 297 $query = drupal_get_query_parameters($_GET, array('q', 'page'));
danielebarchiesi@0 298 }
danielebarchiesi@0 299 return $query;
danielebarchiesi@0 300 }
danielebarchiesi@0 301
danielebarchiesi@0 302 /**
danielebarchiesi@0 303 * Returns HTML for a query pager.
danielebarchiesi@0 304 *
danielebarchiesi@0 305 * Menu callbacks that display paged query results should call theme('pager') to
danielebarchiesi@0 306 * retrieve a pager control so that users can view other results. Format a list
danielebarchiesi@0 307 * of nearby pages with additional query results.
danielebarchiesi@0 308 *
danielebarchiesi@0 309 * @param $variables
danielebarchiesi@0 310 * An associative array containing:
danielebarchiesi@0 311 * - tags: An array of labels for the controls in the pager.
danielebarchiesi@0 312 * - element: An optional integer to distinguish between multiple pagers on
danielebarchiesi@0 313 * one page.
danielebarchiesi@0 314 * - parameters: An associative array of query string parameters to append to
danielebarchiesi@0 315 * the pager links.
danielebarchiesi@0 316 * - quantity: The number of pages in the list.
danielebarchiesi@0 317 *
danielebarchiesi@0 318 * @ingroup themeable
danielebarchiesi@0 319 */
danielebarchiesi@0 320 function theme_pager($variables) {
danielebarchiesi@0 321 $tags = $variables['tags'];
danielebarchiesi@0 322 $element = $variables['element'];
danielebarchiesi@0 323 $parameters = $variables['parameters'];
danielebarchiesi@0 324 $quantity = $variables['quantity'];
danielebarchiesi@0 325 global $pager_page_array, $pager_total;
danielebarchiesi@0 326
danielebarchiesi@0 327 // Calculate various markers within this pager piece:
danielebarchiesi@0 328 // Middle is used to "center" pages around the current page.
danielebarchiesi@0 329 $pager_middle = ceil($quantity / 2);
danielebarchiesi@0 330 // current is the page we are currently paged to
danielebarchiesi@0 331 $pager_current = $pager_page_array[$element] + 1;
danielebarchiesi@0 332 // first is the first page listed by this pager piece (re quantity)
danielebarchiesi@0 333 $pager_first = $pager_current - $pager_middle + 1;
danielebarchiesi@0 334 // last is the last page listed by this pager piece (re quantity)
danielebarchiesi@0 335 $pager_last = $pager_current + $quantity - $pager_middle;
danielebarchiesi@0 336 // max is the maximum page number
danielebarchiesi@0 337 $pager_max = $pager_total[$element];
danielebarchiesi@0 338 // End of marker calculations.
danielebarchiesi@0 339
danielebarchiesi@0 340 // Prepare for generation loop.
danielebarchiesi@0 341 $i = $pager_first;
danielebarchiesi@0 342 if ($pager_last > $pager_max) {
danielebarchiesi@0 343 // Adjust "center" if at end of query.
danielebarchiesi@0 344 $i = $i + ($pager_max - $pager_last);
danielebarchiesi@0 345 $pager_last = $pager_max;
danielebarchiesi@0 346 }
danielebarchiesi@0 347 if ($i <= 0) {
danielebarchiesi@0 348 // Adjust "center" if at start of query.
danielebarchiesi@0 349 $pager_last = $pager_last + (1 - $i);
danielebarchiesi@0 350 $i = 1;
danielebarchiesi@0 351 }
danielebarchiesi@0 352 // End of generation loop preparation.
danielebarchiesi@0 353
danielebarchiesi@0 354 $li_first = theme('pager_first', array('text' => (isset($tags[0]) ? $tags[0] : t('« first')), 'element' => $element, 'parameters' => $parameters));
danielebarchiesi@0 355 $li_previous = theme('pager_previous', array('text' => (isset($tags[1]) ? $tags[1] : t('‹ previous')), 'element' => $element, 'interval' => 1, 'parameters' => $parameters));
danielebarchiesi@0 356 $li_next = theme('pager_next', array('text' => (isset($tags[3]) ? $tags[3] : t('next ›')), 'element' => $element, 'interval' => 1, 'parameters' => $parameters));
danielebarchiesi@0 357 $li_last = theme('pager_last', array('text' => (isset($tags[4]) ? $tags[4] : t('last »')), 'element' => $element, 'parameters' => $parameters));
danielebarchiesi@0 358
danielebarchiesi@0 359 if ($pager_total[$element] > 1) {
danielebarchiesi@0 360 if ($li_first) {
danielebarchiesi@0 361 $items[] = array(
danielebarchiesi@0 362 'class' => array('pager-first'),
danielebarchiesi@0 363 'data' => $li_first,
danielebarchiesi@0 364 );
danielebarchiesi@0 365 }
danielebarchiesi@0 366 if ($li_previous) {
danielebarchiesi@0 367 $items[] = array(
danielebarchiesi@0 368 'class' => array('pager-previous'),
danielebarchiesi@0 369 'data' => $li_previous,
danielebarchiesi@0 370 );
danielebarchiesi@0 371 }
danielebarchiesi@0 372
danielebarchiesi@0 373 // When there is more than one page, create the pager list.
danielebarchiesi@0 374 if ($i != $pager_max) {
danielebarchiesi@0 375 if ($i > 1) {
danielebarchiesi@0 376 $items[] = array(
danielebarchiesi@0 377 'class' => array('pager-ellipsis'),
danielebarchiesi@0 378 'data' => '…',
danielebarchiesi@0 379 );
danielebarchiesi@0 380 }
danielebarchiesi@0 381 // Now generate the actual pager piece.
danielebarchiesi@0 382 for (; $i <= $pager_last && $i <= $pager_max; $i++) {
danielebarchiesi@0 383 if ($i < $pager_current) {
danielebarchiesi@0 384 $items[] = array(
danielebarchiesi@0 385 'class' => array('pager-item'),
danielebarchiesi@0 386 'data' => theme('pager_previous', array('text' => $i, 'element' => $element, 'interval' => ($pager_current - $i), 'parameters' => $parameters)),
danielebarchiesi@0 387 );
danielebarchiesi@0 388 }
danielebarchiesi@0 389 if ($i == $pager_current) {
danielebarchiesi@0 390 $items[] = array(
danielebarchiesi@0 391 'class' => array('pager-current'),
danielebarchiesi@0 392 'data' => $i,
danielebarchiesi@0 393 );
danielebarchiesi@0 394 }
danielebarchiesi@0 395 if ($i > $pager_current) {
danielebarchiesi@0 396 $items[] = array(
danielebarchiesi@0 397 'class' => array('pager-item'),
danielebarchiesi@0 398 'data' => theme('pager_next', array('text' => $i, 'element' => $element, 'interval' => ($i - $pager_current), 'parameters' => $parameters)),
danielebarchiesi@0 399 );
danielebarchiesi@0 400 }
danielebarchiesi@0 401 }
danielebarchiesi@0 402 if ($i < $pager_max) {
danielebarchiesi@0 403 $items[] = array(
danielebarchiesi@0 404 'class' => array('pager-ellipsis'),
danielebarchiesi@0 405 'data' => '…',
danielebarchiesi@0 406 );
danielebarchiesi@0 407 }
danielebarchiesi@0 408 }
danielebarchiesi@0 409 // End generation.
danielebarchiesi@0 410 if ($li_next) {
danielebarchiesi@0 411 $items[] = array(
danielebarchiesi@0 412 'class' => array('pager-next'),
danielebarchiesi@0 413 'data' => $li_next,
danielebarchiesi@0 414 );
danielebarchiesi@0 415 }
danielebarchiesi@0 416 if ($li_last) {
danielebarchiesi@0 417 $items[] = array(
danielebarchiesi@0 418 'class' => array('pager-last'),
danielebarchiesi@0 419 'data' => $li_last,
danielebarchiesi@0 420 );
danielebarchiesi@0 421 }
danielebarchiesi@0 422 return '<h2 class="element-invisible">' . t('Pages') . '</h2>' . theme('item_list', array(
danielebarchiesi@0 423 'items' => $items,
danielebarchiesi@0 424 'attributes' => array('class' => array('pager')),
danielebarchiesi@0 425 ));
danielebarchiesi@0 426 }
danielebarchiesi@0 427 }
danielebarchiesi@0 428
danielebarchiesi@0 429
danielebarchiesi@0 430 /**
danielebarchiesi@0 431 * @defgroup pagerpieces Pager pieces
danielebarchiesi@0 432 * @{
danielebarchiesi@0 433 * Theme functions for customizing pager elements.
danielebarchiesi@0 434 *
danielebarchiesi@0 435 * Note that you should NOT modify this file to customize your pager.
danielebarchiesi@0 436 */
danielebarchiesi@0 437
danielebarchiesi@0 438 /**
danielebarchiesi@0 439 * Returns HTML for the "first page" link in a query pager.
danielebarchiesi@0 440 *
danielebarchiesi@0 441 * @param $variables
danielebarchiesi@0 442 * An associative array containing:
danielebarchiesi@0 443 * - text: The name (or image) of the link.
danielebarchiesi@0 444 * - element: An optional integer to distinguish between multiple pagers on
danielebarchiesi@0 445 * one page.
danielebarchiesi@0 446 * - parameters: An associative array of query string parameters to append to
danielebarchiesi@0 447 * the pager links.
danielebarchiesi@0 448 *
danielebarchiesi@0 449 * @ingroup themeable
danielebarchiesi@0 450 */
danielebarchiesi@0 451 function theme_pager_first($variables) {
danielebarchiesi@0 452 $text = $variables['text'];
danielebarchiesi@0 453 $element = $variables['element'];
danielebarchiesi@0 454 $parameters = $variables['parameters'];
danielebarchiesi@0 455 global $pager_page_array;
danielebarchiesi@0 456 $output = '';
danielebarchiesi@0 457
danielebarchiesi@0 458 // If we are anywhere but the first page
danielebarchiesi@0 459 if ($pager_page_array[$element] > 0) {
danielebarchiesi@0 460 $output = theme('pager_link', array('text' => $text, 'page_new' => pager_load_array(0, $element, $pager_page_array), 'element' => $element, 'parameters' => $parameters));
danielebarchiesi@0 461 }
danielebarchiesi@0 462
danielebarchiesi@0 463 return $output;
danielebarchiesi@0 464 }
danielebarchiesi@0 465
danielebarchiesi@0 466 /**
danielebarchiesi@0 467 * Returns HTML for the "previous page" link in a query pager.
danielebarchiesi@0 468 *
danielebarchiesi@0 469 * @param $variables
danielebarchiesi@0 470 * An associative array containing:
danielebarchiesi@0 471 * - text: The name (or image) of the link.
danielebarchiesi@0 472 * - element: An optional integer to distinguish between multiple pagers on
danielebarchiesi@0 473 * one page.
danielebarchiesi@0 474 * - interval: The number of pages to move backward when the link is clicked.
danielebarchiesi@0 475 * - parameters: An associative array of query string parameters to append to
danielebarchiesi@0 476 * the pager links.
danielebarchiesi@0 477 *
danielebarchiesi@0 478 * @ingroup themeable
danielebarchiesi@0 479 */
danielebarchiesi@0 480 function theme_pager_previous($variables) {
danielebarchiesi@0 481 $text = $variables['text'];
danielebarchiesi@0 482 $element = $variables['element'];
danielebarchiesi@0 483 $interval = $variables['interval'];
danielebarchiesi@0 484 $parameters = $variables['parameters'];
danielebarchiesi@0 485 global $pager_page_array;
danielebarchiesi@0 486 $output = '';
danielebarchiesi@0 487
danielebarchiesi@0 488 // If we are anywhere but the first page
danielebarchiesi@0 489 if ($pager_page_array[$element] > 0) {
danielebarchiesi@0 490 $page_new = pager_load_array($pager_page_array[$element] - $interval, $element, $pager_page_array);
danielebarchiesi@0 491
danielebarchiesi@0 492 // If the previous page is the first page, mark the link as such.
danielebarchiesi@0 493 if ($page_new[$element] == 0) {
danielebarchiesi@0 494 $output = theme('pager_first', array('text' => $text, 'element' => $element, 'parameters' => $parameters));
danielebarchiesi@0 495 }
danielebarchiesi@0 496 // The previous page is not the first page.
danielebarchiesi@0 497 else {
danielebarchiesi@0 498 $output = theme('pager_link', array('text' => $text, 'page_new' => $page_new, 'element' => $element, 'parameters' => $parameters));
danielebarchiesi@0 499 }
danielebarchiesi@0 500 }
danielebarchiesi@0 501
danielebarchiesi@0 502 return $output;
danielebarchiesi@0 503 }
danielebarchiesi@0 504
danielebarchiesi@0 505 /**
danielebarchiesi@0 506 * Returns HTML for the "next page" link in a query pager.
danielebarchiesi@0 507 *
danielebarchiesi@0 508 * @param $variables
danielebarchiesi@0 509 * An associative array containing:
danielebarchiesi@0 510 * - text: The name (or image) of the link.
danielebarchiesi@0 511 * - element: An optional integer to distinguish between multiple pagers on
danielebarchiesi@0 512 * one page.
danielebarchiesi@0 513 * - interval: The number of pages to move forward when the link is clicked.
danielebarchiesi@0 514 * - parameters: An associative array of query string parameters to append to
danielebarchiesi@0 515 * the pager links.
danielebarchiesi@0 516 *
danielebarchiesi@0 517 * @ingroup themeable
danielebarchiesi@0 518 */
danielebarchiesi@0 519 function theme_pager_next($variables) {
danielebarchiesi@0 520 $text = $variables['text'];
danielebarchiesi@0 521 $element = $variables['element'];
danielebarchiesi@0 522 $interval = $variables['interval'];
danielebarchiesi@0 523 $parameters = $variables['parameters'];
danielebarchiesi@0 524 global $pager_page_array, $pager_total;
danielebarchiesi@0 525 $output = '';
danielebarchiesi@0 526
danielebarchiesi@0 527 // If we are anywhere but the last page
danielebarchiesi@0 528 if ($pager_page_array[$element] < ($pager_total[$element] - 1)) {
danielebarchiesi@0 529 $page_new = pager_load_array($pager_page_array[$element] + $interval, $element, $pager_page_array);
danielebarchiesi@0 530 // If the next page is the last page, mark the link as such.
danielebarchiesi@0 531 if ($page_new[$element] == ($pager_total[$element] - 1)) {
danielebarchiesi@0 532 $output = theme('pager_last', array('text' => $text, 'element' => $element, 'parameters' => $parameters));
danielebarchiesi@0 533 }
danielebarchiesi@0 534 // The next page is not the last page.
danielebarchiesi@0 535 else {
danielebarchiesi@0 536 $output = theme('pager_link', array('text' => $text, 'page_new' => $page_new, 'element' => $element, 'parameters' => $parameters));
danielebarchiesi@0 537 }
danielebarchiesi@0 538 }
danielebarchiesi@0 539
danielebarchiesi@0 540 return $output;
danielebarchiesi@0 541 }
danielebarchiesi@0 542
danielebarchiesi@0 543 /**
danielebarchiesi@0 544 * Returns HTML for the "last page" link in query pager.
danielebarchiesi@0 545 *
danielebarchiesi@0 546 * @param $variables
danielebarchiesi@0 547 * An associative array containing:
danielebarchiesi@0 548 * - text: The name (or image) of the link.
danielebarchiesi@0 549 * - element: An optional integer to distinguish between multiple pagers on
danielebarchiesi@0 550 * one page.
danielebarchiesi@0 551 * - parameters: An associative array of query string parameters to append to
danielebarchiesi@0 552 * the pager links.
danielebarchiesi@0 553 *
danielebarchiesi@0 554 * @ingroup themeable
danielebarchiesi@0 555 */
danielebarchiesi@0 556 function theme_pager_last($variables) {
danielebarchiesi@0 557 $text = $variables['text'];
danielebarchiesi@0 558 $element = $variables['element'];
danielebarchiesi@0 559 $parameters = $variables['parameters'];
danielebarchiesi@0 560 global $pager_page_array, $pager_total;
danielebarchiesi@0 561 $output = '';
danielebarchiesi@0 562
danielebarchiesi@0 563 // If we are anywhere but the last page
danielebarchiesi@0 564 if ($pager_page_array[$element] < ($pager_total[$element] - 1)) {
danielebarchiesi@0 565 $output = theme('pager_link', array('text' => $text, 'page_new' => pager_load_array($pager_total[$element] - 1, $element, $pager_page_array), 'element' => $element, 'parameters' => $parameters));
danielebarchiesi@0 566 }
danielebarchiesi@0 567
danielebarchiesi@0 568 return $output;
danielebarchiesi@0 569 }
danielebarchiesi@0 570
danielebarchiesi@0 571
danielebarchiesi@0 572 /**
danielebarchiesi@0 573 * Returns HTML for a link to a specific query result page.
danielebarchiesi@0 574 *
danielebarchiesi@0 575 * @param $variables
danielebarchiesi@0 576 * An associative array containing:
danielebarchiesi@0 577 * - text: The link text. Also used to figure out the title attribute of the
danielebarchiesi@0 578 * link, if it is not provided in $variables['attributes']['title']; in
danielebarchiesi@0 579 * this case, $variables['text'] must be one of the standard pager link
danielebarchiesi@0 580 * text strings that would be generated by the pager theme functions, such
danielebarchiesi@0 581 * as a number or t('« first').
danielebarchiesi@0 582 * - page_new: The first result to display on the linked page.
danielebarchiesi@0 583 * - element: An optional integer to distinguish between multiple pagers on
danielebarchiesi@0 584 * one page.
danielebarchiesi@0 585 * - parameters: An associative array of query string parameters to append to
danielebarchiesi@0 586 * the pager link.
danielebarchiesi@0 587 * - attributes: An associative array of HTML attributes to apply to the
danielebarchiesi@0 588 * pager link.
danielebarchiesi@0 589 *
danielebarchiesi@0 590 * @see theme_pager()
danielebarchiesi@0 591 *
danielebarchiesi@0 592 * @ingroup themeable
danielebarchiesi@0 593 */
danielebarchiesi@0 594 function theme_pager_link($variables) {
danielebarchiesi@0 595 $text = $variables['text'];
danielebarchiesi@0 596 $page_new = $variables['page_new'];
danielebarchiesi@0 597 $element = $variables['element'];
danielebarchiesi@0 598 $parameters = $variables['parameters'];
danielebarchiesi@0 599 $attributes = $variables['attributes'];
danielebarchiesi@0 600
danielebarchiesi@0 601 $page = isset($_GET['page']) ? $_GET['page'] : '';
danielebarchiesi@0 602 if ($new_page = implode(',', pager_load_array($page_new[$element], $element, explode(',', $page)))) {
danielebarchiesi@0 603 $parameters['page'] = $new_page;
danielebarchiesi@0 604 }
danielebarchiesi@0 605
danielebarchiesi@0 606 $query = array();
danielebarchiesi@0 607 if (count($parameters)) {
danielebarchiesi@0 608 $query = drupal_get_query_parameters($parameters, array());
danielebarchiesi@0 609 }
danielebarchiesi@0 610 if ($query_pager = pager_get_query_parameters()) {
danielebarchiesi@0 611 $query = array_merge($query, $query_pager);
danielebarchiesi@0 612 }
danielebarchiesi@0 613
danielebarchiesi@0 614 // Set each pager link title
danielebarchiesi@0 615 if (!isset($attributes['title'])) {
danielebarchiesi@0 616 static $titles = NULL;
danielebarchiesi@0 617 if (!isset($titles)) {
danielebarchiesi@0 618 $titles = array(
danielebarchiesi@0 619 t('« first') => t('Go to first page'),
danielebarchiesi@0 620 t('‹ previous') => t('Go to previous page'),
danielebarchiesi@0 621 t('next ›') => t('Go to next page'),
danielebarchiesi@0 622 t('last »') => t('Go to last page'),
danielebarchiesi@0 623 );
danielebarchiesi@0 624 }
danielebarchiesi@0 625 if (isset($titles[$text])) {
danielebarchiesi@0 626 $attributes['title'] = $titles[$text];
danielebarchiesi@0 627 }
danielebarchiesi@0 628 elseif (is_numeric($text)) {
danielebarchiesi@0 629 $attributes['title'] = t('Go to page @number', array('@number' => $text));
danielebarchiesi@0 630 }
danielebarchiesi@0 631 }
danielebarchiesi@0 632
danielebarchiesi@0 633 // @todo l() cannot be used here, since it adds an 'active' class based on the
danielebarchiesi@0 634 // path only (which is always the current path for pager links). Apparently,
danielebarchiesi@0 635 // none of the pager links is active at any time - but it should still be
danielebarchiesi@0 636 // possible to use l() here.
danielebarchiesi@0 637 // @see http://drupal.org/node/1410574
danielebarchiesi@0 638 $attributes['href'] = url($_GET['q'], array('query' => $query));
danielebarchiesi@0 639 return '<a' . drupal_attributes($attributes) . '>' . check_plain($text) . '</a>';
danielebarchiesi@0 640 }
danielebarchiesi@0 641
danielebarchiesi@0 642 /**
danielebarchiesi@0 643 * @} End of "Pager pieces".
danielebarchiesi@0 644 */
danielebarchiesi@0 645
danielebarchiesi@0 646 /**
danielebarchiesi@0 647 * Helper function
danielebarchiesi@0 648 *
danielebarchiesi@0 649 * Copies $old_array to $new_array and sets $new_array[$element] = $value
danielebarchiesi@0 650 * Fills in $new_array[0 .. $element - 1] = 0
danielebarchiesi@0 651 */
danielebarchiesi@0 652 function pager_load_array($value, $element, $old_array) {
danielebarchiesi@0 653 $new_array = $old_array;
danielebarchiesi@0 654 // Look for empty elements.
danielebarchiesi@0 655 for ($i = 0; $i < $element; $i++) {
danielebarchiesi@0 656 if (empty($new_array[$i])) {
danielebarchiesi@0 657 // Load found empty element with 0.
danielebarchiesi@0 658 $new_array[$i] = 0;
danielebarchiesi@0 659 }
danielebarchiesi@0 660 }
danielebarchiesi@0 661 // Update the changed element.
danielebarchiesi@0 662 $new_array[$element] = (int) $value;
danielebarchiesi@0 663 return $new_array;
danielebarchiesi@0 664 }