Merge branch 'master' into next
[GitHub/WoltLab/WCF.git] / wcfsetup / install / files / lib / system / condition / UserRegistrationDateCondition.class.php
1 <?php
2 namespace wcf\system\condition;
3 use wcf\data\condition\Condition;
4 use wcf\data\user\User;
5 use wcf\data\user\UserList;
6 use wcf\data\DatabaseObjectList;
7 use wcf\system\exception\UserInputException;
8 use wcf\system\WCF;
9
10 /**
11 * Condition implementation for the registration date of a user.
12 *
13 * @author Matthias Schmidt
14 * @copyright 2001-2015 WoltLab GmbH
15 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
16 * @package com.woltlab.wcf
17 * @subpackage system.condition
18 * @category Community Framework
19 */
20 class UserRegistrationDateCondition extends AbstractSingleFieldCondition implements IContentCondition, IObjectListCondition, IUserCondition {
21 use TObjectListUserCondition;
22
23 /**
24 * @see \wcf\system\condition\AbstractSingleFieldCondition::$label
25 */
26 protected $label = 'wcf.user.condition.registrationDate';
27
28 /**
29 * registration start date
30 * @var string
31 */
32 protected $registrationDateEnd = '';
33
34 /**
35 * registration start date
36 * @var string
37 */
38 protected $registrationDateStart = '';
39
40 /**
41 * @see \wcf\system\condition\IObjectListCondition::addObjectListCondition()
42 */
43 public function addObjectListCondition(DatabaseObjectList $objectList, array $conditionData) {
44 if (!($objectList instanceof UserList)) return;
45
46 if (isset($conditionData['registrationDateEnd'])) {
47 $objectList->getConditionBuilder()->add('user_table.registrationDate < ?', array(strtotime($conditionData['registrationDateEnd']) + 86400));
48 }
49 if (isset($conditionData['registrationDateStart'])) {
50 $objectList->getConditionBuilder()->add('user_table.registrationDate >= ?', array(strtotime($conditionData['registrationDateStart'])));
51 }
52 }
53
54 /**
55 * @see \wcf\system\condition\IUserCondition::checkUser()
56 */
57 public function checkUser(Condition $condition, User $user) {
58 if ($condition->registrationDateStart !== null && $user->registrationDate < strtotime($condition->registrationDateStart)) {
59 return false;
60 }
61 if ($condition->registrationDateEnd !== null && $user->registrationDate >= strtotime($condition->registrationDateEnd) + 86400) {
62 return false;
63 }
64
65 return true;
66 }
67
68 /**
69 * @see \wcf\system\condition\ICondition::getData()
70 */
71 public function getData() {
72 $data = array();
73
74 if (strlen($this->registrationDateStart)) {
75 $data['registrationDateStart'] = $this->registrationDateStart;
76 }
77 if (strlen($this->registrationDateEnd)) {
78 $data['registrationDateEnd'] = $this->registrationDateEnd;
79 }
80
81 if (!empty($data)) {
82 return $data;
83 }
84
85 return null;
86 }
87
88 /**
89 * @see \wcf\system\condition\AbstractSingleFieldCondition::getFieldElement()
90 */
91 protected function getFieldElement() {
92 $start = WCF::getLanguage()->get('wcf.date.period.start');
93 $end = WCF::getLanguage()->get('wcf.date.period.end');
94
95 return <<<HTML
96 <input type="date" id="registrationDateStart" name="registrationDateStart" value="{$this->registrationDateStart}" placeholder="{$start}" />
97 <input type="date" id="registrationDateEnd" name="registrationDateEnd" value="{$this->registrationDateEnd}" placeholder="{$end}" />
98 HTML;
99 }
100
101 /**
102 * @see \wcf\system\condition\ICondition::readFormParameters()
103 */
104 public function readFormParameters() {
105 if (isset($_POST['registrationDateEnd'])) $this->registrationDateEnd = $_POST['registrationDateEnd'];
106 if (isset($_POST['registrationDateStart'])) $this->registrationDateStart = $_POST['registrationDateStart'];
107 }
108
109 /**
110 * @see \wcf\system\condition\ICondition::reset()
111 */
112 public function reset() {
113 $this->registrationDateEnd = '';
114 $this->registrationDateStart = '';
115 }
116
117 /**
118 * @see \wcf\system\condition\ICondition::setData()
119 */
120 public function setData(Condition $condition) {
121 if ($condition->registrationDateEnd) {
122 $this->registrationDateEnd = $condition->registrationDateEnd;
123 }
124 if ($condition->registrationDateStart) {
125 $this->registrationDateStart = $condition->registrationDateStart;
126 }
127 }
128
129 /**
130 * @see \wcf\system\condition\ICondition::validate()
131 */
132 public function validate() {
133 $registrationDateEnd = $registrationDateStart = null;
134 if (strlen($this->registrationDateStart)) {
135 $registrationDateStart = @strtotime($this->registrationDateStart);
136 if ($registrationDateStart === false) {
137 $this->errorMessage = 'wcf.condition.timestamp.error.startNotValid';
138
139 throw new UserInputException('registrationDate', 'startNotValid');
140 }
141 }
142 if (strlen($this->registrationDateEnd)) {
143 $registrationDateEnd = @strtotime($this->registrationDateEnd);
144 if ($registrationDateEnd === false) {
145 $this->errorMessage = 'wcf.condition.timestamp.error.endNotValid';
146
147 throw new UserInputException('registrationDate', 'endNotValid');
148 }
149 }
150
151 if ($registrationDateEnd !== null && $registrationDateStart !== null && $registrationDateEnd < $registrationDateStart) {
152 $this->errorMessage = 'wcf.condition.timestamp.error.endBeforeStart';
153
154 throw new UserInputException('registrationDate', 'endBeforeStart');
155 }
156 }
157
158 /**
159 * @see \wcf\system\condition\IContentCondition::showContent()
160 */
161 public function showContent(Condition $condition) {
162 if (!WCF::getUser()->userID) return false;
163
164 return $this->checkUser($condition, WCF::getUser());
165 }
166 }