SilverStripe 4:如何生成DataObject详情页的分页返回链接
SilverStripe 4:获取DataObject对应的分页列表页链接
针对你需要在PublicationObject详情页生成返回对应分页列表页链接的需求,这里提供两种简洁的实现方式,无需依赖HTTP_REFERER或复杂SQL:
方法一:复用PaginatedList内置方法(推荐)
利用SilverStripe PaginatedList的getPageForItem()方法,直接复用列表页的分页逻辑,确保页码计算完全匹配:
实现步骤
- 确保
PublicationObject与PublicationPage已建立关联(比如通过$belongs_to):
class PublicationObject extends DataObject { private static $belongs_to = [ 'ParentPage' => PublicationPage::class ]; // 其他字段与配置... }
- 在
PublicationObject中添加生成返回链接的方法:
public function getBackToListLink() { $parentPage = $this->ParentPage(); if (!$parentPage) { return ''; } // 构建与列表页一致的PaginatedList实例 $list = PaginatedList::create( PublicationObject::get()->filter('ParentPageID', $parentPage->ID), Controller::curr()->getRequest() )->setPageLength($parentPage->ItemsPerPage ?? 10); // 匹配列表页的每页条数 // 获取当前DataObject所在的页码 $pageNum = $list->getPageForItem($this); // 生成带分页参数的链接 if ($pageNum > 1) { $startParam = $list->getPageLength() * ($pageNum - 1); return $parentPage->Link() . "?start={$startParam}"; } // 第一页直接返回列表页链接 return $parentPage->Link(); }
- 在详情页模板中直接调用:
<a href="$BackToListLink">返回列表</a>
方法二:直接计算排序位置
如果不想构建PaginatedList实例,可以通过计数当前对象在排序列表中的位置来计算页码,需确保排序规则与列表页完全一致:
public function getBackToListLink() { $parentPage = $this->ParentPage(); if (!$parentPage) { return ''; } $itemsPerPage = $parentPage->ItemsPerPage ?? 10; // 此处排序规则必须与列表页PaginatedList的排序完全匹配(示例按创建时间降序) $countBefore = PublicationObject::get() ->filter('ParentPageID', $parentPage->ID) ->where("Created > '{$this->Created->RFC3339}'") ->count(); $pageNum = floor($countBefore / $itemsPerPage) + 1; if ($pageNum > 1) { $startParam = $itemsPerPage * ($pageNum - 1); return $parentPage->Link() . "?start={$startParam}"; } return $parentPage->Link(); }
方法对比
- 方法一:完全复用列表页的分页逻辑,排序、每页条数变更时无需同步修改,可靠性更高;
- 方法二:更轻量,但需严格保证排序规则与列表页一致,否则会出现页码计算错误。
内容的提问来源于stack exchange,提问作者seppzzz
相关产品推荐
相关产品推荐

