2 namespace wcf\data\stat\daily
;
3 use wcf\data\
object\type\ObjectTypeCache
;
4 use wcf\data\AbstractDatabaseObjectAction
;
5 use wcf\system\database\util\PreparedStatementConditionBuilder
;
6 use wcf\system\exception\UserInputException
;
10 * Executes statistic-related actions.
13 * @copyright 2001-2014 WoltLab GmbH
14 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
15 * @package com.woltlab.wcf
16 * @subpackage data.stat.daily
17 * @category Community Framework
19 class StatDailyAction
extends AbstractDatabaseObjectAction
{
21 * @see \wcf\data\AbstractDatabaseObjectAction::$className
23 protected $className = 'wcf\data\stat\daily\StatDailyEditor';
26 * Validates the getData action.
28 public function validateGetData() {
29 WCF
::getSession()->checkPermissions(array('admin.system.canViewLog'));
31 // validate start date
32 if (empty($this->parameters
['startDate']) ||
!preg_match('/^\d{4}\-\d{2}\-\d{2}$/', $this->parameters
['startDate'])) {
33 throw new UserInputException('startDate');
37 if (empty($this->parameters
['endDate']) ||
!preg_match('/^\d{4}\-\d{2}\-\d{2}$/', $this->parameters
['endDate'])) {
38 throw new UserInputException('endDate');
41 // validate object types
42 if (empty($this->parameters
['objectTypeIDs']) ||
!is_array($this->parameters
['objectTypeIDs'])) {
43 throw new UserInputException('objectTypeIDs');
45 foreach ($this->parameters
['objectTypeIDs'] as $objectTypeID) {
46 $objectType = ObjectTypeCache
::getInstance()->getObjectType($objectTypeID);
47 if ($objectType === null) throw new UserInputException('objectTypeIDs');
50 // validate date grouping parameter
51 if (empty($this->parameters
['dateGrouping'])) {
52 throw new UserInputException('objectTypeIDs');
57 * Returns the stat data.
59 public function getData() {
61 $conditionBuilder = new PreparedStatementConditionBuilder();
62 $conditionBuilder->add('objectTypeID IN (?)', array($this->parameters
['objectTypeIDs']));
63 $conditionBuilder->add('date BETWEEN ? AND ?', array($this->parameters
['startDate'], $this->parameters
['endDate']));
65 if ($this->parameters
['dateGrouping'] == 'yearly') {
66 $sql = "SELECT MIN(date) AS date, SUM(counter) AS counter, MAX(total) AS total, objectTypeID
67 FROM wcf".WCF_N
."_stat_daily
69 GROUP BY EXTRACT(YEAR FROM date), objectTypeID
72 else if ($this->parameters
['dateGrouping'] == 'monthly') {
73 $sql = "SELECT MIN(date) AS date, SUM(counter) AS counter, MAX(total) AS total, objectTypeID
74 FROM wcf".WCF_N
."_stat_daily
76 GROUP BY EXTRACT(YEAR_MONTH FROM date), objectTypeID
79 else if ($this->parameters
['dateGrouping'] == 'weekly') {
80 $sql = "SELECT MIN(date) AS date, SUM(counter) AS counter, MAX(total) AS total, objectTypeID
81 FROM wcf".WCF_N
."_stat_daily
83 GROUP BY EXTRACT(YEAR FROM date), EXTRACT(WEEK FROM date), objectTypeID
88 FROM wcf".WCF_N
."_stat_daily
93 $statement = WCF
::getDB()->prepareStatement($sql);
94 $statement->execute($conditionBuilder->getParameters());
95 while ($row = $statement->fetchArray()) {
96 $value = $row['counter'];
97 if (!empty($this->parameters
['value']) && $this->parameters
['value'] == 'total') $value = $row['total'];
99 $objectType = ObjectTypeCache
::getInstance()->getObjectType($row['objectTypeID']);
101 if (!isset($data[$row['objectTypeID']])) {
102 $data[$row['objectTypeID']] = array(
103 'label' => WCF
::getLanguage()->get('wcf.acp.stat.'.$objectType->objectType
),
108 $data[$row['objectTypeID']]['data'][] = array(strtotime($row['date'] . ' UTC'), $objectType->getProcessor()->getFormattedCounter($value));