Silverstripe 3:如何按标题,日期等对CMS网站树中的页面进行排序

问题描述 投票:3回答:2

我正在寻找一个工作示例,该示例默认情况下如何按标题对站点树中的页面进行排序。理想情况下,我只想对某种类型的子页面进行排序。就我而言,我希望我的父投资组合下的所有图库页面均按其标题按字母顺序排序。这是为了在后端CMS中轻松搜索,因为我知道如何在模板中对其进行排序。

我已经找到了这些示例,但不足以解决SS3.1 +问题

http://www.ssbits.com/tutorials/2011/custom-sorting-in-the-cms-sitetree/https://github.com/silverstripe/silverstripe-cms/issues/848

sorting silverstripe
2个回答
2
投票

查看您提供的示例和当前的Silverstripe来源,有几种方法可以解决此问题。我的解决方案涉及使用Silverstripe的扩展系统来操纵如何生成层次结构。

如何加载SiteTree

CMS加载站点树的方式有点冗长,因此我将快速简化:

  • 模板SiteTree(用于页面部分)具有用于延迟加载链接树视图的标记
  • 链接树视图(在CMSPagesController_Content.ss中指定的功能)调用一些内部方法来基本上加载CMSMain模板
  • 此模板在CMSMain中回调CMSMain_TreeView函数>

    注意:SiteTreeAsUL允许我们在返回之前使用Silverstripe中的扩展系统进行挂接,尽管我们不想操纵HTML。

  • [SiteTreeAsULCMSMain的功能部分,在SiteTreeAsUL内部被调用。

  • [getSiteTreeFor调用getSiteTreeFor,它是LeftAndMain的功能部分,实际上是在进行HTML的构建,但最重要的是,它调用了正确的“ children”方法。]]
  • 我说的是正确的子方法,因为有几个:

    • LeftAndMain
  • SiteTreeAsUL
  • getSiteTreeFor
  • getChildrenAsUL
  • 因为未指定子方法getChildrenAsUL时调用了Hierarchy。>

    现在,该对孩子们进行排序了...

    调用函数Hierarchy会进行几次调用,但是我们想知道的是它在内部调用了扩展方法AllChildren

因此,要执行您想做的事情,您可能想使用扩展功能AllChildrenIncludingDeletedAllHistoricalChildren编写扩展名。第一个参数是存储为Children的所有子级的列表。

技术说明:它实际上可以是getSiteTreeForit uses a hardcoded default of AllChildrenIncludingDeleted因为如果没有活孩子,它将返回原始结果AllChildrenIncludingDeletedAllChildrenIncludingDeleted。虽然两者都有排序功能,但它们的行为可能有所不同。

augmentAllChildrenIncludingDeleted将允许您做您打算做的事。

类似这样的方法应该起作用:

augmentAllChildrenIncludingDeleted

并且只需将扩展名设置为SiteTree(如果需要,也可以设置为augmentAllChildrenIncludingDeleted,仍然可以使用。]

免责声明:我没有亲自尝试过,但是它遵循Silverstripe如何与扩展一起使用的标准模式,因此您应该没有问题。

当我无法使上述代码正常工作时,我一直在寻找一种在SS4中实现此目标的方法。这就是我想出的。

ArrayList

这不是完全的“银线方式”,但可以。


0
投票

当我无法使上述代码正常工作时,我一直在寻找一种在SS4中实现此目标的方法。这就是我想出的。

ArrayList
© www.soinside.com 2019 - 2024. All rights reserved.