1

我想获取 Silverstripe 网站的所有 SiteTree 页面,然后按深度降序对它们进行排序。我所说的深度是指他们拥有的父母数量。

谷歌站点地图模块已经在某种程度上做到了这一点。除了它不超过 10 的深度并且不计算从搜索中隐藏的页面:https ://github.com/silverstripe-labs/silverstripe-googlesitemaps

查看 Google Sitemaps Module 模块,计算页面的父级数量似乎很容易:(/code/GoogleSitemapDecorator.php - 第 78 行)

$parentStack = $this->owner->parentStack();
$numParents = is_array($parentStack) ? count($parentStack) - 1: 0;

但是使用此计算对 SiteTree 进行排序的最佳方法是什么?

我希望有一种比获取所有 SiteTree、附加深度然后再使用更简单的方法。

4

2 回答 2

3

下面的函数将从数据库中获取所有已发布的页面,检查它们是否可见而不是错误页面,找出它们有多少祖先,然后返回按深度(祖先数量)排序的页面的 DataObjectSet。

public function CustomPages() {
    $filter = '';
    $pages = Versioned::get_by_stage('SiteTree', 'Live', $filter);
    $custom_pages = new DataObjectSet();
    if($pages) {
        foreach($pages as $page) {
            if( $page->canView() && !($page instanceof ErrorPage) ) {
                $parentStack = $page->parentStack();
                $numParents = is_array($parentStack) ? count($parentStack) - 1 : 0;
                $page->Depth = $numParents;
                $custom_pages->push($page);
            }
        }
    }
    $custom_pages->sort('Depth', 'DESC');
    return $custom_pages;
}
于 2011-10-03T04:41:03.913 回答
0

如果您使用的是 PostgreSQL,您还可以使用单个数据库查询。为了加快 SilverStripe (2.4) 的速度,我们已将 替换getSiteTreeFor()为单个数据库查询,请参阅:

http://fvue.nl/wiki/SilverStripe:_Replace_getSiteTreeFor_with_single_query

breadcrumb字段包含一个可以排序的 ID 数组。

于 2012-11-26T12:36:53.937 回答