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

时间:2015-03-20 09:45:13

标签: sorting silverstripe

我正在寻找一个工作示例,默认情况下如何按标题对网箱中的网页进行排序。理想情况下,我只想对某种类型的子页面进行排序。在我的情况下,我希望在父组合下的所有我的画廊页面按其标题按字母顺序排序。 这是为了在后端CMS中轻松搜索,因为我知道如何在模板中对它们进行排序。

我找到了这些例子,但还不足以解决SS3.1 +

的问题

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

2 个答案:

答案 0 :(得分:2)

看一下你给出的例子和当前的Silverstripe来源,有几种方法可以解决这个问题。我的解决方案涉及使用Silverstripe的扩展系统来操纵层次结构的生成方式。

如何加载SiteTree

CMS加载站点树的方式有点冗长,所以我会快速简化:

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

    中调用SiteTreeAsUL函数
      

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

  • getSiteTreeForLeftAndMain的函数部分,在SiteTreeAsUL内调用。

  • getSiteTreeFor调用getChildrenAsULHierarchy的函数部分,它实际上构建了HTML,但最重要的是调用了正确的“子”方法。

我说正确的孩子方法有几个:

因为调用getSiteTreeFor而未指定子方法it uses a hardcoded default of AllChildrenIncludingDeleted

现在,是时候对孩子们进行分类......

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

因此,要做你想做的事情,你可能会想要使用扩展函数SiteTree编写augmentAllChildrenIncludingDeleted的扩展名。第一个参数是存储为ArrayList的所有子项的列表。

  

技术说明:它实际上可以是ArrayListDataList   因为如果没有活孩子,它会返回原始结果   stageChildren这是DataList。   虽然两者都有排序功能,但它们的行为可能不同。

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如何使用扩展程序的标准模式,因此您不应该遇到问题。

答案 1 :(得分:0)

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

use SilverStripe\ORM\DB;

class MemberPage extends Page
{
    public function onAfterWrite(){
        parent::onAfterWrite();

        $pages = MemberPage::get()->sort('Title');
        $sortIndex = 0;
        foreach ($pages as $page){
            //sort indexes start at 1
            $sortIndex++;
            if ($page->Sort != $sortIndex){
                //we can't use $page->write() here, otherwise it'll cause infinite loops,
                //we'll just have to run the query on the database directly
                DB::query("UPDATE SiteTree SET Sort = {$sortIndex} WHERE ID = {$page->ID}");
            }
        }
    }
}

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