Fixed time zone calculation issue
[GitHub/WoltLab/WCF.git] / wcfsetup / install / files / lib / system / option / BirthdayOptionType.class.php
1 <?php
2 namespace wcf\system\option;
3 use wcf\data\option\Option;
4 use wcf\data\user\User;
5 use wcf\system\database\util\PreparedStatementConditionBuilder;
6 use wcf\system\exception\UserInputException;
7 use wcf\system\WCF;
8 use wcf\util\DateUtil;
9
10 /**
11 * Option type implementation for birthday input fields.
12 *
13 * @author Marcel Werk
14 * @copyright 2001-2014 WoltLab GmbH
15 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
16 * @package com.woltlab.wcf
17 * @subpackage system.option
18 * @category Community Framework
19 */
20 class BirthdayOptionType extends DateOptionType {
21 /**
22 * input css class
23 * @var string
24 */
25 protected $inputClass = 'birthday';
26
27 /**
28 * @see \wcf\system\option\IOptionType::getFormElement()
29 */
30 public function validate(Option $option, $newValue) {
31 parent::validate($option, $newValue);
32
33 if (empty($newValue)) return;
34
35 $timestamp = @strtotime($newValue);
36 if ($timestamp > TIME_NOW) {
37 throw new UserInputException($option->optionName, 'validationFailed');
38 }
39 }
40
41 /**
42 * @see \wcf\system\option\IOptionType::getFormElement()
43 */
44 public function getFormElement(Option $option, $value) {
45 if ($value == '0000-00-00') $value = '';
46
47 return parent::getFormElement($option, $value);
48 }
49
50 /**
51 * @see \wcf\system\option\ISearchableUserOption::getSearchFormElement()
52 */
53 public function getSearchFormElement(Option $option, $value) {
54 $ageFrom = $ageTo = '';
55 if (!empty($value['ageFrom'])) $ageFrom = intval($value['ageFrom']);
56 if (!empty($value['ageTo'])) $ageTo = intval($value['ageTo']);
57
58 WCF::getTPL()->assign(array(
59 'option' => $option,
60 'valueAgeFrom' => $ageFrom,
61 'valueAgeTo' => $ageTo
62 ));
63 return WCF::getTPL()->fetch('birthdaySearchableOptionType');
64 }
65
66 /**
67 * @see \wcf\system\option\ISearchableUserOption::getCondition()
68 */
69 public function getCondition(PreparedStatementConditionBuilder &$conditions, Option $option, $value) {
70 if (empty($value['ageFrom']) || empty($value['ageTo'])) return false;
71
72 $ageFrom = intval($value['ageFrom']);
73 $ageTo = intval($value['ageTo']);
74 if ($ageFrom < 0 || $ageFrom > 120) return false;
75 if ($ageTo < 0 || $ageTo > 120) return false;
76 if (!$ageFrom || !$ageTo) return false;
77
78 $dateFrom = DateUtil::getDateTimeByTimestamp(TIME_NOW)->sub(new \DateInterval('P'.($ageTo + 1).'Y'))->add(new \DateInterval('P1D'));
79 $dateTo = DateUtil::getDateTimeByTimestamp(TIME_NOW)->sub(new \DateInterval('P'.$ageFrom.'Y'));
80
81 $conditions->add("option_value.userOption".User::getUserOptionID('birthdayShowYear')." = ? AND option_value.userOption".$option->optionID." BETWEEN DATE(?) AND DATE(?)", array(1, $dateFrom->format('Y-m-d'), $dateTo->format('Y-m-d')));
82 return true;
83 }
84 }