]> git.mxchange.org Git - friendica.git/blobdiff - src/Content/Pager.php
Show only the user's categories on their profile
[friendica.git] / src / Content / Pager.php
index 098d8e87960d4c828511cbdff5e897b770558cd6..bf5a5f691442032346a97ee0e9eda73efcb70375 100644 (file)
@@ -1,44 +1,64 @@
 <?php
+/**
+ * @copyright Copyright (C) 2010-2022, the Friendica project
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
 
 namespace Friendica\Content;
 
 use Friendica\Core\L10n;
 use Friendica\Core\Renderer;
+use Friendica\Util\Strings;
 
 /**
  * The Pager has two very different output, Minimal and Full, see renderMinimal() and renderFull() for more details.
- *
- * @author Hypolite Petovan <mrpetovan@gmail.com>
  */
 class Pager
 {
-       /**
-        * @var integer
-        */
+       /** @var int Default count of items per page */
+       const ITEMS_PER_PAGE = 50;
+
+       /** @var integer */
        private $page = 1;
-       /**
-        * @var integer
-        */
-       private $itemsPerPage = 50;
+       /** @var integer */
+       protected $itemsPerPage = self::ITEMS_PER_PAGE;
+       /** @var string */
+       protected $baseQueryString = '';
 
-       /**
-        * @var string
-        */
-       private $baseQueryString = '';
+       /** @var L10n */
+       protected $l10n;
 
        /**
         * Instantiates a new Pager with the base parameters.
         *
         * Guesses the page number from the GET parameter 'page'.
         *
+        * @param L10n    $l10n
         * @param string  $queryString  The query string of the current page
         * @param integer $itemsPerPage An optional number of items per page to override the default value
         */
-       public function __construct($queryString, $itemsPerPage = 50)
+       public function __construct(L10n $l10n, $queryString, $itemsPerPage = 50)
        {
+               $this->l10n = $l10n;
+
                $this->setQueryString($queryString);
                $this->setItemsPerPage($itemsPerPage);
-               $this->setPage(defaults($_GET, 'page', 1));
+               $this->setPage(($_GET['page'] ?? 0) ?: 1);
        }
 
        /**
@@ -64,7 +84,7 @@ class Pager
        /**
         * Returns the current page number
         *
-        * @return type
+        * @return int
         */
        public function getPage()
        {
@@ -82,7 +102,7 @@ class Pager
         */
        public function getBaseQueryString()
        {
-               return $this->baseQueryString;
+               return Strings::ensureQueryParameter($this->baseQueryString);
        }
 
        /**
@@ -108,7 +128,7 @@ class Pager
        /**
         * Sets the base query string from a full query string.
         *
-        * Strips the 'page' parameter, and remove the 'q=' string for some reason.
+        * Strips the 'page' parameter
         *
         * @param string $queryString
         */
@@ -116,29 +136,13 @@ class Pager
        {
                $stripped = preg_replace('/([&?]page=[0-9]*)/', '', $queryString);
 
-               $stripped = str_replace('q=', '', $stripped);
                $stripped = trim($stripped, '/');
 
                $this->baseQueryString = $stripped;
        }
 
        /**
-        * Ensures the provided URI has its query string punctuation in order.
-        *
-        * @param string $uri
-        * @return string
-        */
-       private function ensureQueryParameter($uri)
-       {
-               if (strpos($uri, '?') === false && ($pos = strpos($uri, '&')) !== false) {
-                       $uri = substr($uri, 0, $pos) . '?' . substr($uri, $pos + 1);
-               }
-
-               return $uri;
-       }
-
-       /**
-        * @brief Minimal pager (newer/older)
+        * Minimal pager (newer/older)
         *
         * This mode is intended for reverse chronological pages and presents only two links, newer (previous) and older (next).
         * The itemCount is the number of displayed items. If no items are displayed, the older button is disabled.
@@ -152,24 +156,25 @@ class Pager
         *
         * $html = $pager->renderMinimal(count($items));
         *
-        * @param integer $itemCount The number of displayed items on the page
+        * @param int $itemCount The number of displayed items on the page
         * @return string HTML string of the pager
+        * @throws \Exception
         */
-       public function renderMinimal($itemCount)
+       public function renderMinimal(int $itemCount)
        {
                $displayedItemCount = max(0, intval($itemCount));
 
                $data = [
                        'class' => 'pager',
                        'prev'  => [
-                               'url'   => $this->ensureQueryParameter($this->baseQueryString . '&page=' . ($this->getPage() - 1)),
-                               'text'  => L10n::t('newer'),
+                               'url'   => Strings::ensureQueryParameter($this->baseQueryString . '&page=' . ($this->getPage() - 1)),
+                               'text'  => $this->l10n->t('newer'),
                                'class' => 'previous' . ($this->getPage() == 1 ? ' disabled' : '')
                        ],
                        'next'  => [
-                               'url'   => $this->ensureQueryParameter($this->baseQueryString . '&page=' . ($this->getPage() + 1)),
-                               'text'  => L10n::t('older'),
-                               'class' =>  'next' . ($displayedItemCount <= 0 ? ' disabled' : '')
+                               'url'   => Strings::ensureQueryParameter($this->baseQueryString . '&page=' . ($this->getPage() + 1)),
+                               'text'  => $this->l10n->t('older'),
+                               'class' =>  'next' . ($displayedItemCount < $this->getItemsPerPage() ? ' disabled' : '')
                        ]
                ];
 
@@ -178,7 +183,7 @@ class Pager
        }
 
        /**
-        * @brief Full pager (first / prev / 1 / 2 / ... / 14 / 15 / next / last)
+        * Full pager (first / prev / 1 / 2 / ... / 14 / 15 / next / last)
         *
         * This mode presents page numbers as well as first, previous, next and last links.
         * The itemCount is the total number of items including those not displayed.
@@ -196,6 +201,7 @@ class Pager
         *
         * @param integer $itemCount The total number of items including those note displayed on the page
         * @return string HTML string of the pager
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
        public function renderFull($itemCount)
        {
@@ -206,13 +212,13 @@ class Pager
                $data['class'] = 'pagination';
                if ($totalItemCount > $this->getItemsPerPage()) {
                        $data['first'] = [
-                               'url'   => $this->ensureQueryParameter($this->baseQueryString . '&page=1'),
-                               'text'  => L10n::t('first'),
+                               'url'   => Strings::ensureQueryParameter($this->baseQueryString . '&page=1'),
+                               'text'  => $this->l10n->t('first'),
                                'class' => $this->getPage() == 1 ? 'disabled' : ''
                        ];
                        $data['prev'] = [
-                               'url'   => $this->ensureQueryParameter($this->baseQueryString . '&page=' . ($this->getPage() - 1)),
-                               'text'  => L10n::t('prev'),
+                               'url'   => Strings::ensureQueryParameter($this->baseQueryString . '&page=' . ($this->getPage() - 1)),
+                               'text'  => $this->l10n->t('prev'),
                                'class' => $this->getPage() == 1 ? 'disabled' : ''
                        ];
 
@@ -238,7 +244,7 @@ class Pager
                                        ];
                                } else {
                                        $pages[$i] = [
-                                               'url'   => $this->ensureQueryParameter($this->baseQueryString . '&page=' . $i),
+                                               'url'   => Strings::ensureQueryParameter($this->baseQueryString . '&page=' . $i),
                                                'text'  => $i,
                                                'class' => 'n'
                                        ];
@@ -254,7 +260,7 @@ class Pager
                                        ];
                                } else {
                                        $pages[$i] = [
-                                               'url'   => $this->ensureQueryParameter($this->baseQueryString . '&page=' . $i),
+                                               'url'   => Strings::ensureQueryParameter($this->baseQueryString . '&page=' . $i),
                                                'text'  => $i,
                                                'class' => 'n'
                                        ];
@@ -266,13 +272,13 @@ class Pager
                        $lastpage = (($numpages > intval($numpages)) ? intval($numpages)+1 : $numpages);
 
                        $data['next'] = [
-                               'url'   => $this->ensureQueryParameter($this->baseQueryString . '&page=' . ($this->getPage() + 1)),
-                               'text'  => L10n::t('next'),
+                               'url'   => Strings::ensureQueryParameter($this->baseQueryString . '&page=' . ($this->getPage() + 1)),
+                               'text'  => $this->l10n->t('next'),
                                'class' => $this->getPage() == $lastpage ? 'disabled' : ''
                        ];
                        $data['last'] = [
-                               'url'   => $this->ensureQueryParameter($this->baseQueryString . '&page=' . $lastpage),
-                               'text'  => L10n::t('last'),
+                               'url'   => Strings::ensureQueryParameter($this->baseQueryString . '&page=' . $lastpage),
+                               'text'  => $this->l10n->t('last'),
                                'class' => $this->getPage() == $lastpage ? 'disabled' : ''
                        ];
                }