Silverstripe 从页面对字段上的VirtualPage进行排序

Silverstripe 从页面对字段上的VirtualPage进行排序,silverstripe,Silverstripe,我有一个区域页面,其中包含$many\u many虚拟页面s: 类区域页面扩展页面{ /** *@var数组 */ 私有静态$many\u many=[ “RelatedVirtualPage”=>“VirtualPage” ]; // ... } relatedvirtualpage正在从ContentPages复制内容: class ContentPage扩展页面{ /** *@var数组 */ 私有静态$db=[ '突出显示'=>'布尔' ]; // ... } 在要复制的Conten

我有一个
区域页面
,其中包含
$many\u many
虚拟页面
s:

类区域页面扩展页面{
/**
*@var数组
*/
私有静态$many\u many=[
“RelatedVirtualPage”=>“VirtualPage”
];
// ...
}
relatedvirtualpage
正在从
ContentPage
s复制内容:

class ContentPage扩展页面{
/**
*@var数组
*/
私有静态$db=[
'突出显示'=>'布尔'
];
// ...
}

在要复制的
ContentPage
突出显示的
db字段上,排序
相关虚拟页面的最佳方法是什么?

虚拟页面可以指向不同类型的页面,并且没有强制规定所有这些页面都是
ContentPage
,或者至少有一个
高亮显示的
db字段的页面。您可以在创建
站点树时手动确保这一点,但用户可能会出现并将其搞砸,因此请记住这一点

下面是一些psuedo代码,可能会帮助您开始。它假定所有虚拟页面都是
ContentPages
。如果一个
AreaPage
引用了多种类型的
VirtualPage
,那么这可能是不够的

$virtualPages = $myAreaPage->RelatedVirtualPages();
$contentSourcePages = ContentPage::get()->byIDs($virtualPage->column('CopyContentFromID'));
$sortedSourcePages = $contentSourcePages->sort('Highlighted','ASC');
您可能还可以使用
innerJoin
,但是您必须处理活动表和可能的多页表(如果不只是将
ContentPage
用作
VirtualPage
),这可能会导致一些复杂的场景

更新

因此,用我自己的话总结一下,您需要一个链接到特定
区域页面的
VirtualContentPage
列表,该页面在
突出显示的
字段中排序,每个
VirtualContentPage
链接到该页面。如果这个总结是准确的,这项工作会:

$sortedVirtualPages = $myAreaPage->RelatedVirtualPages()
 ->innerJoin('ContentPage', '"ContentPage"."ID" = "VirtualContentPage"."CopyContentFromID"')
 ->sort('Highlighted DESC');

虚拟页面可以指向不同类型的页面,并且没有强制要求所有这些页面都是
ContentPages
,或者至少是具有
高亮显示的
db字段的页面。您可以在创建
站点树时手动确保这一点,但用户可能会出现并将其搞砸,因此请记住这一点

下面是一些psuedo代码,可能会帮助您开始。它假定所有虚拟页面都是
ContentPages
。如果一个
AreaPage
引用了多种类型的
VirtualPage
,那么这可能是不够的

$virtualPages = $myAreaPage->RelatedVirtualPages();
$contentSourcePages = ContentPage::get()->byIDs($virtualPage->column('CopyContentFromID'));
$sortedSourcePages = $contentSourcePages->sort('Highlighted','ASC');
您可能还可以使用
innerJoin
,但是您必须处理活动表和可能的多页表(如果不只是将
ContentPage
用作
VirtualPage
),这可能会导致一些复杂的场景

更新

因此,用我自己的话总结一下,您需要一个链接到特定
区域页面的
VirtualContentPage
列表,该页面在
突出显示的
字段中排序,每个
VirtualContentPage
链接到该页面。如果这个总结是准确的,这项工作会:

$sortedVirtualPages = $myAreaPage->RelatedVirtualPages()
 ->innerJoin('ContentPage', '"ContentPage"."ID" = "VirtualContentPage"."CopyContentFromID"')
 ->sort('Highlighted DESC');
你就不能这么做吗

//just get one areapage
$AreaPageItem = AreaPage::get()->First();

//now get the RelatedVirtualPages sorted
$related_pages = $AreaPageItem->RelatedVirtualPages()->sort("Highlighted","ASC");
你就不能这么做吗

//just get one areapage
$AreaPageItem = AreaPage::get()->First();

//now get the RelatedVirtualPages sorted
$related_pages = $AreaPageItem->RelatedVirtualPages()->sort("Highlighted","ASC");

我找不到一个非常干净的方法,但找到了两种方法来实现这一点。该函数位于类
区域页面

首先

public function getRelatedVirtualPages()
{

    $items = $this->getManyManyComponents('RelatedVirtualPages');

    $highlighted = $items->filterByCallback(function($record, $list) {
        if($record->CopyContentFrom() instanceOf ContentPage) {
            //return ! $record->CopyContentFrom()->Highlighted; // ASC
            return $record->CopyContentFrom()->Highlighted; // DESC
        }
    });

    $highlighted->merge($items);
    $highlighted->removeDuplicates();

    return $highlighted;
}
Second(您在评论中描述的方法)


我并不为这些解决方案感到自豪,但我相信它们确实符合您的标准。

我找不到一个非常干净的方法,但找到了两种方法来实现这一点。该函数位于类
区域页面

首先

public function getRelatedVirtualPages()
{

    $items = $this->getManyManyComponents('RelatedVirtualPages');

    $highlighted = $items->filterByCallback(function($record, $list) {
        if($record->CopyContentFrom() instanceOf ContentPage) {
            //return ! $record->CopyContentFrom()->Highlighted; // ASC
            return $record->CopyContentFrom()->Highlighted; // DESC
        }
    });

    $highlighted->merge($items);
    $highlighted->removeDuplicates();

    return $highlighted;
}
Second(您在评论中描述的方法)


我并不为这些解决方案感到自豪,但我相信它们确实符合您的标准。

以下是我最后做的事情,我认为这是可行的:

/**
*@returnarraylist
*/
公共函数virtualPage()
{
$result=[];
$virtualPages=$this->RelatedVirtualPages();
$contentPages=ContentPage::get()
->ById($VirtualPage->column('CopyContentFromID'))
->映射('ID','Highlighted')
->toArray();
foreach($virtualPage作为$virtualPage){
$highlighted=$contentPages[$virtualPage->copycontentfromfromid];
$virtualPage->Highlighted=$Highlighted;
$result[]=$virtualPage;
}
返回ArrayList::create(
$result
);
}
然后就可以这样分类了:

$areaPage->virtualPage()->排序('Highlighted DESC');

谢谢你的回答和指点。在标记任何答案之前,我会等待一段时间。

以下是我最后所做的,我认为是有效的:

/**
*@returnarraylist
*/
公共函数virtualPage()
{
$result=[];
$virtualPages=$this->RelatedVirtualPages();
$contentPages=ContentPage::get()
->ById($VirtualPage->column('CopyContentFromID'))
->映射('ID','Highlighted')
->toArray();
foreach($virtualPage作为$virtualPage){
$highlighted=$contentPages[$virtualPage->copycontentfromfromid];
$virtualPage->Highlighted=$Highlighted;
$result[]=$virtualPage;
}
返回ArrayList::create(
$result
);
}
然后就可以这样分类了:

$areaPage->virtualPage()->排序('Highlighted DESC');

谢谢你的回答和指点。我会等一等再做任何回答。

是否应该“RelatedVirtualPage”=>“VirtualPage”是“RelatedVirtualPage”=>“VirtualPage”?是的,你是对的:-)更新的问题不应该“RelatedVirtualPage”=>“VirtualPage”是“RelatedVirtualPage”=>“VirtualPage”?是的,你说得对:-)更新的问题谢谢你的回答并为我指明了方向。伪代码为我提供了
ContentPage
s的排序列表,但是