Merge branch '2.0'
[GitHub/WoltLab/WCF.git] / wcfsetup / install / files / lib / data / stat / daily / StatDailyAction.class.php
1 <?php
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;
7 use wcf\system\WCF;
8
9 /**
10 * Executes statistic-related actions.
11 *
12 * @author Marcel Werk
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
18 */
19 class StatDailyAction extends AbstractDatabaseObjectAction {
20 /**
21 * @see \wcf\data\AbstractDatabaseObjectAction::$className
22 */
23 protected $className = 'wcf\data\stat\daily\StatDailyEditor';
24
25 /**
26 * Validates the getData action.
27 */
28 public function validateGetData() {
29 WCF::getSession()->checkPermissions(array('admin.system.canViewLog'));
30
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');
34 }
35
36 // validate end date
37 if (empty($this->parameters['endDate']) || !preg_match('/^\d{4}\-\d{2}\-\d{2}$/', $this->parameters['endDate'])) {
38 throw new UserInputException('endDate');
39 }
40
41 // validate object types
42 if (empty($this->parameters['objectTypeIDs']) || !is_array($this->parameters['objectTypeIDs'])) {
43 throw new UserInputException('objectTypeIDs');
44 }
45 foreach ($this->parameters['objectTypeIDs'] as $objectTypeID) {
46 $objectType = ObjectTypeCache::getInstance()->getObjectType($objectTypeID);
47 if ($objectType === null) throw new UserInputException('objectTypeIDs');
48 }
49
50 // validate date grouping parameter
51 if (empty($this->parameters['dateGrouping'])) {
52 throw new UserInputException('objectTypeIDs');
53 }
54 }
55
56 /**
57 * Returns the stat data.
58 */
59 public function getData() {
60 $data = array();
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']));
64
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
68 ".$conditionBuilder."
69 GROUP BY EXTRACT(YEAR FROM date), objectTypeID
70 ORDER BY date";
71 }
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
75 ".$conditionBuilder."
76 GROUP BY EXTRACT(YEAR_MONTH FROM date), objectTypeID
77 ORDER BY date";
78 }
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
82 ".$conditionBuilder."
83 GROUP BY EXTRACT(YEAR FROM date), EXTRACT(WEEK FROM date), objectTypeID
84 ORDER BY date";
85 }
86 else {
87 $sql = "SELECT *
88 FROM wcf".WCF_N."_stat_daily
89 ".$conditionBuilder."
90 ORDER BY date";
91 }
92
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'];
98
99 $objectType = ObjectTypeCache::getInstance()->getObjectType($row['objectTypeID']);
100
101 if (!isset($data[$row['objectTypeID']])) {
102 $data[$row['objectTypeID']] = array(
103 'label' => WCF::getLanguage()->get('wcf.acp.stat.'.$objectType->objectType),
104 'data' => array()
105 );
106 }
107
108 $data[$row['objectTypeID']]['data'][] = array(strtotime($row['date'] . ' UTC'), $objectType->getProcessor()->getFormattedCounter($value));
109 }
110
111 return $data;
112 }
113 }