3 namespace wcf\data\comment
;
5 use wcf\data\comment\response\CommentResponseList
;
6 use wcf\data\comment\response\StructuredCommentResponse
;
7 use wcf\data\like\
object\LikeObject
;
8 use wcf\system\cache\runtime\UserProfileRuntimeCache
;
9 use wcf\system\comment\manager\ICommentManager
;
10 use wcf\system\reaction\ReactionHandler
;
13 * Provides a structured comment list fetching last responses for every comment.
15 * @author Alexander Ebert
16 * @copyright 2001-2019 WoltLab GmbH
17 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
18 * @package WoltLabSuite\Core\Data\Comment
20 * @method StructuredComment current()
21 * @method StructuredComment[] getObjects()
22 * @method StructuredComment|null search($objectID)
23 * @property StructuredComment[] $objects
25 class StructuredCommentList
extends CommentList
28 * comment manager object
29 * @var ICommentManager
31 public $commentManager;
34 * minimum comment time
37 public $minCommentTime = 0;
43 public $objectTypeID = 0;
52 * ids of the responses of the comments in the list
55 public $responseIDs = [];
60 public $decoratorClassName = StructuredComment
::class;
65 public $sqlLimit = 30;
70 public $sqlOrderBy = 'comment.time DESC';
73 * enables/disables the loading of responses
76 public $responseLoading = true;
79 * Creates a new structured comment list.
81 * @param ICommentManager $commentManager
82 * @param int $objectTypeID
83 * @param int $objectID
85 public function __construct(ICommentManager
$commentManager, $objectTypeID, $objectID)
87 parent
::__construct();
89 $this->commentManager
= $commentManager;
90 $this->objectTypeID
= $objectTypeID;
91 $this->objectID
= $objectID;
93 $this->getConditionBuilder()->add("comment.objectTypeID = ?", [$objectTypeID]);
94 $this->getConditionBuilder()->add("comment.objectID = ?", [$objectID]);
95 $this->sqlLimit
= $this->commentManager
->getCommentsPerPage();
97 if (!$this->commentManager
->canModerate($objectTypeID, $objectID)) {
98 $this->getConditionBuilder()->add('comment.isDisabled = 0');
105 public function readObjects()
107 parent
::readObjects();
109 $canModerate = $this->commentManager
->canModerate($this->objectTypeID
, $this->objectID
);
111 // fetch response ids
112 $responseIDs = $userIDs = [];
113 /** @var StructuredComment $comment */
114 foreach ($this->objects
as $comment) {
115 if (!$this->minCommentTime ||
$comment->time
< $this->minCommentTime
) {
116 $this->minCommentTime
= $comment->time
;
119 if ($this->responseLoading
) {
120 $commentResponseIDs = ($canModerate) ?
$comment->getUnfilteredResponseIDs() : $comment->getResponseIDs();
121 foreach ($commentResponseIDs as $responseID) {
122 $this->responseIDs
[] = $responseID;
123 $responseIDs[$responseID] = $comment->commentID
;
127 if ($comment->userID
) {
128 $userIDs[] = $comment->userID
;
131 $comment->setIsDeletable($this->commentManager
->canDeleteComment($comment->getDecoratedObject()));
132 $comment->setIsEditable($this->commentManager
->canEditComment($comment->getDecoratedObject()));
135 // fetch last responses
136 if (!empty($responseIDs)) {
137 $responseList = new CommentResponseList();
138 $responseList->setObjectIDs(\array_keys
($responseIDs));
139 $responseList->readObjects();
141 foreach ($responseList as $response) {
142 $response = new StructuredCommentResponse($response);
144 if (isset($this->objects
[$response->commentID
])) {
145 $response->setComment($this->objects
[$response->commentID
]->getDecoratedObject());
148 $response->setIsDeletable($this->commentManager
->canDeleteResponse($response->getDecoratedObject()));
149 $response->setIsEditable($this->commentManager
->canEditResponse($response->getDecoratedObject()));
151 $commentID = $responseIDs[$response->responseID
];
152 $this->objects
[$commentID]->addResponse($response);
154 if ($response->userID
) {
155 $userIDs[] = $response->userID
;
161 if (!empty($userIDs)) {
162 UserProfileRuntimeCache
::getInstance()->cacheObjectIDs(\array_unique
($userIDs));
167 * Fetches the like data.
169 * @return LikeObject[][]
171 public function getLikeData()
173 if (empty($this->objectIDs
)) {
178 $commentObjectType = ReactionHandler
::getInstance()->getObjectType('com.woltlab.wcf.comment');
179 ReactionHandler
::getInstance()->loadLikeObjects($commentObjectType, $this->getObjectIDs());
180 $likeData['comment'] = ReactionHandler
::getInstance()->getLikeObjects($commentObjectType);
182 if (!empty($this->responseIDs
)) {
183 $responseObjectType = ReactionHandler
::getInstance()->getObjectType('com.woltlab.wcf.comment.response');
184 ReactionHandler
::getInstance()->loadLikeObjects($responseObjectType, $this->responseIDs
);
185 $likeData['response'] = ReactionHandler
::getInstance()->getLikeObjects($responseObjectType);
192 * Returns minimum comment time.
196 public function getMinCommentTime()
198 return $this->minCommentTime
;
202 * Returns the comment manager object.
204 * @return ICommentManager
206 public function getCommentManager()
208 return $this->commentManager
;