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