Verzeichnisstruktur phpBB-3.1.0


Veröffentlicht
27.10.2014

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

pagination.php

Zuletzt modifiziert: 09.10.2024, 12:51 - Dateigröße: 14.38 KiB


 001  <?php
 002  /**
 003  *
 004  * This file is part of the phpBB Forum Software package.
 005  *
 006  * @copyright (c) phpBB Limited <https://www.phpbb.com>
 007  * @license GNU General Public License, version 2 (GPL-2.0)
 008  *
 009  * For full copyright and license information, please see
 010  * the docs/CREDITS.txt file.
 011  *
 012  */
 013   
 014  namespace phpbb;
 015   
 016  class pagination
 017  {
 018      /** @var \phpbb\template\template */
 019      protected $template;
 020   
 021      /** @var \phpbb\user */
 022      protected $user;
 023   
 024      /** @var \phpbb\controller\helper */
 025      protected $helper;
 026   
 027      /** @var \phpbb\event\dispatcher_interface */
 028      protected $phpbb_dispatcher;
 029   
 030      /**
 031      * Constructor
 032      *
 033      * @param    \phpbb\template\template            $template
 034      * @param    \phpbb\user                            $user
 035      * @param    \phpbb\controller\helper            $helper
 036      * @param    \phpbb\event\dispatcher_interface    $phpbb_dispatcher
 037      */
 038      public function __construct(\phpbb\template\template $template, \phpbb\user $user, \phpbb\controller\helper $helper, \phpbb\event\dispatcher_interface $phpbb_dispatcher)
 039      {
 040          $this->template = $template;
 041          $this->user = $user;
 042          $this->helper = $helper;
 043          $this->phpbb_dispatcher = $phpbb_dispatcher;
 044      }
 045   
 046      /**
 047      * Generate a pagination link based on the url and the page information
 048      *
 049      * @param string $base_url is url prepended to all links generated within the function
 050      *                            If you use page numbers inside your controller route, base_url should contains a placeholder (%d)
 051      *                            for the page. Also be sure to specify the pagination path information into the start_name argument
 052      * @param string $on_page is the page for which we want to generate the link
 053      * @param string $start_name is the name of the parameter containing the first item of the given page (example: start=20)
 054      *                            If you use page numbers inside your controller route, start name should be the string
 055      *                            that should be removed for the first page (example: /page/%d)
 056      * @param int $per_page the number of items, posts, etc. to display per page, used to determine the number of pages to produce
 057      * @return string URL for the requested page
 058      */
 059      protected function generate_page_link($base_url, $on_page, $start_name, $per_page)
 060      {
 061          // A listener can set this variable to the new pagination URL
 062          // to override the generate_page_link() function generated value
 063          $generate_page_link_override = false;
 064   
 065          /**
 066          * Execute code and/or override generate_page_link()
 067          *
 068          * To override the generate_page_link() function generated value
 069          * set $generate_page_link_override to the new URL value
 070          *
 071          * @event core.pagination_generate_page_link
 072          * @var string base_url is url prepended to all links generated within the function
 073          *                            If you use page numbers inside your controller route, base_url should contains a placeholder (%d)
 074          *                            for the page. Also be sure to specify the pagination path information into the start_name argument
 075          * @var string on_page is the page for which we want to generate the link
 076          * @var string start_name is the name of the parameter containing the first item of the given page (example: start=20)
 077          *                            If you use page numbers inside your controller route, start name should be the string
 078          *                            that should be removed for the first page (example: /page/%d)
 079          * @var int per_page the number of items, posts, etc. to display per page, used to determine the number of pages to produce
 080          * @var bool|string generate_page_link_override Shall we return custom pagination link (string URL) or not (false)
 081          * @since 3.1.0-RC5
 082          */
 083          $vars = array('base_url', 'on_page', 'start_name', 'per_page', 'generate_page_link_override');
 084          extract($this->phpbb_dispatcher->trigger_event('core.pagination_generate_page_link', compact($vars)));
 085   
 086          if ($generate_page_link_override)
 087          {
 088              return $generate_page_link_override;
 089          }
 090   
 091          if (!is_string($base_url))
 092          {
 093              if (is_array($base_url['routes']))
 094              {
 095                  $route = ($on_page > 1) ? $base_url['routes'][1] : $base_url['routes'][0];
 096              }
 097              else
 098              {
 099                  $route = $base_url['routes'];
 100              }
 101              $params = (isset($base_url['params'])) ? $base_url['params'] : array();
 102              $is_amp = (isset($base_url['is_amp'])) ? $base_url['is_amp'] : true;
 103              $session_id = (isset($base_url['session_id'])) ? $base_url['session_id'] : false;
 104   
 105              if ($on_page > 1 || !is_array($base_url['routes']))
 106              {
 107                  $params[$start_name] = (int) $on_page;
 108              }
 109   
 110              return $this->helper->route($route, $params, $is_amp, $session_id);
 111          }
 112          else
 113          {
 114              $url_delim = (strpos($base_url, '?') === false) ? '?' : ((strpos($base_url, '?') === strlen($base_url) - 1) ? '' : '&amp;');
 115              return ($on_page > 1) ? $base_url . $url_delim . $start_name . '=' . (($on_page - 1) * $per_page) : $base_url;
 116          }
 117      }
 118   
 119      /**
 120      * Generate template rendered pagination
 121      * Allows full control of rendering of pagination with the template
 122      *
 123      * @param string $base_url is url prepended to all links generated within the function
 124      *                            If you use page numbers inside your controller route, base_url should contains a placeholder (%d)
 125      *                            for the page. Also be sure to specify the pagination path information into the start_name argument
 126      * @param string $block_var_name is the name assigned to the pagination data block within the template (example: <!-- BEGIN pagination -->)
 127      * @param string $start_name is the name of the parameter containing the first item of the given page (example: start=20)
 128      *                            If you use page numbers inside your controller route, start name should be the string
 129      *                            that should be removed for the first page (example: /page/%d)
 130      * @param int $num_items the total number of items, posts, etc., used to determine the number of pages to produce
 131      * @param int $per_page the number of items, posts, etc. to display per page, used to determine the number of pages to produce
 132      * @param int $start the item which should be considered currently active, used to determine the page we're on
 133      * @param bool $reverse_count determines whether we weight display of the list towards the start (false) or end (true) of the list
 134      * @param bool $ignore_on_page decides whether we enable an active (unlinked) item, used primarily for embedded lists
 135      * @return null
 136      */
 137      public function generate_template_pagination($base_url, $block_var_name, $start_name, $num_items, $per_page, $start = 1, $reverse_count = false, $ignore_on_page = false)
 138      {
 139          $total_pages = ceil($num_items / $per_page);
 140          $on_page = $this->get_on_page($per_page, $start);
 141          $u_previous_page = $u_next_page = '';
 142   
 143          if ($total_pages > 1)
 144          {
 145              if ($reverse_count)
 146              {
 147                  $start_page = ($total_pages > 5) ? $total_pages - 4 : 1;
 148                  $end_page = $total_pages;
 149              }
 150              else
 151              {
 152                  // What we're doing here is calculating what the "start" and "end" pages should be. We
 153                  // do this by assuming pagination is "centered" around the currently active page with
 154                  // the three previous and three next page links displayed. Anything more than that and
 155                  // we display the ellipsis, likewise anything less.
 156                  //
 157                  // $start_page is the page at which we start creating the list. When we have five or less
 158                  // pages we start at page 1 since there will be no ellipsis displayed. Anymore than that
 159                  // and we calculate the start based on the active page. This is the min/max calculation.
 160                  // First (max) would we end up starting on a page less than 1? Next (min) would we end
 161                  // up starting so close to the end that we'd not display our minimum number of pages.
 162                  //
 163                  // $end_page is the last page in the list to display. Like $start_page we use a min/max to
 164                  // determine this number. Again at most five pages? Then just display them all. More than
 165                  // five and we first (min) determine whether we'd end up listing more pages than exist.
 166                  // We then (max) ensure we're displaying the minimum number of pages.
 167                  $start_page = ($total_pages > 5) ? min(max(1, $on_page - 2), $total_pages - 4) : 1;
 168                  $end_page = ($total_pages > 5) ? max(min($total_pages, $on_page + 2), 5) : $total_pages;
 169              }
 170   
 171              if ($on_page != 1)
 172              {
 173                  $u_previous_page = $this->generate_page_link($base_url, $on_page - 1, $start_name, $per_page);
 174   
 175                  $this->template->assign_block_vars($block_var_name, array(
 176                      'PAGE_NUMBER'    => '',
 177                      'PAGE_URL'        => $u_previous_page,
 178                      'S_IS_CURRENT'    => false,
 179                      'S_IS_PREV'        => true,
 180                      'S_IS_NEXT'        => false,
 181                      'S_IS_ELLIPSIS'    => false,
 182                  ));
 183              }
 184   
 185              // This do...while exists purely to negate the need for start and end assign_block_vars, i.e.
 186              // to display the first and last page in the list plus any ellipsis. We use this loop to jump
 187              // around a little within the list depending on where we're starting (and ending).
 188              $at_page = 1;
 189              do
 190              {
 191                  // We decide whether to display the ellipsis during the loop. The ellipsis is always
 192                  // displayed as either the second or penultimate item in the list. So are we at either
 193                  // of those points and of course do we even need to display it, i.e. is the list starting
 194                  // on at least page 3 and ending three pages before the final item.
 195                  $this->template->assign_block_vars($block_var_name, array(
 196                      'PAGE_NUMBER'    => $at_page,
 197                      'PAGE_URL'        => $this->generate_page_link($base_url, $at_page, $start_name, $per_page),
 198                      'S_IS_CURRENT'    => (!$ignore_on_page && $at_page == $on_page),
 199                      'S_IS_NEXT'        => false,
 200                      'S_IS_PREV'        => false,
 201                      'S_IS_ELLIPSIS'    => ($at_page == 2 && $start_page > 2) || ($at_page == $total_pages - 1 && $end_page < $total_pages - 1),
 202                  ));
 203   
 204                  // We may need to jump around in the list depending on whether we have or need to display
 205                  // the ellipsis. Are we on page 2 and are we more than one page away from the start
 206                  // of the list? Yes? Then we jump to the start of the list. Likewise are we at the end of
 207                  // the list and are there more than two pages left in total? Yes? Then jump to the penultimate
 208                  // page (so we can display the ellipsis next pass). Else, increment the counter and keep
 209                  // going
 210                  if ($at_page == 2 && $at_page < $start_page - 1)
 211                  {
 212                      $at_page = $start_page;
 213                  }
 214                  else if ($at_page == $end_page && $end_page < $total_pages - 1)
 215                  {
 216                      $at_page = $total_pages - 1;
 217                  }
 218                  else
 219                  {
 220                      $at_page++;
 221                  }
 222              }
 223              while ($at_page <= $total_pages);
 224   
 225              if ($on_page != $total_pages)
 226              {
 227                  $u_next_page = $this->generate_page_link($base_url, $on_page + 1, $start_name, $per_page);
 228   
 229                  $this->template->assign_block_vars($block_var_name, array(
 230                      'PAGE_NUMBER'    => '',
 231                      'PAGE_URL'        => $u_next_page,
 232                      'S_IS_CURRENT'    => false,
 233                      'S_IS_PREV'        => false,
 234                      'S_IS_NEXT'        => true,
 235                      'S_IS_ELLIPSIS'    => false,
 236                  ));
 237              }
 238          }
 239   
 240          // If the block_var_name is a nested block, we will use the last (most
 241          // inner) block as a prefix for the template variables. If the last block
 242          // name is pagination, the prefix is empty. If the rest of the
 243          // block_var_name is not empty, we will modify the last row of that block
 244          // and add our pagination items.
 245          $tpl_block_name = $tpl_prefix = '';
 246          if (strrpos($block_var_name, '.') !== false)
 247          {
 248              $tpl_block_name = substr($block_var_name, 0, strrpos($block_var_name, '.'));
 249              $tpl_prefix = strtoupper(substr($block_var_name, strrpos($block_var_name, '.') + 1));
 250          }
 251          else
 252          {
 253              $tpl_prefix = strtoupper($block_var_name);
 254          }
 255          $tpl_prefix = ($tpl_prefix == 'PAGINATION') ? '' : $tpl_prefix . '_';
 256   
 257          $template_array = array(
 258              $tpl_prefix . 'BASE_URL'        => is_string($base_url) ? $base_url : '',//@todo: Fix this for routes
 259              $tpl_prefix . 'START_NAME'        => $start_name,
 260              $tpl_prefix . 'PER_PAGE'        => $per_page,
 261              'U_' . $tpl_prefix . 'PREVIOUS_PAGE'    => ($on_page != 1) ? $u_previous_page : '',
 262              'U_' . $tpl_prefix . 'NEXT_PAGE'        => ($on_page != $total_pages) ? $u_next_page : '',
 263              $tpl_prefix . 'TOTAL_PAGES'        => $total_pages,
 264              $tpl_prefix . 'CURRENT_PAGE'    => $on_page,
 265              $tpl_prefix . 'PAGE_NUMBER'        => $this->on_page($num_items, $per_page, $start),
 266          );
 267   
 268          if ($tpl_block_name)
 269          {
 270              $this->template->alter_block_array($tpl_block_name, $template_array, true, 'change');
 271          }
 272          else
 273          {
 274              $this->template->assign_vars($template_array);
 275          }
 276      }
 277   
 278      /**
 279      * Get current page number
 280      *
 281      * @param int $per_page the number of items, posts, etc. per page
 282      * @param int $start the item which should be considered currently active, used to determine the page we're on
 283      * @return int    Current page number
 284      */
 285      public function get_on_page($per_page, $start)
 286      {
 287          return floor($start / $per_page) + 1;
 288      }
 289   
 290      /**
 291      * Return current page
 292      *
 293      * @param int $num_items the total number of items, posts, topics, etc.
 294      * @param int $per_page the number of items, posts, etc. per page
 295      * @param int $start the item which should be considered currently active, used to determine the page we're on
 296      * @return string Descriptive pagination string (e.g. "page 1 of 10")
 297      */
 298      public function on_page($num_items, $per_page, $start)
 299      {
 300          $on_page = $this->get_on_page($per_page, $start);
 301          return $this->user->lang('PAGE_OF', $on_page, max(ceil($num_items / $per_page), 1));
 302      }
 303   
 304      /**
 305      * Get current page number
 306      *
 307      * @param int $start the item which should be considered currently active, used to determine the page we're on
 308      * @param int $per_page the number of items, posts, etc. per page
 309      * @param int $num_items the total number of items, posts, topics, etc.
 310      * @return int    Current page number
 311      */
 312      public function validate_start($start, $per_page, $num_items)
 313      {
 314          if ($start < 0 || $start >= $num_items)
 315          {
 316              return ($start < 0 || $num_items <= 0) ? 0 : floor(($num_items - 1) / $per_page) * $per_page;
 317          }
 318   
 319          return $start;
 320      }
 321   
 322      /**
 323      * Get new start when searching from the end
 324      *
 325      * If the user is trying to reach late pages, start searching from the end.
 326      *
 327      * @param int $start the item which should be considered currently active, used to determine the page we're on
 328      * @param int $limit the number of items, posts, etc. to display
 329      * @param int $num_items the total number of items, posts, topics, etc.
 330      * @return int    Current page number
 331      */
 332      public function reverse_start($start, $limit, $num_items)
 333      {
 334          return max(0, $num_items - $limit - $start);
 335      }
 336   
 337      /**
 338      * Get new item limit when searching from the end
 339      *
 340      * If the user is trying to reach late pages, start searching from the end.
 341      * In this case the items to display might be lower then the actual per_page setting.
 342      *
 343      * @param int $start the item which should be considered currently active, used to determine the page we're on
 344      * @param int $per_page the number of items, posts, etc. per page
 345      * @param int $num_items the total number of items, posts, topics, etc.
 346      * @return int    Current page number
 347      */
 348      public function reverse_limit($start, $per_page, $num_items)
 349      {
 350          if ($start + $per_page > $num_items)
 351          {
 352              return min($per_page, max(1, $num_items - $start));
 353          }
 354   
 355          return $per_page;
 356      }
 357  }
 358