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 %>
在我的模板中,我将我的 child 页面循环为 2 个单独的列表,然后将它们的大 child 页面置于这些列表之下。但我希望将这些曾祖child 页面作为一个完整列表进行排序,而不是按其 parent 进行划分/分组。 简单地循环后循环不起作用,因为所有曾祖 child 页面都应该按顺序排列,而不是按 parent 分组然后排序。
我知道这可以通过获取所有曾祖child页面并按选定方法(例如按字母顺序排列)对它们进行排序的函数来完成。但我不想得到所有这些,因为我需要它们只是每个 child.
的盛大 childrenPAGE - 显示列表
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 %>