Сортировка Silverstripe SiteTree по глубине - PullRequest
1 голос
/ 03 октября 2011

Я хочу получить все страницы SiteTree веб-сайта Silverstripe, а затем отсортировать их по убыванию глубины. Под глубиной я подразумеваю количество родителей, которые у них есть.

Это уже сделано в некоторой степени модулем Google Sitemaps. За исключением того, что он не превышает глубину 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, добавить глубину и затем прибегнуть к помощи.

Ответы [ 2 ]

3 голосов
/ 03 октября 2011

Функция ниже получает все опубликованные страницы из базы данных, проверяет, что они доступны для просмотра, а не страницу ошибок, определяет, сколько у них предков, и затем возвращает 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;
}
0 голосов
/ 26 ноября 2012

Если вы используете PostgreSQL, вы также можете использовать один запрос к базе данных. В стремлении ускорить SilverStripe (2.4) мы заменили getSiteTreeFor() одним запросом к базе данных, см.

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

Поле breadcrumb содержит массив идентификаторов, по которым вы можете сортировать.

...