2 namespace wcf\system\message
;
3 use wcf\data\DatabaseObjectDecorator
;
4 use wcf\data\IAttachmentMessageQuickReplyAction
;
6 use wcf\data\IMessageQuickReplyAction
;
7 use wcf\system\bbcode\PreParser
;
8 use wcf\system\event\EventHandler
;
9 use wcf\system\exception\SystemException
;
10 use wcf\system\exception\UserInputException
;
11 use wcf\system\SingletonFactory
;
13 use wcf\util\ArrayUtil
;
14 use wcf\util\ClassUtil
;
15 use wcf\util\MessageUtil
;
16 use wcf\util\StringUtil
;
19 * Manages quick replies and stored messages.
21 * @author Alexander Ebert
22 * @copyright 2001-2014 WoltLab GmbH
23 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
24 * @package com.woltlab.wcf
25 * @subpackage system.message
26 * @category Community Framework
28 class QuickReplyManager
extends SingletonFactory
{
30 * list of allowed bbcodes
33 public $allowedBBodes = null;
37 * @var \wcf\data\DatabaseObject
39 public $container = null;
57 public $additionalFields = array();
60 * the message that just was created
61 * @var \wcf\data\DatabaseObject
63 public $message = null;
66 * Returns a stored message from session.
69 * @param integer $objectID
72 public function getMessage($type, $objectID) {
74 $this->objectID
= $objectID;
76 // allow manipulation before fetching data
77 EventHandler
::getInstance()->fireAction($this, 'getMessage');
79 $message = WCF
::getSession()->getVar('quickReply-'.$this->type
.'-'.$this->objectID
);
80 return ($message === null ?
'' : $message);
84 * Stores a message in session.
87 * @param integer $objectID
88 * @param string $message
90 public function setMessage($type, $objectID, $message) {
91 WCF
::getSession()->register('quickReply-'.$type.'-'.$objectID, $message);
95 * Removes a stored message from session.
98 * @param integer $objectID
100 public function removeMessage($type, $objectID) {
101 WCF
::getSession()->unregister('quickReply-'.$this->type
.'-'.$objectID);
105 * Sets the allowed bbcodes.
107 * @param array<string> $allowedBBCodes
109 public function setAllowedBBCodes(array $allowedBBCodes = null) {
110 $this->allowedBBodes
= $allowedBBCodes;
114 * Validates parameters for current request.
116 * @param \wcf\system\message\IMessageQuickReplyAction $object
117 * @param array<array> $parameters
118 * @param string $containerClassName
119 * @param string $containerDecoratorClassName
121 public function validateParameters(IMessageQuickReplyAction
$object, array &$parameters, $containerClassName, $containerDecoratorClassName = '') {
122 if (!isset($parameters['data']['message']) ||
empty($parameters['data']['message'])) {
123 throw new UserInputException('message');
126 $parameters['lastPostTime'] = (isset($parameters['lastPostTime'])) ?
intval($parameters['lastPostTime']) : 0;
127 if (!$parameters['lastPostTime']) {
128 throw new UserInputException('lastPostTime');
131 $parameters['pageNo'] = (isset($parameters['pageNo'])) ?
intval($parameters['pageNo']) : 0;
132 if (!$parameters['pageNo']) {
133 throw new UserInputException('pageNo');
136 $parameters['objectID'] = (isset($parameters['objectID'])) ?
intval($parameters['objectID']) : 0;
137 if (!$parameters['objectID']) {
138 throw new UserInputException('objectID');
141 $this->container
= new $containerClassName($parameters['objectID']);
142 if (!empty($containerDecoratorClassName)) {
143 if (!ClassUtil
::isInstanceOf($containerDecoratorClassName, 'wcf\data\DatabaseObjectDecorator')) {
144 throw new SystemException("'".$containerDecoratorClassName."' does not extend 'wcf\data\DatabaseObjectDecorator'");
147 $this->container
= new $containerDecoratorClassName($this->container
);
149 $object->validateContainer($this->container
);
152 $object->validateMessage($this->container
, $parameters['data']['message']);
154 // check for message quote ids
155 $parameters['removeQuoteIDs'] = (isset($parameters['removeQuoteIDs']) && is_array($parameters['removeQuoteIDs'])) ? ArrayUtil
::trim($parameters['removeQuoteIDs']) : array();
157 // check for tmp hash (attachments)
158 $parameters['tmpHash'] = (isset($parameters['tmpHash'])) ? StringUtil
::trim($parameters['tmpHash']) : '';
160 EventHandler
::getInstance()->fireAction($this, 'validateParameters');
164 * Creates a new message and returns the parsed template.
166 * @param \wcf\data\IMessageQuickReplyAction $object
167 * @param array<array> $parameters
168 * @param string $containerActionClassName
169 * @param string $sortOrder
170 * @param string $templateName
171 * @param string $application
174 public function createMessage(IMessageQuickReplyAction
$object, array &$parameters, $containerActionClassName, $sortOrder, $templateName, $application = 'wcf') {
175 EventHandler
::getInstance()->fireAction($this, 'createMessage');
177 $tableIndexName = call_user_func(array($this->container
, 'getDatabaseTableIndexName'));
178 $parameters['data'][$tableIndexName] = $parameters['objectID'];
179 $parameters['data']['enableSmilies'] = WCF
::getSession()->getPermission('user.message.canUseSmilies');
180 $parameters['data']['enableHtml'] = 0;
181 $parameters['data']['enableBBCodes'] = WCF
::getSession()->getPermission('user.message.canUseBBCodes');
182 $parameters['data']['showSignature'] = (WCF
::getUser()->userID ? WCF
::getUser()->showSignature
: 0);
183 $parameters['data']['time'] = TIME_NOW
;
184 $parameters['data']['userID'] = WCF
::getUser()->userID ?
: null;
185 $parameters['data']['username'] = WCF
::getUser()->username
;
187 // pre-parse message text
188 $parameters['data']['message'] = MessageUtil
::stripCrap($parameters['data']['message']);
189 $parameters['data']['message'] = PreParser
::getInstance()->parse($parameters['data']['message'], $this->allowedBBodes
);
191 $parameters['data'] = array_merge($this->additionalFields
, $parameters['data']);
193 // attachment support
194 if (MODULE_ATTACHMENT
&& $object instanceof IAttachmentMessageQuickReplyAction
) {
195 $parameters['attachmentHandler'] = $object->getAttachmentHandler($this->container
);
199 $this->additionalFields
= array();
201 $this->message
= $object->create();
202 EventHandler
::getInstance()->fireAction($this, 'createdMessage');
203 $message = $this->message
;
206 $this->message
= null;
208 if ($message instanceof IMessage
&& !$message->isVisible()) {
214 // resolve the page no
215 list($pageNo, $count) = $object->getPageNo($this->container
);
217 // we're still on current page
218 if ($pageNo == $parameters['pageNo']) {
219 // check for additional messages
220 $messageList = $object->getMessageList($this->container
, $parameters['lastPostTime']);
222 // calculate start index
223 $startIndex = $count - (count($messageList) - 1);
225 WCF
::getTPL()->assign(array(
226 'attachmentList' => $messageList->getAttachmentList(),
227 'container' => $this->container
,
228 'objects' => $messageList,
229 'startIndex' => $startIndex,
230 'sortOrder' => $sortOrder,
233 // assign 'to top' link
234 if (isset($parameters['anchor'])) {
235 WCF
::getTPL()->assign('anchor', $parameters['anchor']);
238 // update visit time (messages shouldn't occur as new upon next visit)
239 if (ClassUtil
::isInstanceOf($containerActionClassName, 'wcf\data\IVisitableObjectAction')) {
240 $containerAction = new $containerActionClassName(array(($this->container
instanceof DatabaseObjectDecorator ?
$this->container
->getDecoratedObject() : $this->container
)), 'markAsRead');
241 $containerAction->executeAction();
245 'lastPostTime' => $message->time
,
246 'template' => WCF
::getTPL()->fetch($templateName, $application)
252 'url' => $object->getRedirectUrl($this->container
, $message)
258 * Returns the container object.
260 * @return \wcf\data\DatabaseObject
262 public function getContainer() {
263 return $this->container
;