我正在寻找一个工作示例,说明默认情况下如何按标题对站点树中的页面进行排序。理想情况下,我只想对某种类型的子页面进行排序。就我而言,我希望父组合下的所有图库页面按标题按字母顺序排序。
这是为了在后端 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 的标记
  • 链接树 View (在 CMSMain 中指定的一个函数)调用了一些内部方法来基本加载 CMSMain_TreeView 模板
  • 这个模板在 SiteTreeAsUL 中调用了 CMSMain 函数

  • getSiteTreeFor LeftAndMain 的一个函数部分,在 SiteTreeAsUL 中被调用。
  • getSiteTreeFor 调用 getChildrenAsUL ,它是 Hierarchy 的一个函数部分,它实际上执行 HTML 构建,但最重要的是,调用正确的“子级”方法。

  • 我说正确的 child 方法,因为有几个:
  • AllChildren
  • AllChildrenIncludingDeleted
  • AllHistoricalChildren
  • Children

  • 因为 getSiteTreeFor 是在没有指定 children 方法的情况下调用的,所以 it uses a hardcoded default of AllChildrenIncludingDeleted

    现在,是时候给 children 分类了……

    调用函数 AllChildrenIncludingDeleted 会进行一些调用,但我们想知道的是它在内部调用了扩展方法 augmentAllChildrenIncludingDeleted

    因此,要执行您想做的事情,您可能需要使用扩展函数 SiteTreeaugmentAllChildrenIncludingDeleted 编写扩展。第一个参数是存储为 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/

    10-11 09:31