SilverStripe 3-下一个使用祖父母的兄弟姐妹

SilverStripe 3-下一个使用祖父母的兄弟姐妹,silverstripe,Silverstripe,我有一个网站,我希望能够从我当前所在的ProductPage链接到下一个ProductPage。我可以为直系兄弟姐妹这样做,但一旦我到达该集合的末尾,我想链接到下一个ProductRange第一个产品。结构如下: ProductArea ProductCategory - ProductRange - ProductPage - ProductPage - ProductRange - ProductPa

我有一个网站,我希望能够从我当前所在的
ProductPage
链接到下一个
ProductPage
。我可以为直系兄弟姐妹这样做,但一旦我到达该集合的末尾,我想链接到下一个
ProductRange
第一个产品。结构如下:

ProductArea
    ProductCategory
      - ProductRange
          - ProductPage
          - ProductPage
      - ProductRange
          - ProductPage
          - ProductPage
    ProductCategory
      - ProductRange
          - ProductPage
          - ProductPage
      - ProductRange
          - ProductPage
          - ProductPage
因此,如果没有直接的兄弟姐妹,我需要按顺序返回下一个产品页面

我将此用于直接兄弟姐妹:

function NextProduct() {
    $pages = ProductPage::get()->filter(array(
        'ParentID' => $this->ParentID,
        'Sort:GreaterThan' => $this->Sort
    ))->Sort('Sort'); 

    if ($pages) {
        return $pages->First();
    }
}

如何让它在下一个级别工作?

这里有一种方法。首先,我们试图找到下一个兄弟姐妹。如果下一个兄弟不存在,我们将获得下一个父页面并获得他们的第一个子页面

function NextProduct() {
    $pages = ProductPage::get()->filter(array(
        'ParentID' => $this->ParentID,
        'Sort:GreaterThan' => $this->Sort
    ))->Sort('Sort')->limit(1);

    if ($pages->count()) {
        return $pages->First();
    }

    $parent = $this->parent();
    $parentSiblings = ProductRange::get()->filter(array(
        'ParentID' => $parent->ParentID,
        'Sort:GreaterThan' => $parent->Sort
    ))->Sort('Sort');

    foreach ($parentSiblings as $parentSibling) {
        $pages = ProductPage::get()->filter(array(
            'ParentID' => $parentSibling->ID
        ))->Sort('Sort')->limit(1);

        if ($pages->count()) {
            return $pages->First();
        }
    }
    return false;
}
这是一个
以前的产品
功能:

function PreviousProduct() {
    $pages = ProductPage::get()->filter(array(
        'ParentID' => $this->ParentID,
        'Sort:LessThan' => $this->Sort
    ))->Sort('Sort')->reverse()->limit(1);

    if ($pages->count()) {
        return $pages->First();
    }

    $parent = $this->parent();
    $parentSiblings = ProductRange::get()->filter(array(
        'ParentID' => $parent->ParentID,
        'Sort:LessThan' => $parent->Sort
    ))->Sort('Sort')->reverse();

    foreach ($parentSiblings as $parentSibling) {
        $pages = ProductPage::get()->filter(array(
            'ParentID' => $parentSibling->ID
        ))->Sort('Sort')->reverse()->limit(1);

        if ($pages->count()) {
            return $pages->First();
        }
    }
    return false;
}