SilverStripe 3:循环伟大的儿童页面WITH OUT按父母分组

时间:2015-06-10 22:32:46

标签: sorting loops templates silverstripe

在我的模板中,我将我的子页面循环为2个单独的列表,然后是这些列表下的孙子页面。但是我希望这些伟大的儿童页面被整理成一个整体列表,而不是由他们的父母分割/分组。 简单循环后循环不起作用,因为所有的伟大的页面都应按顺序排列,而不是按父级分组然后排序。

我知道这可以通过一个函数来完成,以获取所有伟大的grandschildpages并通过选择的方法(例如按字母顺序)对它们进行排序。但是我不想得到所有这些,因为我只需要每个孩子的孙子孙女。

PAGE - 显示列表

儿童 - 列出标题

GrandChild - 未在列表中显示

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

2 个答案:

答案 0 :(得分:2)

在页面上,您可以使用getIDList()获取所有孩子(大孩子的父母)的ID:

$ids = Page::get()->filter(array('ParentID' => $this->ID))->getIDList();

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

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

孙子孙女同样......

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

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

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

修改

$ this-> Children()确实返回一个ArrayList,而不是DataList,因此我们必须手动获取所有子节点。请注意,这不尊重canView(),因此如果当前用户具有权限,我们会获取所有页面。对于一个简单的网站,这应该没问题。

使用$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 %>

答案 1 :(得分:1)

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