3 namespace wcf\data\user
;
5 use wcf\data\DatabaseObject
;
6 use wcf\data\IGroupedUserListAction
;
7 use wcf\data\user\option\UserOption
;
8 use wcf\system\cache\builder\UserOptionCacheBuilder
;
9 use wcf\system\cache\runtime\UserProfileRuntimeCache
;
10 use wcf\system\exception\UserInputException
;
11 use wcf\system\user\UserBirthdayCache
;
15 * Shows a list of user birthdays.
18 * @copyright 2001-2019 WoltLab GmbH
19 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
20 * @package WoltLabSuite\Core\Data\User
22 class UserBirthdayAction
extends UserProfileAction
implements IGroupedUserListAction
27 protected $allowGuestAccess = ['getGroupedUserList'];
32 public function validateGetGroupedUserList()
34 $this->readString('date');
35 $this->readString('sortField', true);
36 $this->readString('sortOrder', true);
38 if (!\
preg_match('/\d{4}-\d{2}-\d{2}/', $this->parameters
['date'])) {
39 throw new UserInputException();
42 if ($this->parameters
['sortField'] && $this->parameters
['sortOrder']) {
43 if (!\
in_array($this->parameters
['sortField'], ['username', 'activityPoints', 'registrationDate'])) {
44 throw new UserInputException('sortField');
47 if (!\
in_array($this->parameters
['sortOrder'], ['ASC', 'DESC'])) {
48 throw new UserInputException('sortOrder');
56 public function getGroupedUserList()
58 $year = $month = $day = 0;
59 $value = \
explode('-', $this->parameters
['date']);
60 if (isset($value[0])) {
61 $year = \
intval($value[0]);
63 if (isset($value[1])) {
64 $month = \
intval($value[1]);
66 if (isset($value[2])) {
67 $day = \
intval($value[2]);
72 $userOptions = UserOptionCacheBuilder
::getInstance()->getData([], 'options');
73 if (isset($userOptions['birthday'])) {
74 /** @var UserOption $birthdayUserOption */
75 $birthdayUserOption = $userOptions['birthday'];
77 $userIDs = UserBirthdayCache
::getInstance()->getBirthdays($month, $day);
78 $userProfiles = UserProfileRuntimeCache
::getInstance()->getObjects($userIDs);
80 foreach ($userProfiles as $user) {
81 $birthdayUserOption->setUser($user->getDecoratedObject());
83 if (!$user->isProtected() && $birthdayUserOption->isVisible() && $user->getAge($year) >= 0) {
89 if ($this->parameters
['sortField'] && $this->parameters
['sortOrder']) {
90 DatabaseObject
::sort($users, $this->parameters
['sortField'], $this->parameters
['sortOrder']);
93 WCF
::getTPL()->assign([
100 'template' => WCF
::getTPL()->fetch('userBirthdayList'),