Сортировка Silverstripe SiteTree по глубине

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

В некоторой степени это уже сделано модулем Google Sitemaps. За исключением того, что глубина не превышает 10 и не учитываются страницы, скрытые от поиска: https://github.com/silverstripe-labs/silverstripe-googlesitemaps

Глядя на модуль модуля Google Sitemaps, кажется, что достаточно легко подсчитать количество родителей страницы: ( /code/GoogleSitemapDecorator.php - строка 78)

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

Но как лучше всего отсортировать SiteTree с помощью этого вычисления?

Я надеюсь, что есть более простой способ, чем получить все SiteTree, добавить глубину, а затем прибегнуть.


person BaronGrivet    schedule 03.10.2011    source источник


Ответы (2)


Приведенная ниже функция получает все опубликованные страницы из базы данных, проверяет, доступны ли они для просмотра, а не страницу с ошибкой, выясняет, сколько у них предков, а затем возвращает 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;
}
person ryanwachtl    schedule 03.10.2011

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

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

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

person Freddy Vulto    schedule 26.11.2012