2 namespace wcf\data\like
;
3 use wcf\data\AbstractDatabaseObjectAction
;
4 use wcf\system\exception\PermissionDeniedException
;
5 use wcf\system\exception\UserInputException
;
6 use wcf\system\like\LikeHandler
;
7 use wcf\system\user\activity\event\UserActivityEventHandler
;
8 use wcf\system\user\GroupedUserList
;
12 * Executes like-related actions.
14 * @author Alexander Ebert
15 * @copyright 2001-2014 WoltLab GmbH
16 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
17 * @package com.woltlab.wcf
18 * @subpackage data.like
19 * @category Community Framework
21 class LikeAction
extends AbstractDatabaseObjectAction
{
23 * @see \wcf\data\AbstractDatabaseObjectAction::$allowGuestAccess
25 protected $allowGuestAccess = array('getLikeDetails');
28 * @see \wcf\data\AbstractDatabaseObjectAction::$className
30 protected $className = 'wcf\data\like\LikeEditor';
34 * @var \wcf\data\like\object\ILikeObject
36 public $likeableObject = null;
40 * @var \wcf\data\object\type\ObjectType
42 public $objectType = null;
45 * like object type provider object
46 * @var \wcf\data\like\ILikeObjectTypeProvider
48 public $objectTypeProvider = null;
51 * Validates parameters to fetch like details.
53 public function validateGetLikeDetails() {
54 $this->validateObjectParameters();
58 * Returns like details.
60 * @return array<string>
62 public function getLikeDetails() {
63 $sql = "SELECT userID, likeValue
64 FROM wcf".WCF_N
."_like
68 $statement = WCF
::getDB()->prepareStatement($sql);
69 $statement->execute(array(
70 $this->parameters
['data']['objectID'],
71 $this->objectType
->objectTypeID
74 Like
::LIKE
=> array(),
75 Like
::DISLIKE
=> array()
77 while ($row = $statement->fetchArray()) {
78 $data[$row['likeValue']][] = $row['userID'];
82 if (!empty($data[Like
::LIKE
])) {
83 $values[Like
::LIKE
] = new GroupedUserList(WCF
::getLanguage()->get('wcf.like.details.like'));
84 $values[Like
::LIKE
]->addUserIDs($data[Like
::LIKE
]);
86 if (!empty($data[Like
::DISLIKE
])) {
87 $values[Like
::DISLIKE
] = new GroupedUserList(WCF
::getLanguage()->get('wcf.like.details.dislike'));
88 $values[Like
::DISLIKE
]->addUserIDs($data[Like
::DISLIKE
]);
92 GroupedUserList
::loadUsers();
94 WCF
::getTPL()->assign(array(
95 'groupedUsers' => $values
99 'containerID' => $this->parameters
['data']['containerID'],
100 'template' => WCF
::getTPL()->fetch('groupedUserList')
105 * Validates parameters for like-related actions.
107 public function validateLike() {
108 $this->validateObjectParameters();
111 if (!WCF
::getUser()->userID ||
!WCF
::getSession()->getPermission('user.like.canLike')) {
112 throw new PermissionDeniedException();
115 // check if liking own content but forbidden by configuration
116 $this->likeableObject
= $this->objectTypeProvider
->getObjectByID($this->parameters
['data']['objectID']);
117 $this->likeableObject
->setObjectType($this->objectType
);
118 if (!LIKE_ALLOW_FOR_OWN_CONTENT
&& ($this->likeableObject
->getUserID() == WCF
::getUser()->userID
)) {
119 throw new PermissionDeniedException();
124 * @see \wcf\data\like\LikeAction::updateLike()
126 public function like() {
127 return $this->updateLike(Like
::LIKE
);
131 * @see \wcf\data\like\LikeAction::validateLike()
133 public function validateDislike() {
134 if (!LIKE_ENABLE_DISLIKE
) {
135 throw new PermissionDeniedException();
138 $this->validateLike();
142 * @see \wcf\data\like\LikeAction::updateLike()
144 public function dislike() {
145 return $this->updateLike(Like
::DISLIKE
);
149 * Sets like/dislike for an object, executing this method again with the same parameters
150 * will revert the status (removing like/dislike).
154 protected function updateLike($likeValue) {
155 $likeData = LikeHandler
::getInstance()->like($this->likeableObject
, WCF
::getUser(), $likeValue);
157 // handle activity event
158 if (UserActivityEventHandler
::getInstance()->getObjectTypeID($this->objectType
->objectType
.'.recentActivityEvent')) {
159 if ($likeData['data']['liked'] == 1) {
160 UserActivityEventHandler
::getInstance()->fireEvent($this->objectType
->objectType
.'.recentActivityEvent', $this->parameters
['data']['objectID']);
163 UserActivityEventHandler
::getInstance()->removeEvents($this->objectType
->objectType
.'.recentActivityEvent', array($this->parameters
['data']['objectID']));
169 'likes' => ($likeData['data']['likes'] === null) ?
0 : $likeData['data']['likes'],
170 'dislikes' => ($likeData['data']['dislikes'] === null) ?
0 : $likeData['data']['dislikes'],
171 'cumulativeLikes' => ($likeData['data']['cumulativeLikes'] === null) ?
0 : $likeData['data']['cumulativeLikes'],
172 'isLiked' => ($likeData['data']['liked'] == 1) ?
1 : 0,
173 'isDisliked' => ($likeData['data']['liked'] == -1) ?
1 : 0,
174 'containerID' => $this->parameters
['data']['containerID'],
175 'newValue' => $likeData['newValue'],
176 'oldValue' => $likeData['oldValue'],
177 'users' => $likeData['users']
182 * Validates permissions for given object.
184 protected function validateObjectParameters() {
186 throw new PermissionDeniedException();
189 $this->readString('containerID', false, 'data');
190 $this->readInteger('objectID', false, 'data');
191 $this->readString('objectType', false, 'data');
193 $this->objectType
= LikeHandler
::getInstance()->getObjectType($this->parameters
['data']['objectType']);
194 if ($this->objectType
=== null) {
195 throw new UserInputException('objectType');
198 $this->objectTypeProvider
= $this->objectType
->getProcessor();
199 $this->likeableObject
= $this->objectTypeProvider
->getObjectByID($this->parameters
['data']['objectID']);
200 $this->likeableObject
->setObjectType($this->objectType
);
201 if (!$this->objectTypeProvider
->checkPermissions($this->likeableObject
)) {
202 throw new PermissionDeniedException();