【问题标题】:silverstripe 3 blog next and previous postsilverstripe 3 博客下一篇和上一篇文章
【发布时间】:2016-11-08 03:18:13
【问题描述】:

我正在尝试从我当前查看的博客中返回下一个(较新的)和上一个(较旧的)博客帖子。

我已经在扩展上设置了这个:

<?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)

【问题讨论】:

    标签: php silverstripe


    【解决方案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 %>
    

    当然,您可以将这些功能合二为一。

    【讨论】:

    • 只使用一个排序号并不能可靠地工作。想象一下,您有一些未发布的帖子,其中包含您要查询的Sort 号码?我认为您应该搜索 &gt; $sort&lt; $sort 并从中返回第一个结果......
    • 仅在 Sort 上排序并没有考虑博客文章的真实顺序,因为它们是按 PublishDate 顺序排列的,而不是 Sort。
    • 但是@galilee 的想法是您在 SiteTree 中设置您希望它们显示的顺序,因此排序顺序应该用于此目的
    • 但是对于博客,排序通常不是按排序 - 而是按文章发布日期 - 博客中的其他所有内容(即最近的帖子等)按 PublishDate 排序,所以我需要这个还有……
    猜你喜欢
    • 2018-07-22
    • 2021-10-17
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 2019-11-14
    相关资源
    最近更新 更多