在我的模板中,我将我的子页面循环为2个单独的列表,然后是这些列表下的孙子页面。但是我希望这些伟大的儿童页面被整理成一个整体列表,而不是由他们的父母分割/分组。 简单循环后循环不起作用,因为所有的伟大的页面都应按顺序排列,而不是按父级分组然后排序。
我知道这可以通过一个函数来完成,以获取所有伟大的grandschildpages并通过选择的方法(例如按字母顺序)对它们进行排序。但是我不想得到所有这些,因为我只需要每个孩子的孙子孙女。
PAGE - 显示列表
儿童 - 列出标题
GrandChild - 未在列表中显示
GreatGrandChild - 列出并按字母顺序排序
答案 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()})