我们如何列出SilverStripe中最受欢迎(浏览次数最多)的页面?
我想在网站上列出浏览次数最多的博文。
我尝试了following code,但它无效:
public function MostPopularBlogArticles($num = 5) {
return DataObject::get(
"BlogPostPage",
"Status = 'Published'",
"`PageCounter`.Counter DESC",
"INNER JOIN PageCounter ON `PageCounter`.PageID = `BlogPostPage`.ID",
$num
);
}
模板:
<ul>
<% control MostPopularBlogArticles(5) %>
<li>
<a href="$Link" title="$Title.XML">$MenuTitle.XML</a>
</li>
<% end_control %>
</ul>
答案 0 :(得分:5)
以下内容基于Infobiro网站上的SilverStripe CMS Page Hit/View Counter和 SilverStripe - Most Popular Articles博客文章。这些说明适用于使用当前版本的SilverStripe blog module。
的SilverStripe 3.4首先,我们创建一个getIndexData
PageView
来跟踪每个页面的页数。
DataObject
在我们的class PageView extends DataObject {
private static $db = array(
'Count' => 'Int'
);
private static $has_one = array(
'Page' => 'Page'
);
}
课程中,我们与Page
建立$belongs_to
关系,以便我们可以轻松检索相关的PageView
对象。
PageView
在我们的class Page extends SiteTree {
private static $belongs_to = array(
'PageView' => 'PageView'
);
}
Page_Controller
函数中,我们增加了网页浏览量。每次用户在前端访问页面时都会调用此方法。首先,我们检索或创建相关的init
计数。然后我们增加PageView
值。
Count
在class Page_Controller extends ContentController {
public function init() {
parent::init();
$pageView = $this->PageView();
if (!$pageView) {
$pageView = PageView::create();
$pageView->PageID = $this->ID;
$pageView->write();
}
$pageView->Count = $pageView->Count + 1;
$pageView->write();
}
}
我们还创建了一个Page_Controller
来获取查看次数最多的MostViewedBlogPosts
的列表。
BlogPosts
可以轻松更改此功能以获取任何页面类型的列表。例如,要获取查看次数最多的页面列表:
class Page_Controller extends ContentController {
// ...
public function MostViewedBlogPosts($limit = 5) {
return BlogPost::get()
->innerJoin('PageView', '`BlogPost`.`ID` = `PageView`.`PageID`')
->sort('PageView.Count', 'DESC')
->limit($limit);
}
}
在我们的模板中,我们检索public function MostViewedPages($limit = 5) {
return Page::get()
->innerJoin('PageView', '`Page`.`ID` = `PageView`.`PageID`')
->sort('PageView.Count', 'DESC')
->limit($limit);
}
列表如下:
MostViewedBlogPosts