2 namespace wcf\data\like
;
3 use wcf\data\AbstractDatabaseObjectAction
;
4 use wcf\data\IGroupedUserListAction
;
5 use wcf\system\exception\PermissionDeniedException
;
6 use wcf\system\exception\UserInputException
;
7 use wcf\system\like\LikeHandler
;
8 use wcf\system\user\activity\event\UserActivityEventHandler
;
9 use wcf\system\user\GroupedUserList
;
13 * Executes like-related actions.
15 * @author Alexander Ebert
16 * @copyright 2001-2014 WoltLab GmbH
17 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
18 * @package com.woltlab.wcf
19 * @subpackage data.like
20 * @category Community Framework
22 class LikeAction
extends AbstractDatabaseObjectAction
implements IGroupedUserListAction
{
24 * @see \wcf\data\AbstractDatabaseObjectAction::$allowGuestAccess
26 protected $allowGuestAccess = array('getGroupedUserList', 'getLikeDetails');
29 * @see \wcf\data\AbstractDatabaseObjectAction::$className
31 protected $className = 'wcf\data\like\LikeEditor';
35 * @var \wcf\data\like\object\ILikeObject
37 public $likeableObject = null;
41 * @var \wcf\data\object\type\ObjectType
43 public $objectType = null;
46 * like object type provider object
47 * @var \wcf\data\like\ILikeObjectTypeProvider
49 public $objectTypeProvider = null;
52 * Validates parameters to fetch like details.
54 public function validateGetLikeDetails() {
55 $this->validateObjectParameters();
59 * Returns like details.
61 * @return array<string>
63 public function getLikeDetails() {
64 $sql = "SELECT userID, likeValue
65 FROM wcf".WCF_N
."_like
69 $statement = WCF
::getDB()->prepareStatement($sql);
70 $statement->execute(array(
71 $this->parameters
['data']['objectID'],
72 $this->objectType
->objectTypeID
75 Like
::LIKE
=> array(),
76 Like
::DISLIKE
=> array()
78 while ($row = $statement->fetchArray()) {
79 $data[$row['likeValue']][] = $row['userID'];
83 if (!empty($data[Like
::LIKE
])) {
84 $values[Like
::LIKE
] = new GroupedUserList(WCF
::getLanguage()->get('wcf.like.details.like'));
85 $values[Like
::LIKE
]->addUserIDs($data[Like
::LIKE
]);
87 if (!empty($data[Like
::DISLIKE
])) {
88 $values[Like
::DISLIKE
] = new GroupedUserList(WCF
::getLanguage()->get('wcf.like.details.dislike'));
89 $values[Like
::DISLIKE
]->addUserIDs($data[Like
::DISLIKE
]);
93 GroupedUserList
::loadUsers();
95 WCF
::getTPL()->assign(array(
96 'groupedUsers' => $values
100 'containerID' => $this->parameters
['data']['containerID'],
101 'template' => WCF
::getTPL()->fetch('groupedUserList')
106 * Validates parameters for like-related actions.
108 public function validateLike() {
109 $this->validateObjectParameters();
112 if (!WCF
::getUser()->userID ||
!WCF
::getSession()->getPermission('user.like.canLike')) {
113 throw new PermissionDeniedException();
116 // check if liking own content but forbidden by configuration
117 $this->likeableObject
= $this->objectTypeProvider
->getObjectByID($this->parameters
['data']['objectID']);
118 $this->likeableObject
->setObjectType($this->objectType
);
119 if (!LIKE_ALLOW_FOR_OWN_CONTENT
&& ($this->likeableObject
->getUserID() == WCF
::getUser()->userID
)) {
120 throw new PermissionDeniedException();
125 * @see \wcf\data\like\LikeAction::updateLike()
127 public function like() {
128 return $this->updateLike(Like
::LIKE
);
132 * @see \wcf\data\like\LikeAction::validateLike()
134 public function validateDislike() {
135 if (!LIKE_ENABLE_DISLIKE
) {
136 throw new PermissionDeniedException();
139 $this->validateLike();
143 * @see \wcf\data\like\LikeAction::updateLike()
145 public function dislike() {
146 return $this->updateLike(Like
::DISLIKE
);
150 * Sets like/dislike for an object, executing this method again with the same parameters
151 * will revert the status (removing like/dislike).
155 protected function updateLike($likeValue) {
156 $likeData = LikeHandler
::getInstance()->like($this->likeableObject
, WCF
::getUser(), $likeValue);
158 // handle activity event
159 if (UserActivityEventHandler
::getInstance()->getObjectTypeID($this->objectType
->objectType
.'.recentActivityEvent')) {
160 if ($likeData['data']['liked'] == 1) {
161 UserActivityEventHandler
::getInstance()->fireEvent($this->objectType
->objectType
.'.recentActivityEvent', $this->parameters
['data']['objectID']);
164 UserActivityEventHandler
::getInstance()->removeEvents($this->objectType
->objectType
.'.recentActivityEvent', array($this->parameters
['data']['objectID']));
170 'likes' => ($likeData['data']['likes'] === null) ?
0 : $likeData['data']['likes'],
171 'dislikes' => ($likeData['data']['dislikes'] === null) ?
0 : $likeData['data']['dislikes'],
172 'cumulativeLikes' => ($likeData['data']['cumulativeLikes'] === null) ?
0 : $likeData['data']['cumulativeLikes'],
173 'isLiked' => ($likeData['data']['liked'] == 1) ?
1 : 0,
174 'isDisliked' => ($likeData['data']['liked'] == -1) ?
1 : 0,
175 'containerID' => $this->parameters
['data']['containerID'],
176 'newValue' => $likeData['newValue'],
177 'oldValue' => $likeData['oldValue'],
178 'users' => $likeData['users']
183 * Validates permissions for given object.
185 protected function validateObjectParameters() {
187 throw new PermissionDeniedException();
190 $this->readString('containerID', false, 'data');
191 $this->readInteger('objectID', false, 'data');
192 $this->readString('objectType', false, 'data');
194 $this->objectType
= LikeHandler
::getInstance()->getObjectType($this->parameters
['data']['objectType']);
195 if ($this->objectType
=== null) {
196 throw new UserInputException('objectType');
199 $this->objectTypeProvider
= $this->objectType
->getProcessor();
200 $this->likeableObject
= $this->objectTypeProvider
->getObjectByID($this->parameters
['data']['objectID']);
201 $this->likeableObject
->setObjectType($this->objectType
);
202 if (!$this->objectTypeProvider
->checkPermissions($this->likeableObject
)) {
203 throw new PermissionDeniedException();
208 * @see \wcf\data\IGroupedUserListAction::validateGetGroupedUserList()
210 public function validateGetGroupedUserList() {
211 $this->validateObjectParameters();
213 $this->readInteger('pageNo');
217 * @see \wcf\data\IGroupedUserListAction::getGroupedUserList()
219 public function getGroupedUserList() {
220 // fetch number of pages
221 $sql = "SELECT COUNT(*)
222 FROM wcf".WCF_N
."_like
224 AND objectTypeID = ?";
225 $statement = WCF
::getDB()->prepareStatement($sql);
226 $statement->execute(array(
227 $this->parameters
['data']['objectID'],
228 $this->objectType
->objectTypeID
230 $pageCount = ceil($statement->fetchColumn() / 20);
232 $sql = "SELECT userID, likeValue
233 FROM wcf".WCF_N
."_like
236 ORDER BY likeValue DESC, time DESC";
237 $statement = WCF
::getDB()->prepareStatement($sql, 20, ($this->parameters
['pageNo'] - 1) * 20);
238 $statement->execute(array(
239 $this->parameters
['data']['objectID'],
240 $this->objectType
->objectTypeID
243 Like
::LIKE
=> array(),
244 Like
::DISLIKE
=> array()
246 while ($row = $statement->fetchArray()) {
247 $data[$row['likeValue']][] = $row['userID'];
251 if (!empty($data[Like
::LIKE
])) {
252 $values[Like
::LIKE
] = new GroupedUserList(WCF
::getLanguage()->get('wcf.like.details.like'));
253 $values[Like
::LIKE
]->addUserIDs($data[Like
::LIKE
]);
255 if (!empty($data[Like
::DISLIKE
])) {
256 $values[Like
::DISLIKE
] = new GroupedUserList(WCF
::getLanguage()->get('wcf.like.details.dislike'));
257 $values[Like
::DISLIKE
]->addUserIDs($data[Like
::DISLIKE
]);
260 // load user profiles
261 GroupedUserList
::loadUsers();
263 WCF
::getTPL()->assign(array(
264 'groupedUsers' => $values
268 'containerID' => $this->parameters
['data']['containerID'],
269 'pageCount' => $pageCount,
270 'template' => WCF
::getTPL()->fetch('groupedUserList')