diff --git a/core/modules/views/src/ViewExecutable.php b/core/modules/views/src/ViewExecutable.php index 5e2d509..3ac4e17 100644 --- a/core/modules/views/src/ViewExecutable.php +++ b/core/modules/views/src/ViewExecutable.php @@ -587,9 +587,15 @@ public function getOffset() { * The pager offset. */ public function setOffset($offset) { - $this->element['#cache']['keys'][] = 'offset:' . $offset; + // Check whether the element is pre rendered. At that point, the cache keys + // cannot longer be manipulated. + if (empty($this->element['#pre_rendered'])) { + $this->element['#cache']['keys'][] = 'offset:' . $offset; + } + $this->offset = $offset; + // If the pager is already initialized, pass it through to the pager. if (!empty($this->pager)) { $this->pager->setOffset($offset); diff --git a/core/modules/views/tests/src/Unit/ViewExecutableTest.php b/core/modules/views/tests/src/Unit/ViewExecutableTest.php index fea412b..79281f0 100644 --- a/core/modules/views/tests/src/Unit/ViewExecutableTest.php +++ b/core/modules/views/tests/src/Unit/ViewExecutableTest.php @@ -469,4 +469,76 @@ protected function setupBaseViewAndDisplay() { return array($view, $display); } + public function testSetItemsPerPageBeforePreRender() { + /** @var \Drupal\views\ViewExecutable|\PHPUnit_Framework_MockObject_MockObject $view */ + /** @var \Drupal\views\Plugin\views\display\DisplayPluginBase|\PHPUnit_Framework_MockObject_MockObject $display */ + list($view, $display) = $this->setupBaseViewAndDisplay(); + + $view->setItemsPerPage(12); + $this->assertEquals(12, $view->getItemsPerPage()); + $this->assertContains('items_per_page:12', $view->element['#cache']['keys']); + } + + public function testSetItemsPerPageDuringPreRender() { + /** @var \Drupal\views\ViewExecutable|\PHPUnit_Framework_MockObject_MockObject $view */ + /** @var \Drupal\views\Plugin\views\display\DisplayPluginBase|\PHPUnit_Framework_MockObject_MockObject $display */ + list($view, $display) = $this->setupBaseViewAndDisplay(); + + $elements = &$view->element; + $elements['#cache'] += ['keys' => []]; + $elements['#pre_rendered'] = TRUE; + + $view->setItemsPerPage(12); + $this->assertEquals(12, $view->getItemsPerPage()); + $this->assertNotContains('items_per_page:12', $view->element['#cache']['keys']); + } + + public function testSetOffsetBeforePreRender() { + /** @var \Drupal\views\ViewExecutable|\PHPUnit_Framework_MockObject_MockObject $view */ + /** @var \Drupal\views\Plugin\views\display\DisplayPluginBase|\PHPUnit_Framework_MockObject_MockObject $display */ + list($view, $display) = $this->setupBaseViewAndDisplay(); + + $view->setOffset(12); + $this->assertEquals(12, $view->getOffset()); + $this->assertContains('offset:12', $view->element['#cache']['keys']); + } + + public function testSetOffsetDuringPreRender() { + /** @var \Drupal\views\ViewExecutable|\PHPUnit_Framework_MockObject_MockObject $view */ + /** @var \Drupal\views\Plugin\views\display\DisplayPluginBase|\PHPUnit_Framework_MockObject_MockObject $display */ + list($view, $display) = $this->setupBaseViewAndDisplay(); + + $elements = &$view->element; + $elements['#cache'] += ['keys' => []]; + $elements['#pre_rendered'] = TRUE; + + $view->setOffset(12); + $this->assertEquals(12, $view->getOffset()); + $this->assertNotContains('offset:12', $view->element['#cache']['keys']); + } + + public function testSetCurrentPageBeforePreRender() { + /** @var \Drupal\views\ViewExecutable|\PHPUnit_Framework_MockObject_MockObject $view */ + /** @var \Drupal\views\Plugin\views\display\DisplayPluginBase|\PHPUnit_Framework_MockObject_MockObject $display */ + list($view, $display) = $this->setupBaseViewAndDisplay(); + + $view->setCurrentPage(12); + $this->assertEquals(12, $view->getCurrentPage()); + $this->assertContains('page:12', $view->element['#cache']['keys']); + } + + public function testSetCurrentPageDuringPreRender() { + /** @var \Drupal\views\ViewExecutable|\PHPUnit_Framework_MockObject_MockObject $view */ + /** @var \Drupal\views\Plugin\views\display\DisplayPluginBase|\PHPUnit_Framework_MockObject_MockObject $display */ + list($view, $display) = $this->setupBaseViewAndDisplay(); + + $elements = &$view->element; + $elements['#cache'] += ['keys' => []]; + $elements['#pre_rendered'] = TRUE; + + $view->setCurrentPage(12); + $this->assertEquals(12, $view->getCurrentPage()); + $this->assertNotContains('page:12', $view->element['#cache']['keys']); + } + }