2016-08-09 13 views
1

SilverStripeで最も人気のある(最も閲覧した)ページを一覧表示するにはどうすればよいですか?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

は、あなたの質問を改善する必要があります。リンクからコードを追加しましたが、あなたが試したコードを正確に表示するためにこれを編集してください。また、その記事のリンクからページビューカウンターコードを追加しましたか?もしそうなら、あなたの質問にそれを加えてください。 SilverStripeの最新バージョンのこのコード/テンプレートを更新しましたか?どのようなブログモジュールを使用していますか?あなたの質問にこのような情報を記入し、コミュニティがあなたを助けるのを助けてください。 – 3dgoo

+0

私の質問を修正していただきありがとうございました:)、私はブログアドオンの最新バージョンを使用しています。[リンク](https://github.com/silverstripe/silverstripe-blog) – Misagh90

+0

はい私はページビューカウンタを使用しますが、このように ' - > innerJoin( 'PageView'、 '' 'BlogPost'.'ID' =' PageView'.'PageID'') 'あなたの助けてくれてありがとうございましたコード体系でもう一度試してみます – Misagh90

答えて

5

以下はInfobiroのウェブサイト上のSilverStripe CMS Page Hit/View Counter SilverStripe - Most Popular Articlesブログ記事をオフに基づいています。これらの手順は、現在のバージョンのSilverStripe blog moduleを使用しているSilverStripe 3.4用です。

まず、各ページのページ数を記録するためにPageViewDataObjectを作成します。私たちのPageクラスで

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

    private static $has_one = array(
     'Page' => 'Page' 
    ); 
} 

我々は簡単に関連PageViewオブジェクトを取得できるように、我々はPageView$belongs_to関係を作成します。私たちは、ページビュー数をインクリメント当社Page_Controllerinit機能で

class Page extends SiteTree { 

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

} 

。これは、ページがフロントエンドでユーザーによってアクセスされるたびに呼び出されます。まず、関連するPageView件を取得または作成します。次に、Countの値をインクリメントします。 Page_Controller

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(); 
    } 
} 

我々はまた、最も閲覧BlogPostsのリストを取得するMostViewedBlogPostsを作成します。

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リストを取得:

<% if $MostViewedBlogPosts %> 
    <ul> 
    <% loop $MostViewedBlogPosts %> 
     <li><a href="$Link">$Title</a></li> 
    <% end_loop %> 
    </ul> 
<% end_if %> 
+0

重複したブログポストを削除するには? – Misagh90

+0

重複があるとは思わない。あなたは彼らが同じページであると確信していますか? '$Title'を '$Title - $ID'に変更して、重複が同じ 'ID'を持つかどうかを確認してください。それらが異なるIDである場合、それらは同じ内容を有する異なるページである。 – 3dgoo

関連する問題