Extend Core Statistic system

Concrete5 comes with a simple statistic system, can keep track of number of visits in your site. If you enable statistics (Dashboard>System & settings>Statistics), for every page view, concrete insert a record into the pageStatistics table. If you take a look at this table you would see it contains these fields:

cID: visited page id
uID: default=0, user id, if a logged-in user visit the page

At the Dashbord>Reports>Statistics you only can see number of page views at last 7 days. In this how-to I will show you how you can add other reports (that can extracted from the inserted data) to statistic page. Suppose you want to add a list that show top 10 most popular pages of your site at the statistic page.

1- Tweaking Model: first we add a method to page statisic model. For this copy /concrete/models/page_statistics.php to /models/page_statistics.php. this will override the main file. Now add this method that run a query, get data we need for our report:

public static function getTotalPageViewsByPage() {
     $db = Loader::db();
     return $db->GetAll("select cID,count(pstID) AS num from PageStatistics GROUP BY cID HAVING num>0 ORDER BY num DESC LIMIT 10");

2- Tweaking Controller: copy /concrete/controllers\dashboard/reports/statistics.php to /controllers\dashboard/reports/statistics.php. this will override the main file. Now add this method that get the required data from the method added in previous step:

public function view() {
        $this->set('totalVersions', PageStatistics::getTotalPageVersions());
        $this->set('totalEditMode', PageStatistics::getTotalPagesCheckedOut());
        $this->set('totalPageViewsByPage', PageStatistics::getTotalPageViewsByPage());

Note: this method copied/pasted from /concrete/core/controllers/single_pages/dashboard/reports/statistics.php, I just added last line.

3- Tweaking Single Page: copy /concrete/single_pages/dashboard/reports/statistics.php to /single_pages/dashboard/reports/statistics.php. this will override the main file. Now add this table at the end of the file, befor script tag, that print data into the statistic single page:

<div class="row">
<div class="span-pane-half">
    <h3><?php echo t('Top 10 Popular Pages') ?></h3>
        <table border="0" cellspacing="1" cellpadding="0" class="ccm-results-list">
                    <th class="subheader"><?php  echo t('#') ?></th>
                    <th class="subheader"><?php  echo t('ID') ?></th>
                    <th class="subheader" width="100%"><?php  echo t('Page') ?></th>
                    <th class="subheader"><?php  echo t('Visits') ?></th>
            foreach($totalPageViewsByPage as $key=>$value) { 
              $p = Page::getByID($value['cID']);
                    <td style="text-align:center;"><?php echo ++$i ?></td>
                    <td style="text-align:center;"><?php echo $value['cID'] ?></td>
                    <td><?php  echo $p->vObj->cvName; ?></td>
                    <td style="text-align:center;"><?php echo $value['num'] ?></td>
            <?php  }} ?>

Now go to the statistic, you should see table, list top 10 popular pages of your site.