Example #1
0
 /**
  * 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;
 }
Example #2
0
 /**
  * @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);
 }