我正在寻找一个工作示例,说明默认情况下如何按标题对站点树中的页面进行排序。理想情况下,我只想对某种类型的子页面进行排序。就我而言,我希望父组合下的所有图库页面按标题按字母顺序排序。
这是为了在后端 CMS 中轻松搜索,因为我知道如何在模板中对它们进行排序。
我找到了这些例子,但不足以为 SS3.1+ 解决这个问题
http://www.ssbits.com/tutorials/2011/custom-sorting-in-the-cms-sitetree/
https://github.com/silverstripe/silverstripe-cms/issues/848
最佳答案
查看您提供的示例和当前的 Silverstripe 源,您可以通过几种方法来解决此问题。我的解决方案涉及使用 Silverstripe 的扩展系统来操纵层次结构的生成方式。
如何加载 SiteTree
CMS 加载站点树的方式有点冗长,所以我将快速简化:
CMSPagesController_Content.ss
(用于页面部分)具有延迟加载链接树 View 的标记 CMSMain
中指定的一个函数)调用了一些内部方法来基本加载 CMSMain_TreeView
模板 SiteTreeAsUL
中调用了 CMSMain
函数getSiteTreeFor
是 LeftAndMain
的一个函数部分,在 SiteTreeAsUL
中被调用。 getSiteTreeFor
调用 getChildrenAsUL
,它是 Hierarchy
的一个函数部分,它实际上执行 HTML 构建,但最重要的是,调用正确的“子级”方法。 我说正确的 child 方法,因为有几个:
因为
getSiteTreeFor
是在没有指定 children 方法的情况下调用的,所以 it uses a hardcoded default of AllChildrenIncludingDeleted
。现在,是时候给 children 分类了……
调用函数
AllChildrenIncludingDeleted
会进行一些调用,但我们想知道的是它在内部调用了扩展方法 augmentAllChildrenIncludingDeleted
。因此,要执行您想做的事情,您可能需要使用扩展函数
SiteTree
为 augmentAllChildrenIncludingDeleted
编写扩展。第一个参数是存储为 ArrayList
的所有子项的列表。ArrayList
provides a sort function 可以让你做你想做的事。这样的事情应该工作:
class CMSSiteTreeSortingExtension extends Extension
{
public function augmentAllChildrenIncludingDeleted($Children, $Context = null)
{
if ($this->owner->ClassName == 'GalleryPage')
{
//Do your class specific sorting here....
}
$Children = $Children->sort('Title DESC');
}
}
只需针对
SiteTree
设置扩展(或 Page
,如果你愿意,应该仍然有效)。免责声明:我没有亲自尝试过这个,但是它遵循 Silverstripe 如何与扩展一起工作的标准模式,所以你应该没有问题。
关于sorting - Silverstripe 3 : how to sort pages in the CMS sitetree by title, 日期等,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29163563/