From f24e7123e651367990aa2d4a39b18c525dd33c5a Mon Sep 17 00:00:00 2001 From: Nathaniel Catchpole Date: Sat, 6 Jul 2013 16:27:11 +0100 Subject: [PATCH] Issue #1958470 by olli | yuriy.babenko: Fixed Division by zero in pager_default_initialize(). --- .../lib/Drupal/views/Plugin/views/pager/Mini.php | 6 +++--- .../views/Plugin/views/pager/PagerPluginBase.php | 3 +-- .../lib/Drupal/views/Plugin/views/query/Sql.php | 5 ++--- .../lib/Drupal/views/Tests/Plugin/MiniPagerTest.php | 9 ++++++++- .../test_views/views.view.test_mini_pager.yml | 13 +++++++++++++ 5 files changed, 27 insertions(+), 9 deletions(-) diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/pager/Mini.php b/core/modules/views/lib/Drupal/views/Plugin/views/pager/Mini.php index 39db31e2edd..acd16c015cb 100644 --- a/core/modules/views/lib/Drupal/views/Plugin/views/pager/Mini.php +++ b/core/modules/views/lib/Drupal/views/Plugin/views/pager/Mini.php @@ -57,7 +57,7 @@ class Mini extends SqlBase { // Don't query for the next page if we have a pager that has a limited // amount of pages. - if (empty($this->options['total_pages']) || ($this->getCurrentPage() < $this->options['total_pages'])) { + if ($this->getItemsPerPage() > 0 && (empty($this->options['total_pages']) || ($this->getCurrentPage() < $this->options['total_pages']))) { // Increase the items in the query in order to be able to find out whether // there is another page. $limit = $this->view->query->getLimit(); @@ -79,7 +79,7 @@ class Mini extends SqlBase { public function postExecute(&$result) { // In query() one more item might have been retrieved than necessary. If so, // the next link needs to be displayed and the item removed. - if (count($result) > $this->getItemsPerPage()) { + if ($this->getItemsPerPage() > 0 && count($result) > $this->getItemsPerPage()) { array_pop($result); // Make sure the pager shows the next link by setting the total items to // the biggest possible number but prevent failing calculations like @@ -89,7 +89,7 @@ class Mini extends SqlBase { else { $total = $this->getCurrentPage() * $this->getItemsPerPage() + count($result); } - pager_default_initialize($total, $this->getItemsPerPage(), $this->options['id']); + $this->total_items = $total; } /** diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/pager/PagerPluginBase.php b/core/modules/views/lib/Drupal/views/Plugin/views/pager/PagerPluginBase.php index 9994cf5621e..fed8f5ab35d 100644 --- a/core/modules/views/lib/Drupal/views/Plugin/views/pager/PagerPluginBase.php +++ b/core/modules/views/lib/Drupal/views/Plugin/views/pager/PagerPluginBase.php @@ -183,13 +183,12 @@ abstract class PagerPluginBase extends PluginBase { $this->total_items -= $this->options['offset']; } - $this->updatePageInfo(); return $this->total_items; } /** * If there are pagers that need global values set, this method can - * be used to set them. It will be called when the count query is run. + * be used to set them. It will be called after the query is run. */ public function updatePageInfo() { diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/query/Sql.php b/core/modules/views/lib/Drupal/views/Plugin/views/query/Sql.php index 2ba6eb61b29..8162b2cf8ca 100644 --- a/core/modules/views/lib/Drupal/views/Plugin/views/query/Sql.php +++ b/core/modules/views/lib/Drupal/views/Plugin/views/query/Sql.php @@ -1431,9 +1431,8 @@ class Sql extends QueryPluginBase { } $view->pager->postExecute($view->result); - if ($view->pager->useCountQuery() || !empty($view->get_total_rows)) { - $view->total_rows = $view->pager->getTotalItems(); - } + $view->pager->updatePageInfo(); + $view->total_rows = $view->pager->getTotalItems(); // Load all entities contained in the results. $this->loadEntities($view->result); diff --git a/core/modules/views/lib/Drupal/views/Tests/Plugin/MiniPagerTest.php b/core/modules/views/lib/Drupal/views/Tests/Plugin/MiniPagerTest.php index b2accaed323..d76bf8525ed 100644 --- a/core/modules/views/lib/Drupal/views/Tests/Plugin/MiniPagerTest.php +++ b/core/modules/views/lib/Drupal/views/Tests/Plugin/MiniPagerTest.php @@ -91,6 +91,13 @@ class MiniPagerTest extends PluginTestBase { $this->assertText('‹‹'); $this->assertText($this->nodes[19]->label()); + $this->drupalGet('test_mini_pager_all'); + $this->assertNoText('‹‹ test', 'The previous link does not appear on the page.'); + $this->assertText('Page 1', 'The current page info shows the only page.'); + $this->assertNoText('test ››', 'The next link does not appear on the page.'); + $result = $this->xpath('//div[contains(@class, "views-row")]'); + $this->assertEqual(count($result), count($this->nodes), 'All rows appear on the page.'); + // Remove all items beside 1, so there should be no links shown. for ($i = 0; $i < 19; $i++) { $this->nodes[$i]->delete(); @@ -105,7 +112,7 @@ class MiniPagerTest extends PluginTestBase { $view = views_get_view('test_mini_pager'); $this->executeView($view); $this->assertIdentical($view->get_total_rows, NULL, 'The query was not forced to calculate the total number of results.'); - $this->assertIdentical($view->total_rows, NULL, 'The query did not return the total number of rows.'); + $this->assertIdentical($view->total_rows, 1, 'The pager calculated the total number of rows.'); } } diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_mini_pager.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_mini_pager.yml index cfc94792c78..484055c028c 100644 --- a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_mini_pager.yml +++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_mini_pager.yml @@ -98,6 +98,19 @@ display: type: mini options: items_per_page: '1' + page_3: + display_plugin: page + id: page_3 + display_title: Page + position: '' + display_options: + path: test_mini_pager_all + defaults: + pager: '0' + pager: + type: mini + options: + items_per_page: '0' base_field: nid status: '1' module: views