【问题标题】:SilverStripe 3: Loop greatgrandchildren pages WITH OUT grouping by parentSilverStripe 3:循环曾孙页面不按父分组
【发布时间】:2015-06-10 22:32:45
【问题描述】:

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

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

PAGE - 显示列表

子 - 列表标题

GrandChild - 未显示在列表中

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

【问题讨论】:

    标签: sorting loops templates silverstripe


    【解决方案1】:

    在页面上,您可以使用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 %>
    

    【讨论】:

    • 请原谅我的幼稚,但我需要将这些放入函数中吗?然后在我的模板中循环 $sortedgrandGrandChildren?我在 page.php 中的单独函数中添加了你的每一行,但得到“未定义的变量”我应该像这样将它们放入 page.php:public function sortedgrandGrandChildren() { $sortedgrandGrandChildren = $grandGrandChildren-&gt;sort('Title', 'ASC'); } 如果你能给我一个非常有用的例子。谢谢
    • 非常感谢。虽然我实际上是按 ProductReleaseDate 排序,但尝试使用它而不是 Title 会给我一个错误:ORDER BY "ProductReleaseDate" ASC Unknown column 'ProductReleaseDate' in 'field list'。我是否需要添加更多代码才能找到这些?
    • 如果你想获得所有需要 ProductPage::get() 的 ProductPage 项目(或任何你的类名),如果你想过滤该类的字段。如果它对您有用,请随时接受答案。祝你好运!
    • 谢谢,我有一个用于 ProductPage function ProductPages() { $productPages = ProductPage::get(); return $productPages ? $productPages : false; } 的 get(),但问题是试图按他们的祖父母对它们进行分组,所以我得到了两个单独的列表,而不是按 ProductReleaseDate 排序的所有产品。 . 有什么想法吗?
    • 忽略最后一条评论。谢谢你!!! $grandGrandChildren = Page::get()-&gt;filter(array('ParentID' =&gt; $grandChildren-&gt;getIDList())); 做到了!谁知道这会这么棘手(对我来说)
    【解决方案2】:

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

    【讨论】:

    • 一般来说,如果答案包含对代码的用途的解释,以及为什么在不介绍其他人的情况下解决问题的原因,答案会更有帮助。 (该帖子至少被一位用户标记,大概是因为他们认为应该删除没有解释的答案。)
    • filterByCallback() 在 PHP 中进行过滤,因此性能不佳。如果你可以让它在数据库中过滤它会更好恕我直言
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多