SilverStripe 3:循环曾孙页面,不按 parent 分组

SilverStripe 3: Loop greatgrandchildren pages WITH OUT grouping by parent

在我的模板中,我将我的 child 页面循环为 2 个单独的列表,然后将它们的大 child 页面置于这些列表之下。但我希望将这些曾祖child 页面作为一个完整列表进行排序,而不是按其 parent 进行划分/分组。 简单地循环后循环不起作用,因为所有曾祖 child 页面都应该按顺序排列,而不是按 parent 分组然后排序。

我知道这可以通过获取所有曾祖child页面并按选定方法(例如按字母顺序排列)对它们进行排序的函数来完成。但我不想得到所有这些,因为我需要它们只是每个 child.

的盛大 children

PAGE - 显示列表

Child - 列表标题

GrandChild - 未显示在列表中

GreatGrandChild - 列出并全部按字母顺序排序

SiteTree::get()->filter('ParentID',SiteTree::get()->filter('ParentID',$this->Children()->column('ID')))->filterByCallback(function($page){return $page->canView()})

在页面上,您可以使用 getIDList():

获取所有 children(即盛大 children 的 parents)的 ID
$ids = Page::get()->filter(array('ParentID' => $this->ID))->getIDList();

现在您可以通过 ParentID 获取所有页面(或任何您想要的页面类型):

$grandChildren = Page::get()->filter(array('ParentID' => $ids));

grand-grandchildren 相同...

$grandGrandChildren = Page::get()->filter(array('ParentID' => $grandChildren->getIDList()));

您可以根据需要对这个 DataList 进行排序,例如

$sortedgrandGrandChildren = $grandGrandChildren->sort('Title', 'ASC');

编辑:

$this->Children() return 一个 ArrayList,而不是一个 DataList,所以我们必须手动获取所有 children。请注意,这不符合 canView(),所以我们得到 all 页,无论当前用户是否有权限。对于一个简单的网站,这应该没问题。

使用 $this->Children()->column('ID') 得到过滤后的结果。

一个随时可用的方法可以是:

public function getGrandGrandChildren() {
    $ids = Page::get()->filter(array('ParentID' => $this->ID))->getIDList();
    $grandChildren = Page::get()->filter(array('ParentID' => $ids));
    $grandGrandChildren = Page::get()->filter(array('ParentID' => $grandChildren->getIDList()));

    return $grandGrandChildren->sort('Title', 'ASC');
}

在您的模板中:

<% loop $GrandGrandChildren %>
    <a href="$Link">$Title</a>
    //do whatever you want
<% end_loop %>