列出SilverStripe站点中最受欢迎的页面

Mis*_*h90 1 php silverstripe

我们如何列出SilverStripe中最受欢迎(浏览次数最多)的页面?

我想列出网站中浏览次数最多的博文.

我尝试了以下代码,但它无法正常工作:

public function MostPopularBlogArticles($num = 5) { 
    return DataObject::get(
        "BlogPostPage",
        "Status = 'Published'",
        "`PageCounter`.Counter DESC",
        "INNER JOIN PageCounter ON `PageCounter`.PageID = `BlogPostPage`.ID",
    $num
    );
}
Run Code Online (Sandbox Code Playgroud)

模板:

<ul>
    <% control MostPopularBlogArticles(5) %>
    <li>
        <a href="$Link" title="$Title.XML">$MenuTitle.XML</a>
    </li>
    <% end_control %>
</ul>
Run Code Online (Sandbox Code Playgroud)

3dg*_*goo 5

以下内容基于Infobiro网站上的SilverStripe CMS页面命中/查看计数器 SilverStripe - 最热门文章博客文章.这些说明适用于SilverStripe 3.4,使用当前版本的SilverStripe博客模块.

首先,我们创建一个PageView DataObject跟踪每个页面的页数.

class PageView extends DataObject {
    private static $db = array(
        'Count' => 'Int'
    );

    private static $has_one = array(
        'Page' => 'Page'
    );
}
Run Code Online (Sandbox Code Playgroud)

在我们的Page课程中,我们创建了一个$belongs_to关系,PageView以便我们可以轻松地检索相关PageView对象.

class Page extends SiteTree {

    private static $belongs_to = array(
        'PageView' => 'PageView'
    );

}
Run Code Online (Sandbox Code Playgroud)

在我们的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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

可以轻松更改此功能以获取任何页面类型的列表.例如,要获取查看次数最多的页面列表:

public function MostViewedPages($limit = 5) {
    return Page::get()
        ->innerJoin('PageView', '`Page`.`ID` = `PageView`.`PageID`')
        ->sort('PageView.Count', 'DESC')
        ->limit($limit);
}
Run Code Online (Sandbox Code Playgroud)

在我们的模板中,我们检索MostViewedBlogPosts列表如下:

<% if $MostViewedBlogPosts %>
    <ul>
    <% loop $MostViewedBlogPosts %>
        <li><a href="$Link">$Title</a></li>
    <% end_loop %>
    </ul>
<% end_if %>
Run Code Online (Sandbox Code Playgroud)