Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting SilverStripe 3:循环Great孙子页面,不按父级分组_Sorting_Loops_Templates_Silverstripe - Fatal编程技术网

Sorting SilverStripe 3:循环Great孙子页面,不按父级分组

Sorting SilverStripe 3:循环Great孙子页面,不按父级分组,sorting,loops,templates,silverstripe,Sorting,Loops,Templates,Silverstripe,在我的模板中,我将我的子页面循环为两个单独的列表,然后在这些列表下循环它们的孙子页面。但我希望这些曾孙页面被作为一个完整的列表进行排序,而不是由它们的父母进行划分/分组。 简单地一个接一个地循环是行不通的,因为所有的曾孙页面都应该按顺序排列,而不是按父页面分组然后排序 我知道这可以通过一个函数来完成,该函数可以获取所有的greatsunder页面,并按照选定的方法(例如,按字母顺序)对它们进行排序。但我不想得到所有这些,因为我需要的只是每个孩子的孙子孙女 页面-显示列表 子列表标题 孙子-未显示

在我的模板中,我将我的子页面循环为两个单独的列表,然后在这些列表下循环它们的孙子页面。但我希望这些曾孙页面被作为一个完整的列表进行排序,而不是由它们的父母进行划分/分组。 简单地一个接一个地循环是行不通的,因为所有的曾孙页面都应该按顺序排列,而不是按父页面分组然后排序

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

页面-显示列表

子列表标题

孙子-未显示在列表中


Great孙子-按字母顺序列出和排序所有

SiteTree::get()->filter('ParentID',SiteTree::get()->filter('ParentID',$this->Children()->column('ID'))->filterByCallback(函数($page){return$page->canView()}
在第页上,您可以使用以下方法获取所有子代(孙子的父母)的ID:

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

$grandChildren = Page::get()->filter(array('ParentID' => $ids));
孙子孙女也一样

$grandGrandChildren = Page::get()->filter(array('ParentID' => $grandChildren->getIDList()));
您可以根据需要对该数据列表进行排序,例如

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

//你想干什么就干什么

通常情况下,如果答案中包含对代码意图的解释,以及在不引入其他答案的情况下解决问题的原因,那么答案会更有帮助。(至少有一个用户标记了这篇文章,大概是因为他们认为应该删除一个没有解释的答案。)
filterByCallback()
是用PHP过滤的,因此有点不好。如果你能让它在DB中过滤,那就更好了,因为我不太天真,但我需要把这些放进函数中吗?然后在我的模板中循环$SortedGrand孙子?我在单独的函数中添加了我的page.php中的每一行,但是我得到了“未定义变量”,我应该这样将它们放入page.php中:
public function sortedgrandgreeners(){$sortedgrandgreeners=$grandgreeners->sort('Title','ASC');}
如果你能给我举个非常有用的例子。谢谢,太好了,谢谢。虽然我实际上是按ProductReleaseDate排序,但尝试用它代替标题会给我一个错误:按“ProductReleaseDate”排序ASC未知列“field list”中的“ProductReleaseDate”。我是否需要为它添加更多代码来查找这些内容?如果要获取所有ProductPage项目,则需要ProductPage::get()(或任何类名),如果要对该类的字段进行筛选。如果答案对你有效,请随意接受。祝你好运谢谢,我为ProductPage
函数ProductPages(){$ProductPages=ProductPages::get();返回$ProductPages?$ProductPages:false;}
提供了一个get(),但问题是试图按它们的祖父母对它们进行分组,因此我得到了两个单独的列表,而不是所有产品都按ProductReleaseDate排序。。有什么想法吗?忽略最后的评论。谢谢你<代码>$grand孙子=页面::get()->过滤器(数组('ParentID'=>$grand孙子->getIDList())成功了!谁知道会这么棘手(对我来说)
<% loop $GrandGrandChildren %>
    <a href="$Link">$Title</a>
    //do whatever you want
<% end_loop %>