/** * Gets the page's data for page rendering. * * It's better to call IPage::getData, which calls this function, because it * will also cache the results. It's useful for example when pagination * results needs to be re-used. */ public static function getPageData(IPage $page) { $pieCrust = $page->getApp(); $paginator = new Paginator($page); $assetor = new Assetor($page); $linker = new Linker($page); $recursiveLinker = new RecursiveLinkerIterator($linker); if ($page->getPaginationDataSource() != null) { $paginator->setPaginationDataSource($page->getPaginationDataSource()); } $data = array('page' => $page->getConfig()->get(), 'assets' => $assetor, 'pagination' => $paginator, 'siblings' => $linker, 'family' => $recursiveLinker); $data['page']['url'] = PieCrustHelper::formatUri($pieCrust, $page->getUri()); $data['page']['slug'] = $page->getUri(); $data['page']['timestamp'] = $page->getDate(true); $dateFormat = PageHelper::getConfigValueUnchecked($page, 'date_format', $page->getConfig()->getValueUnchecked('blog')); $data['page']['date'] = date($dateFormat, $page->getDate(true)); switch ($page->getPageType()) { case IPage::TYPE_TAG: if (is_array($page->getPageKey())) { $data['tag'] = implode(' + ', $page->getPageKey()); } else { $data['tag'] = $page->getPageKey(); } if (strpos($data['tag'], '-') >= 0) { // The tag may have been slugified. Let's cheat a bit by looking at // the first tag that matches in the first pagination post, and // using that instead. $paginationPosts = $paginator->posts(); if (count($paginationPosts) > 0) { $firstPost = $paginationPosts[0]; $firstPostTags = $firstPost['tags']; if (!is_array($firstPostTags)) { $firstPostTags = array($firstPostTags); } $flags = $pieCrust->getConfig()->getValue('site/slugify_flags'); if (is_array($page->getPageKey())) { $pageKey = $page->getPageKey(); foreach ($firstPostTags as $t) { $st = UriBuilder::slugify($t, $flags); foreach ($pageKey as &$pk) { if ($st == $pk) { $pk = $t; break; } } } if ($page->getPageKey() == null) { $page->setPageKey($pageKey); } $data['tag'] = implode(' + ', $pageKey); } else { foreach ($firstPostTags as $t) { if (UriBuilder::slugify($t, $flags) == $data['tag']) { if ($page->getPageKey() == null) { $page->setPageKey($t); } $data['tag'] = $t; break; } } } } } break; case IPage::TYPE_CATEGORY: $data['category'] = $page->getPageKey(); if (strpos($page->getPageKey(), '-') >= 0) { // Same remark as for tags. $paginationPosts = $paginator->posts(); if (count($paginationPosts) > 0) { $firstPost = $paginationPosts[0]; if ($page->getPageKey() == null) { $page->setPageKey($firstPost['category']); } $data['category'] = $firstPost['category']; } } break; } $extraData = $page->getExtraPageData(); if ($extraData) { if (is_array($extraData)) { $data = Configuration::mergeArrays($data, $extraData); } else { $data['extra'] = $extraData; } } return $data; }
/** * @dataProvider categoryPageDataProvider */ public function testCategoryPage($pageConfig, $categorize, $tagging, $expectedIndices) { $pc = new MockPieCrust(); $page = new MockPage($pc); $page->pageType = IPage::TYPE_CATEGORY; $page->pageKey = 'foo'; foreach ($pageConfig as $key => $value) { $page->getConfig()->setValue($key, $value); } $posts = $this->buildPaginationDataSource($pc, 10); // The pagination data source is ordered in reverse // chronological order. Let's reverse it to be able // to index posts easily. // (the Paginator will reorder them internally) $posts = array_reverse($posts); foreach ($categorize as $i => $category) { $posts[$i]->getConfig()->setValue('category', $category); } foreach ($tagging as $i => $tags) { $posts[$i]->getConfig()->setValue('tags', $tags); } $paginator = new Paginator($page); $paginator->setPaginationDataSource($posts); $this->assertExpectedPostsData($expectedIndices, $paginator->posts()); }
/** * @dataProvider paginatorDataProvider */ public function testPaginator($uri, $pageNumber, $postCount) { $siteRoot = 'http://example.org/'; $pc = new MockPieCrust(); $pc->getConfig()->setValue('site/root', $siteRoot); $pc->getConfig()->setValue('site/pretty_urls', true); $pc->getConfig()->setValue('blog/posts_per_page', 5); $pc->getConfig()->setValue('blog/date_format', 'F j, Y'); $page = new MockPage($pc); $page->uri = $uri; $page->pageNumber = $pageNumber; $paginator = new Paginator($page); $paginator->setPaginationDataSource($this->buildPaginationDataSource($pc, $postCount)); $this->assertNotNull($paginator->getPaginationDataSource()); $posts = $paginator->posts(); $this->assertNotNull($posts); if ($postCount <= 5) { // All posts fit on the page. $this->assertNull($paginator->prev_page_number()); $this->assertNull($paginator->prev_page()); $this->assertEquals(1, $paginator->this_page_number()); $this->assertEquals($siteRoot . $uri, $paginator->this_page()); $this->assertNull($paginator->next_page_number()); $this->assertNull($paginator->next_page()); } else { if ($pageNumber <= 1) { // Lots of posts, but this is the first page. $this->assertNull($paginator->prev_page_number()); $this->assertNull($paginator->prev_page()); $this->assertEquals(1, $paginator->this_page_number()); $this->assertEquals($siteRoot . $uri, $paginator->this_page()); $this->assertEquals(2, $paginator->next_page_number()); $this->assertEquals($siteRoot . ($uri == '' ? '2' : $uri . '/2'), $paginator->next_page()); } else { if ($pageNumber * 5 > $postCount) { // Lots of posts, and this is a page somewhere in the middle, or // the last page. if ($pageNumber >= 2) { $this->assertEquals($pageNumber - 1, $paginator->prev_page_number()); $prevPage = $uri == '' ? (string) ($pageNumber - 1) : $uri . '/' . ($pageNumber - 1); if ($pageNumber - 1 <= 1) { $prevPage = $uri; } $this->assertEquals($siteRoot . $prevPage, $paginator->prev_page()); } else { $this->assertNull($paginator->prev_page_number()); $this->assertNull($paginator->prev_page()); } $this->assertEquals($pageNumber, $paginator->this_page_number()); $this->assertEquals($siteRoot . ($uri == '' ? (string) $pageNumber : $uri . '/' . $pageNumber), $paginator->this_page()); if ($pageNumber * 5 > $postCount) { $this->assertNull($paginator->next_page_number()); $this->assertNull($paginator->next_page()); } else { $this->assertEquals($pageNumber + 1, $paginator->next_page_number()); $this->assertEquals($siteRoot . ($uri == '' ? (string) ($pageNumber + 1) : $uri . '/' . ($pageNumber + 1)), $paginator->next_page()); } } } } $expectedCount = $postCount; if ($postCount > 5) { if ($pageNumber * 5 <= $postCount) { $expectedCount = 5; } else { $expectedCount = $postCount % 5; } } $expectedIndices = array(); if ($postCount > 0) { $allIndices = array_reverse(range(0, $postCount - 1)); $expectedIndices = array_slice($allIndices, 5 * ($pageNumber - 1), $expectedCount); } $this->assertExpectedPostsData($expectedIndices, $posts); }