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的排序列表,但是