diff --git a/src/Resource/ViewsResource.php b/src/Resource/ViewsResource.php index acb0d88..7a5f631 100644 --- a/src/Resource/ViewsResource.php +++ b/src/Resource/ViewsResource.php @@ -2,6 +2,7 @@ namespace Drupal\jsonapi_views\Resource; +use Drupal\Core\Cache\CacheableMetadata; use Drupal\jsonapi\ResourceResponse; use Drupal\jsonapi_resources\Resource\EntityResourceBase; use Drupal\Core\Render\RenderContext; @@ -9,6 +10,9 @@ use Drupal\Core\Render\BubbleableMetadata; use Drupal\views\ViewExecutable; use Drupal\views\ResultRow; use Symfony\Component\HttpFoundation\Request; +use Drupal\Core\Url; +use Drupal\jsonapi\JsonApiResource\Link; +use Drupal\jsonapi\JsonApiResource\LinkCollection; /** * Processes a request for a collection of featured nodes. @@ -93,14 +97,64 @@ final class ViewsResource extends EntityResourceBase { return $row->_entity; }, $view->result); $data = $this->createCollectionDataFromEntities($entities); + $pagination_links = $this->getViewsPager($view); - // @TODO: Build pagination links from the views pager object. - // $pagination_links = ???? - $response = $this->createJsonapiResponse($data, $request, 200, [] /* , $pagination_links */); + $response = $this->createJsonapiResponse($data, $request, 200, [], $pagination_links); if (isset($bubbleable_metadata)) { $response->addCacheableDependency($bubbleable_metadata); } return $response; } + /** + * Get views pager. + * + * @param ViewExecutable $view + * View executable. + * + * @return LinkCollection + * Navigation links. + */ + public function getViewsPager(ViewExecutable $view) : LinkCollection { + $pager_links = new LinkCollection([]); + /* @var $pager_manager \Drupal\Core\Pager\PagerManagerInterface */ + $pager_manager = \Drupal::service('pager.manager'); + $element = $view->pager->getPagerId(); + $pager = $pager_manager->getPager($element); + $parameters = isset($view->exposed_raw_input) ? $view->exposed_raw_input : NULL; + + $pager_max = $pager->getTotalPages(); + + $current = $pager->getCurrentPage(); + $total = $pager->getTotalPages(); + + if ($total > 1 && $current > 0) { + $options = [ + 'query' => $pager_manager->getUpdatedParameters($parameters, $element, 0), + ]; + $first = Url::fromRoute('', [], $options); + $pager_links = $pager_links->withLink('first', new Link(new CacheableMetadata(), $first, 'first')); + $options = [ + 'query' => $pager_manager->getUpdatedParameters($parameters, $element, $current - 1), + ]; + $prev = Url::fromRoute('', [], $options); + $pager_links = $pager_links->withLink('prev', new Link(new CacheableMetadata(), $prev, 'prev')); + } + + if ($current < ($total - 1)) { + $options = [ + 'query' => $pager_manager->getUpdatedParameters($parameters, $element, $current + 1), + ]; + $next = Url::fromRoute('', [], $options); + $pager_links = $pager_links->withLink('next', new Link(new CacheableMetadata(), $next, 'next')); + $options = [ + 'query' => $pager_manager->getUpdatedParameters($parameters, $element, $pager_max - 1), + ]; + $next = Url::fromRoute('', [], $options); + $pager_links = $pager_links->withLink('last', new Link(new CacheableMetadata(), $next, 'last')); + } + + return $pager_links; + } + }