2016-10-25 4 views
1

Ich habe eine Website, wo ich auf die nächste ProductPage aus der ProductPage Ich bin derzeit in der Lage, zu verknüpfen. Ich kann dies für die unmittelbaren Geschwister tun, aber sobald ich an das Ende dieses Satzes komme, möchte ich mit dem nächsten Produkt verbinden: ProductRange. Die Struktur ist wie folgt:SilverStripe 3 - nächste Geschwister mit Großeltern

ProductArea 
    ProductCategory 
     - ProductRange 
      - ProductPage 
      - ProductPage 
     - ProductRange 
      - ProductPage 
      - ProductPage 
    ProductCategory 
     - ProductRange 
      - ProductPage 
      - ProductPage 
     - ProductRange 
      - ProductPage 
      - ProductPage 

Also, wenn es kein direktes Geschwister ist Ich brauche die nächste Produktseite, um zurückzukehren.

Ich verwende diese für direkte Geschwister:

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

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

Wie bekomme ich es auf der nächsthöheren Ebene zu arbeiten?

Antwort

1

Hier ist eine Möglichkeit, dies zu tun. Zuerst versuchen wir, das nächste Geschwister zu finden. Wenn das nächste Geschwister nicht existiert, erhalten wir die nächste Elternseite und bekommen ihr erstes Kind. Hier

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

ist eine PreviousProduct Funktion:

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