]> git.immae.eu Git - github/shaarli/Shaarli.git/commitdiff
Merge pull request #1697 from ArthurHoaro/feature/pagination
authorArthurHoaro <arthur@hoa.ro>
Thu, 4 Feb 2021 09:57:44 +0000 (10:57 +0100)
committerGitHub <noreply@github.com>
Thu, 4 Feb 2021 09:57:44 +0000 (10:57 +0100)
Handle pagination through BookmarkService

1  2 
application/front/controller/visitor/BookmarkListController.php

index 106440b6f63dfa62617ee2114036e3722be280e8,321ca813b5cf0baffaa85180322d0ff167235d24..4aae26528430cf1e106b2cfde0d2f76e9a9dc7b7
@@@ -33,11 -33,9 +33,10 @@@ class BookmarkListController extends Sh
  
          $formatter = $this->container->formatterFactory->getFormatter();
          $formatter->addContextData('base_path', $this->container->basePath);
 +        $formatter->addContextData('index_url', index_url($this->container->environment));
  
          $searchTags = normalize_spaces($request->getParam('searchtags') ?? '');
          $searchTerm = escape(normalize_spaces($request->getParam('searchterm') ?? ''));
-         ;
  
          // Filter bookmarks according search parameters.
          $visibility = $this->container->sessionManager->getSessionParameter('visibility');
              'searchtags' => $searchTags,
              'searchterm' => $searchTerm,
          ];
-         $linksToDisplay = $this->container->bookmarkService->search(
-             $search,
-             $visibility,
-             false,
-             !!$this->container->sessionManager->getSessionParameter('untaggedonly')
-         ) ?? [];
-         // ---- Handle paging.
-         $keys = [];
-         foreach ($linksToDisplay as $key => $value) {
-             $keys[] = $key;
-         }
-         $linksPerPage = $this->container->sessionManager->getSessionParameter('LINKS_PER_PAGE', 20) ?: 20;
  
          // Select articles according to paging.
-         $pageCount = (int) ceil(count($keys) / $linksPerPage) ?: 1;
-         $page = (int) $request->getParam('page') ?? 1;
+         $page = (int) ($request->getParam('page') ?? 1);
          $page = $page < 1 ? 1 : $page;
-         $page = $page > $pageCount ? $pageCount : $page;
+         $linksPerPage = $this->container->sessionManager->getSessionParameter('LINKS_PER_PAGE', 20) ?: 20;
  
-         // Start index.
-         $i = ($page - 1) * $linksPerPage;
-         $end = $i + $linksPerPage;
+         $searchResult = $this->container->bookmarkService->search(
+             $search,
+             $visibility,
+             false,
+             !!$this->container->sessionManager->getSessionParameter('untaggedonly'),
+             false,
+             ['offset' => $linksPerPage * ($page - 1), 'limit' => $linksPerPage]
+         ) ?? [];
  
-         $linkDisp = [];
          $save = false;
-         while ($i < $end && $i < count($keys)) {
-             $save = $this->updateThumbnail($linksToDisplay[$keys[$i]], false) || $save;
-             $link = $formatter->format($linksToDisplay[$keys[$i]]);
-             $linkDisp[$keys[$i]] = $link;
-             $i++;
+         $links = [];
+         foreach ($searchResult->getBookmarks() as $key => $bookmark) {
+             $save = $this->updateThumbnail($bookmark, false) || $save;
+             $links[$key] = $formatter->format($bookmark);
          }
  
          if ($save) {
          // Compute paging navigation
          $searchtagsUrl = $searchTags === '' ? '' : '&searchtags=' . urlencode($searchTags);
          $searchtermUrl = $searchTerm === '' ? '' : '&searchterm=' . urlencode($searchTerm);
+         $page = $searchResult->getPage();
  
-         $previous_page_url = '';
-         if ($i !== count($keys)) {
-             $previous_page_url = '?page=' . ($page + 1) . $searchtermUrl . $searchtagsUrl;
-         }
-         $next_page_url = '';
-         if ($page > 1) {
-             $next_page_url = '?page=' . ($page - 1) . $searchtermUrl . $searchtagsUrl;
-         }
+         $previousPageUrl = !$searchResult->isLastPage() ? '?page=' . ($page + 1) . $searchtermUrl . $searchtagsUrl : '';
+         $nextPageUrl = !$searchResult->isFirstPage() ? '?page=' . ($page - 1) . $searchtermUrl . $searchtagsUrl : '';
  
          $tagsSeparator = $this->container->conf->get('general.tags_separator', ' ');
          $searchTagsUrlEncoded = array_map('urlencode', tags_str2array($searchTags, $tagsSeparator));
          $data = array_merge(
              $this->initializeTemplateVars(),
              [
-                 'previous_page_url' => $previous_page_url,
-                 'next_page_url' => $next_page_url,
+                 'previous_page_url' => $previousPageUrl,
+                 'next_page_url' => $nextPageUrl,
                  'page_current' => $page,
-                 'page_max' => $pageCount,
-                 'result_count' => count($linksToDisplay),
+                 'page_max' => $searchResult->getLastPage(),
+                 'result_count' => $searchResult->getTotalCount(),
                  'search_term' => escape($searchTerm),
                  'search_tags' => escape($searchTags),
                  'search_tags_url' => $searchTagsUrlEncoded,
                  'visibility' => $visibility,
-                 'links' => $linkDisp,
+                 'links' => $links,
              ]
          );
  
  
          $formatter = $this->container->formatterFactory->getFormatter();
          $formatter->addContextData('base_path', $this->container->basePath);
 +        $formatter->addContextData('index_url', index_url($this->container->environment));
  
          $data = array_merge(
              $this->initializeTemplateVars(),