You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
129 lines
4.3 KiB
129 lines
4.3 KiB
<?php |
|
|
|
/** |
|
* Controller to handle application statistics. |
|
*/ |
|
class FreshRSS_stats_Controller extends Minz_ActionController { |
|
|
|
/** |
|
* This action handles the statistic main page. |
|
* |
|
* It displays the statistic main page. |
|
* The values computed to display the page are: |
|
* - repartition of read/unread/favorite/not favorite |
|
* - number of article per day |
|
* - number of feed by category |
|
* - number of article by category |
|
* - list of most prolific feed |
|
*/ |
|
public function indexAction() { |
|
$statsDAO = FreshRSS_Factory::createStatsDAO(); |
|
Minz_View::appendScript(Minz_Url::display('/scripts/flotr2.min.js?' . @filemtime(PUBLIC_PATH . '/scripts/flotr2.min.js'))); |
|
$this->view->repartition = $statsDAO->calculateEntryRepartition(); |
|
$this->view->count = $statsDAO->calculateEntryCount(); |
|
$this->view->feedByCategory = $statsDAO->calculateFeedByCategory(); |
|
$this->view->entryByCategory = $statsDAO->calculateEntryByCategory(); |
|
$this->view->topFeed = $statsDAO->calculateTopFeed(); |
|
} |
|
|
|
/** |
|
* This action handles the idle feed statistic page. |
|
* |
|
* It displays the list of idle feed for different period. The supported |
|
* periods are: |
|
* - last year |
|
* - last 6 months |
|
* - last 3 months |
|
* - last month |
|
* - last week |
|
*/ |
|
public function idleAction() { |
|
$statsDAO = FreshRSS_Factory::createStatsDAO(); |
|
$feeds = $statsDAO->calculateFeedLastDate(); |
|
$idleFeeds = array( |
|
'last_year' => array(), |
|
'last_6_month' => array(), |
|
'last_3_month' => array(), |
|
'last_month' => array(), |
|
'last_week' => array(), |
|
); |
|
$now = new \DateTime(); |
|
$feedDate = clone $now; |
|
$lastWeek = clone $now; |
|
$lastWeek->modify('-1 week'); |
|
$lastMonth = clone $now; |
|
$lastMonth->modify('-1 month'); |
|
$last3Month = clone $now; |
|
$last3Month->modify('-3 month'); |
|
$last6Month = clone $now; |
|
$last6Month->modify('-6 month'); |
|
$lastYear = clone $now; |
|
$lastYear->modify('-1 year'); |
|
|
|
foreach ($feeds as $feed) { |
|
$feedDate->setTimestamp($feed['last_date']); |
|
if ($feedDate >= $lastWeek) { |
|
continue; |
|
} |
|
if ($feedDate < $lastYear) { |
|
$idleFeeds['last_year'][] = $feed; |
|
} elseif ($feedDate < $last6Month) { |
|
$idleFeeds['last_6_month'][] = $feed; |
|
} elseif ($feedDate < $last3Month) { |
|
$idleFeeds['last_3_month'][] = $feed; |
|
} elseif ($feedDate < $lastMonth) { |
|
$idleFeeds['last_month'][] = $feed; |
|
} elseif ($feedDate < $lastWeek) { |
|
$idleFeeds['last_week'][] = $feed; |
|
} |
|
} |
|
|
|
$this->view->idleFeeds = $idleFeeds; |
|
} |
|
|
|
/** |
|
* This action handles the article repartition statistic page. |
|
* |
|
* It displays the number of article and the average of article for the |
|
* following periods: |
|
* - hour of the day |
|
* - day of the week |
|
* - month |
|
* |
|
* @todo verify that the metrics used here make some sense. Especially |
|
* for the average. |
|
*/ |
|
public function repartitionAction() { |
|
$statsDAO = FreshRSS_Factory::createStatsDAO(); |
|
$categoryDAO = new FreshRSS_CategoryDAO(); |
|
$feedDAO = FreshRSS_Factory::createFeedDao(); |
|
Minz_View::appendScript(Minz_Url::display('/scripts/flotr2.min.js?' . @filemtime(PUBLIC_PATH . '/scripts/flotr2.min.js'))); |
|
$id = Minz_Request::param ('id', null); |
|
$this->view->categories = $categoryDAO->listCategories(); |
|
$this->view->feed = $feedDAO->searchById($id); |
|
$this->view->days = $statsDAO->getDays(); |
|
$this->view->months = $statsDAO->getMonths(); |
|
$this->view->repartitionHour = $statsDAO->calculateEntryRepartitionPerFeedPerHour($id); |
|
$this->view->averageHour = $statsDAO->calculateEntryAveragePerFeedPerHour($id); |
|
$this->view->repartitionDayOfWeek = $statsDAO->calculateEntryRepartitionPerFeedPerDayOfWeek($id); |
|
$this->view->averageDayOfWeek = $statsDAO->calculateEntryAveragePerFeedPerDayOfWeek($id); |
|
$this->view->repartitionMonth = $statsDAO->calculateEntryRepartitionPerFeedPerMonth($id); |
|
$this->view->averageMonth = $statsDAO->calculateEntryAveragePerFeedPerMonth($id); |
|
} |
|
|
|
/** |
|
* This action is called before every other action in that class. It is |
|
* the common boiler plate for every action. It is triggered by the |
|
* underlying framework. |
|
*/ |
|
public function firstAction() { |
|
if (!$this->view->loginOk) { |
|
Minz_Error::error( |
|
403, array('error' => array(Minz_Translate::t('access_denied'))) |
|
); |
|
} |
|
|
|
Minz_View::prependTitle(Minz_Translate::t('stats') . ' · '); |
|
} |
|
|
|
}
|
|
|