Merge branch '3.0'
[GitHub/WoltLab/WCF.git] / wcfsetup / install / files / lib / data / comment / StructuredCommentList.class.php
CommitLineData
285b1d92
MW
1<?php
2namespace wcf\data\comment;
3use wcf\data\comment\response\CommentResponseList;
4use wcf\data\comment\response\StructuredCommentResponse;
9a66ae92
MS
5use wcf\data\like\object\LikeObject;
6use wcf\system\cache\runtime\UserProfileRuntimeCache;
285b1d92
MW
7use wcf\system\comment\manager\ICommentManager;
8use wcf\system\like\LikeHandler;
9
10/**
11 * Provides a structured comment list fetching last responses for every comment.
12 *
13 * @author Alexander Ebert
c839bd49 14 * @copyright 2001-2018 WoltLab GmbH
285b1d92 15 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
e71525e4 16 * @package WoltLabSuite\Core\Data\Comment
e82bf444
MS
17 *
18 * @method StructuredComment current()
19 * @method StructuredComment[] getObjects()
20 * @method StructuredComment|null search($objectID)
81952e86 21 * @property StructuredComment[] $objects
285b1d92
MW
22 */
23class StructuredCommentList extends CommentList {
24 /**
25 * comment manager object
9a66ae92 26 * @var ICommentManager
285b1d92
MW
27 */
28 public $commentManager = null;
29
30 /**
31 * minimum comment time
32 * @var integer
33 */
34 public $minCommentTime = 0;
35
36 /**
37 * object type id
38 * @var integer
39 */
40 public $objectTypeID = 0;
41
42 /**
43 * object id
44 * @var integer
45 */
46 public $objectID = 0;
47
48 /**
49 * ids of the responses of the comments in the list
9a66ae92 50 * @var integer[]
285b1d92 51 */
9a66ae92 52 public $responseIDs = [];
285b1d92 53
55baeaac 54 /**
9a66ae92 55 * @inheritDoc
55baeaac
MS
56 */
57 public $decoratorClassName = StructuredComment::class;
58
285b1d92 59 /**
9a66ae92 60 * @inheritDoc
285b1d92 61 */
9d007b40 62 public $sqlLimit = 30;
285b1d92
MW
63
64 /**
9a66ae92 65 * @inheritDoc
285b1d92
MW
66 */
67 public $sqlOrderBy = 'comment.time DESC';
68
4e84b0ee
AE
69 /**
70 * enables/disables the loading of responses
71 * @var boolean
72 */
73 public $responseLoading = true;
74
285b1d92
MW
75 /**
76 * Creates a new structured comment list.
77 *
9a66ae92
MS
78 * @param ICommentManager $commentManager
79 * @param integer $objectTypeID
80 * @param integer $objectID
285b1d92
MW
81 */
82 public function __construct(ICommentManager $commentManager, $objectTypeID, $objectID) {
83 parent::__construct();
84
85 $this->commentManager = $commentManager;
86 $this->objectTypeID = $objectTypeID;
87 $this->objectID = $objectID;
88
9a66ae92
MS
89 $this->getConditionBuilder()->add("comment.objectTypeID = ?", [$objectTypeID]);
90 $this->getConditionBuilder()->add("comment.objectID = ?", [$objectID]);
285b1d92 91 $this->sqlLimit = $this->commentManager->getCommentsPerPage();
7bcb4d8d
AE
92
93 if (!$this->commentManager->canModerate($objectTypeID, $objectID)) {
cc2b69dd 94 $this->getConditionBuilder()->add('comment.isDisabled = 0');
7bcb4d8d 95 }
285b1d92
MW
96 }
97
98 /**
9a66ae92 99 * @inheritDoc
285b1d92
MW
100 */
101 public function readObjects() {
102 parent::readObjects();
103
cc2b69dd
AE
104 $canModerate = $this->commentManager->canModerate($this->objectTypeID, $this->objectID);
105
ebe32443 106 // fetch response ids
9a66ae92 107 $responseIDs = $userIDs = [];
4e84b0ee 108 /** @var Comment $comment */
55baeaac 109 foreach ($this->objects as $comment) {
285b1d92 110 if (!$this->minCommentTime || $comment->time < $this->minCommentTime) $this->minCommentTime = $comment->time;
4e84b0ee
AE
111
112 if ($this->responseLoading) {
cc2b69dd 113 $commentResponseIDs = ($canModerate) ? $comment->getUnfilteredResponseIDs() : $comment->getResponseIDs();
4e84b0ee
AE
114 foreach ($commentResponseIDs as $responseID) {
115 $this->responseIDs[] = $responseID;
116 $responseIDs[$responseID] = $comment->commentID;
117 }
118 }
119
b9f4bd69
MS
120 if ($comment->userID) {
121 $userIDs[] = $comment->userID;
122 }
285b1d92 123
285b1d92
MW
124 $comment->setIsDeletable($this->commentManager->canDeleteComment($comment->getDecoratedObject()));
125 $comment->setIsEditable($this->commentManager->canEditComment($comment->getDecoratedObject()));
126 }
285b1d92
MW
127
128 // fetch last responses
c1687129 129 if (!empty($responseIDs)) {
285b1d92 130 $responseList = new CommentResponseList();
cc2b69dd 131 $responseList->setObjectIDs(array_keys($responseIDs));
285b1d92
MW
132 $responseList->readObjects();
133
134 foreach ($responseList as $response) {
135 $response = new StructuredCommentResponse($response);
bec69029
AE
136
137 if (isset($this->objects[$response->commentID])) {
138 $response->setComment($this->objects[$response->commentID]->getDecoratedObject());
139 }
140
285b1d92
MW
141 $response->setIsDeletable($this->commentManager->canDeleteResponse($response->getDecoratedObject()));
142 $response->setIsEditable($this->commentManager->canEditResponse($response->getDecoratedObject()));
143
144 $commentID = $responseIDs[$response->responseID];
145 $this->objects[$commentID]->addResponse($response);
146
b9f4bd69
MS
147 if ($response->userID) {
148 $userIDs[] = $response->userID;
149 }
285b1d92
MW
150 }
151 }
152
3b5fb8ef 153 // cache user ids
285b1d92 154 if (!empty($userIDs)) {
9a66ae92 155 UserProfileRuntimeCache::getInstance()->cacheObjectIDs(array_unique($userIDs));
285b1d92
MW
156 }
157 }
158
159 /**
160 * Fetches the like data.
161 *
9a66ae92 162 * @return LikeObject[][]
285b1d92
MW
163 */
164 public function getLikeData() {
9a66ae92 165 if (empty($this->objectIDs)) return [];
285b1d92 166
9a66ae92 167 $likeData = [];
285b1d92
MW
168 $commentObjectType = LikeHandler::getInstance()->getObjectType('com.woltlab.wcf.comment');
169 LikeHandler::getInstance()->loadLikeObjects($commentObjectType, $this->getObjectIDs());
170 $likeData['comment'] = LikeHandler::getInstance()->getLikeObjects($commentObjectType);
171
172 if (!empty($this->responseIDs)) {
173 $responseObjectType = LikeHandler::getInstance()->getObjectType('com.woltlab.wcf.comment.response');
174 LikeHandler::getInstance()->loadLikeObjects($responseObjectType, $this->responseIDs);
175 $likeData['response'] = LikeHandler::getInstance()->getLikeObjects($responseObjectType);
176 }
177
178 return $likeData;
179 }
180
181 /**
182 * Returns minimum comment time.
183 *
184 * @return integer
185 */
186 public function getMinCommentTime() {
187 return $this->minCommentTime;
188 }
166d2b91
MW
189
190 /**
191 * Returns the comment manager object.
192 *
9a66ae92 193 * @return ICommentManager
166d2b91
MW
194 */
195 public function getCommentManager() {
196 return $this->commentManager;
197 }
285b1d92 198}