1

Silverstripe Web サイトのすべての SiteTree ページを取得し、深さの降順で並べ替えたいと考えています。深さとは、彼らが持っている親の数を意味します。

これは、Google サイトマップ モジュールによってある程度行われています。10 の深さを超えず、検索から非表示のページを計算しないことを除いて: https://github.com/silverstripe-labs/silverstripe-googlesitemaps

Google サイトマップ モジュール モジュールを見ると、ページの親の数を簡単に数えられるように見えます ( /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 に答える