Commit | Line | Data |
---|---|---|
285b1d92 MW |
1 | <?php |
2 | namespace wcf\data\comment; | |
3 | use wcf\data\comment\response\CommentResponseList; | |
4 | use wcf\data\comment\response\StructuredCommentResponse; | |
9a66ae92 MS |
5 | use wcf\data\like\object\LikeObject; |
6 | use wcf\system\cache\runtime\UserProfileRuntimeCache; | |
285b1d92 MW |
7 | use wcf\system\comment\manager\ICommentManager; |
8 | use 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 | */ |
23 | class 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 | } |