2016-11-08 6 views
0

Я пытаюсь вернуть следующий (более новый) и предыдущий (более старый) BlogPost из того, что я сейчас просматриваю.silverstripe 3 blog next and previous post

Я поставил это на расширение:

<?php 
class BlogPost_Extension extends DataExtension { 

public function getBlogSibling($Mode = 'next') { 
    if($Mode == 'next'){ 
     $pages = BlogPost::get()->filter(array(
     'ParentID' => $this->owner->ParentID, 
     'PublishDate:GreaterThan' => $this->owner->PublishDate 
     ))->Sort('PublishDate ASC')->limit(1); 
    } elseif($Mode == 'prev'){ 
     $pages = BlogPost::get()->filter(array(
     'ParentID' => $this->owner->ParentID, 
     'PublishDate:LessThan' => $this->owner->PublishDate 
     ))->Sort('PublishDate DESC')->limit(1); 
    } 

    if ($pages->count()) { 
     return $pages->First(); 
    } 
    return false; 
} 

} 

и использовать это в шаблоне:

<% if $BlogSibling('next') %><a href="$BlogSibling('next').Link">newer story</a><% end_if %> 
<% if $BlogSibling('prev') %><a href="$BlogSibling('prev').Link">older story</a><% end_if %> 

Но оба возвращают один и тот же результат, следующий (новая) BlogPost - Я м уверен, что его что-то глупо я с видом ....! :)

(SilverStripe 3.1.4/модуль блога ~ 2,4)

ответ

1

Another (better) solution, found by munomono


Вам нужно продлить BlogPost_Controller а не BlogPost. Чем добавить следующие функции

public function PrevBlogPost() { 
    $sort = $this->owner->Sort; 
    $prevSort = $sort - 1; 

    if($prev = $this->owner->Parent()->getBlogPosts()->find('Sort', $prevSort)) { 
     return $prev; 
    } 
    } 

    public function NextBlogPost() { 
    $sort = $this->owner->Sort; 
    $nextSort = $sort + 1; 

    if($next = $this->owner->Parent()->getBlogPosts()->find('Sort', $nextSort)) { 
     return $next; 
    } 
    } 

В шаблоне

<% if $PrevBlogPost %> 
    <a href="$PrevBlogPost.Link" title="$PrevBlogPost.Title"> 
     <i class="fa fa-angle-left"></i>vorheriger Beitrag 
    </a> 
    <% end_if %> 
    <% if $NextBlogPost %> 
    <a href="$NextBlogPost.Link" title="$NextBlogPost.Title"> 
     nächster Beitrag<i class="fa fa-angle-right"></i> 
    </a> 
    <% end_if %> 

Конечно, вы могли бы объединить эти функции в одну.

+1

Просто использование одного номера сортировки не будет надежно работать. Представьте, что у вас есть неопубликованные сообщения с номером 'Sort', который вы запрашиваете? Я думаю, вам следует искать '> $ sort' или' <$ sort' и вернуть первый результат из этого ... – bummzack

+0

Просто сортировка по сортировке не учитывает истинный порядок сообщений в блогах, поскольку они находятся в порядке публикации PublishDate , а не сортировка. – galilee

+0

Но @galilee идея состоит в том, что вы задали порядок в SiteTree, как вы хотите, чтобы они отображались, поэтому для этого нужно использовать порядок сортировки. –