pagination.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <?php
  2. namespace Grav\Plugin;
  3. use Grav\Common\Page\Collection;
  4. use Grav\Common\Page\Page;
  5. use Grav\Common\Plugin;
  6. use RocketTheme\Toolbox\Event\Event;
  7. class PaginationPlugin extends Plugin
  8. {
  9. /**
  10. * @var PaginationHelper
  11. */
  12. protected $pagination;
  13. /**
  14. * @return array
  15. */
  16. public static function getSubscribedEvents()
  17. {
  18. return [
  19. 'onPluginsInitialized' => ['onPluginsInitialized', 0]
  20. ];
  21. }
  22. /**
  23. * Initialize configuration
  24. */
  25. public function onPluginsInitialized()
  26. {
  27. if ($this->isAdmin()) {
  28. $this->active = false;
  29. return;
  30. }
  31. $this->enable([
  32. 'onTwigTemplatePaths' => ['onTwigTemplatePaths', 0],
  33. 'onPageInitialized' => ['onPageInitialized', 0],
  34. 'onTwigExtensions' => ['onTwigExtensions', 0]
  35. ]);
  36. }
  37. /**
  38. * Add current directory to twig lookup paths.
  39. */
  40. public function onTwigTemplatePaths()
  41. {
  42. $this->grav['twig']->twig_paths[] = __DIR__ . '/templates';
  43. }
  44. /**
  45. * Add Twig Extensions
  46. */
  47. public function onTwigExtensions()
  48. {
  49. require_once(__DIR__.'/twig/PaginationTwigExtension.php');
  50. $this->grav['twig']->twig->addExtension(new PaginationTwigExtension());
  51. }
  52. /**
  53. * Enable pagination if page has params.pagination = true.
  54. */
  55. public function onPageInitialized()
  56. {
  57. /** @var Page $page */
  58. $page = $this->grav['page'];
  59. if ($page && ($page->value('header.content.pagination') || $page->value('header.pagination'))) {
  60. $this->enable([
  61. 'onCollectionProcessed' => ['onCollectionProcessed', 0],
  62. 'onTwigSiteVariables' => ['onTwigSiteVariables', 0]
  63. ]);
  64. $template = $this->grav['uri']->param('tmpl');
  65. if ($template) {
  66. $page->template($template);
  67. }
  68. }
  69. }
  70. /**
  71. * Create pagination object for the page.
  72. *
  73. * @param Event $event
  74. */
  75. public function onCollectionProcessed(Event $event)
  76. {
  77. /** @var Collection $collection */
  78. $collection = $event['collection'];
  79. $params = $collection->params();
  80. // Only add pagination if it has been enabled for the collection.
  81. if (empty($params['pagination'])) {
  82. return;
  83. }
  84. if (!empty($params['limit']) && $collection->count() > $params['limit']) {
  85. require_once __DIR__ . '/classes/paginationhelper.php';
  86. $this->pagination = new PaginationHelper($collection);
  87. $collection->setParams(['pagination' => $this->pagination]);
  88. }
  89. }
  90. /**
  91. * Set needed variables to display pagination.
  92. */
  93. public function onTwigSiteVariables()
  94. {
  95. if ($this->config->get('plugins.pagination.built_in_css')) {
  96. $this->grav['assets']->add('plugin://pagination/css/pagination.css');
  97. }
  98. }
  99. /**
  100. * pagination
  101. *
  102. * @param Collection $collection
  103. * @param int $limit
  104. * @param array $ignore_param_array url parameters to be ignored in page links
  105. */
  106. public function paginateCollection( $collection, $limit, $ignore_param_array = [])
  107. {
  108. $collection->setParams(['pagination' => 'true']);
  109. $collection->setParams(['limit' => $limit]);
  110. $collection->setParams(['ignore_params' => $ignore_param_array]);
  111. if ($collection->count() > $limit) {
  112. require_once __DIR__ . '/classes/paginationhelper.php';
  113. $this->pagination = new PaginationHelper($collection);
  114. $collection->setParams(['pagination' => $this->pagination]);
  115. $uri = $this->grav['uri'];
  116. $start = ($uri->currentPage() - 1) * $limit;
  117. if ($limit && $collection->count() > $limit) {
  118. $collection->slice($start, $limit);
  119. }
  120. }
  121. }
  122. }