我正在寻找一个工作示例,默认情况下如何按标题对网箱中的网页进行排序。理想情况下,我只想对某种类型的子页面进行排序。在我的情况下,我希望在父组合下的所有我的画廊页面按其标题按字母顺序排序。 这是为了在后端CMS中轻松搜索,因为我知道如何在模板中对它们进行排序。
我找到了这些例子,但还不足以解决SS3.1 +
的问题http://www.ssbits.com/tutorials/2011/custom-sorting-in-the-cms-sitetree/ https://github.com/silverstripe/silverstripe-cms/issues/848
答案 0 :(得分:2)
看一下你给出的例子和当前的Silverstripe来源,有几种方法可以解决这个问题。我的解决方案涉及使用Silverstripe的扩展系统来操纵层次结构的生成方式。
SiteTree
CMS加载站点树的方式有点冗长,所以我会快速简化:
CMSPagesController_Content.ss
(用于页面部分)具有延迟加载链接树视图的标记CMSMain
中指定的函数)调用一些内部方法来基本加载CMSMain_TreeView
模板此模板在CMSMain
SiteTreeAsUL
函数
注意:
SiteTreeAsUL
允许我们在使用Silverstripe中的扩展系统返回之前挂钩,尽管我们不想操纵 HTML直接。
getSiteTreeFor
是LeftAndMain
的函数部分,在SiteTreeAsUL
内调用。
getSiteTreeFor
调用getChildrenAsUL
,Hierarchy
的函数部分,它实际上构建了HTML,但最重要的是调用了正确的“子”方法。我说正确的孩子方法有几个:
因为调用getSiteTreeFor
而未指定子方法it uses a hardcoded default of AllChildrenIncludingDeleted
。
调用函数AllChildrenIncludingDeleted
会进行一些调用,但我们想知道的是它在内部调用扩展方法augmentAllChildrenIncludingDeleted
。
因此,要做你想做的事情,你可能会想要使用扩展函数SiteTree
编写augmentAllChildrenIncludingDeleted
的扩展名。第一个参数是存储为ArrayList
的所有子项的列表。
技术说明:它实际上可以是
ArrayList
或DataList
因为如果没有活孩子,它会返回原始结果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}");
}
}
}
}
这不是完全的“银线方式”,但可以。