2016-10-25 8 views
1

私は現在ProductPageからProductPageにリンクしたいサイトを持っています。私はすぐに兄弟のためにこれを行うことができますが、そのセットの終わりに達すると、私は次の製品ProductRangeにリンクしたいと思います。構造は次のようになります。SilverStripe 3 - 祖父母を使用している次の兄弟

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(); 
    } 
} 

をどのように私はそれが次のレベルアップで働くのですか?

答えて

1

ここでこれを行う方法の1つです。まず、次の兄弟を探します。次の兄弟が存在しない場合は、次の親ページを取得し、最初の子を取得します。ここで

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; 
} 

PreviousProduct機能です:

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; 
} 
関連する問題