2 namespace wcf\system\message
;
3 use wcf\data\DatabaseObjectDecorator
;
5 use wcf\data\IMessageQuickReplyAction
;
6 use wcf\system\bbcode\PreParser
;
7 use wcf\system\event\EventHandler
;
8 use wcf\system\exception\SystemException
;
9 use wcf\system\exception\UserInputException
;
10 use wcf\system\SingletonFactory
;
12 use wcf\util\ArrayUtil
;
13 use wcf\util\ClassUtil
;
14 use wcf\util\MessageUtil
;
17 * Manages quick replies and stored messages.
19 * @author Alexander Ebert
20 * @copyright 2001-2014 WoltLab GmbH
21 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
22 * @package com.woltlab.wcf
23 * @subpackage system.message
24 * @category Community Framework
26 class QuickReplyManager
extends SingletonFactory
{
28 * list of allowed bbcodes
31 public $allowedBBodes = null;
35 * @var \wcf\data\DatabaseObject
37 public $container = null;
52 * Returns a stored message from session.
55 * @param integer $objectID
58 public function getMessage($type, $objectID) {
60 $this->objectID
= $objectID;
62 // allow manipulation before fetching data
63 EventHandler
::getInstance()->fireAction($this, 'getMessage');
65 $message = WCF
::getSession()->getVar('quickReply-'.$this->type
.'-'.$this->objectID
);
66 return ($message === null ?
'' : $message);
70 * Stores a message in session.
73 * @param integer $objectID
74 * @param string $message
76 public function setMessage($type, $objectID, $message) {
77 WCF
::getSession()->register('quickReply-'.$type.'-'.$objectID, $message);
81 * Removes a stored message from session.
84 * @param integer $objectID
86 public function removeMessage($type, $objectID) {
87 WCF
::getSession()->unregister('quickReply-'.$this->type
.'-'.$objectID);
91 * Sets the allowed bbcodes.
93 * @param array<string> $allowedBBCodes
95 public function setAllowedBBCodes(array $allowedBBCodes = null) {
96 $this->allowedBBodes
= $allowedBBCodes;
100 * Validates parameters for current request.
102 * @param \wcf\system\message\IMessageQuickReplyAction $object
103 * @param array<array> $parameters
104 * @param string $containerClassName
105 * @param string $containerDecoratorClassName
107 public function validateParameters(IMessageQuickReplyAction
$object, array &$parameters, $containerClassName, $containerDecoratorClassName = '') {
108 if (!isset($parameters['data']['message']) ||
empty($parameters['data']['message'])) {
109 throw new UserInputException('message');
112 $parameters['lastPostTime'] = (isset($parameters['lastPostTime'])) ?
intval($parameters['lastPostTime']) : 0;
113 if (!$parameters['lastPostTime']) {
114 throw new UserInputException('lastPostTime');
117 $parameters['pageNo'] = (isset($parameters['pageNo'])) ?
intval($parameters['pageNo']) : 0;
118 if (!$parameters['pageNo']) {
119 throw new UserInputException('pageNo');
122 $parameters['objectID'] = (isset($parameters['objectID'])) ?
intval($parameters['objectID']) : 0;
123 if (!$parameters['objectID']) {
124 throw new UserInputException('objectID');
127 $this->container
= new $containerClassName($parameters['objectID']);
128 if (!empty($containerDecoratorClassName)) {
129 if (!ClassUtil
::isInstanceOf($containerDecoratorClassName, 'wcf\data\DatabaseObjectDecorator')) {
130 throw new SystemException("'".$containerDecoratorClassName."' does not extend 'wcf\data\DatabaseObjectDecorator'");
133 $this->container
= new $containerDecoratorClassName($this->container
);
135 $object->validateContainer($this->container
);
138 $object->validateMessage($this->container
, $parameters['data']['message']);
140 // check for message quote ids
141 $parameters['removeQuoteIDs'] = (isset($parameters['removeQuoteIDs']) && is_array($parameters['removeQuoteIDs'])) ? ArrayUtil
::trim($parameters['removeQuoteIDs']) : array();
145 * Creates a new message and returns the parsed template.
147 * @param \wcf\data\IMessageQuickReplyAction $object
148 * @param array<array> $parameters
149 * @param string $containerActionClassName
150 * @param string $sortOrder
151 * @param string $templateName
152 * @param string $application
155 public function createMessage(IMessageQuickReplyAction
$object, array &$parameters, $containerActionClassName, $sortOrder, $templateName, $application = 'wcf') {
156 $tableIndexName = call_user_func(array($this->container
, 'getDatabaseTableIndexName'));
157 $parameters['data'][$tableIndexName] = $parameters['objectID'];
158 $parameters['data']['enableSmilies'] = WCF
::getSession()->getPermission('user.message.canUseSmilies');
159 $parameters['data']['enableHtml'] = 0;
160 $parameters['data']['enableBBCodes'] = WCF
::getSession()->getPermission('user.message.canUseBBCodes');
161 $parameters['data']['showSignature'] = (WCF
::getUser()->userID ? WCF
::getUser()->showSignature
: 0);
162 $parameters['data']['time'] = TIME_NOW
;
163 $parameters['data']['userID'] = WCF
::getUser()->userID
;
164 $parameters['data']['username'] = WCF
::getUser()->username
;
166 // pre-parse message text
167 $parameters['data']['message'] = MessageUtil
::stripCrap($parameters['data']['message']);
168 $parameters['data']['message'] = PreParser
::getInstance()->parse($parameters['data']['message'], $this->allowedBBodes
);
170 $message = $object->create();
171 if ($message instanceof IMessage
&& !$message->isVisible()) {
177 // resolve the page no
178 list($pageNo, $count) = $object->getPageNo($this->container
);
180 // we're still on current page
181 if ($pageNo == $parameters['pageNo']) {
182 // check for additional messages
183 $messageList = $object->getMessageList($this->container
, $parameters['lastPostTime']);
185 // calculate start index
186 $startIndex = $count - (count($messageList) - 1);
188 WCF
::getTPL()->assign(array(
189 'attachmentList' => $messageList->getAttachmentList(),
190 'container' => $this->container
,
191 'objects' => $messageList,
192 'startIndex' => $startIndex,
193 'sortOrder' => $sortOrder,
196 // assign 'to top' link
197 if (isset($parameters['anchor'])) {
198 WCF
::getTPL()->assign('anchor', $parameters['anchor']);
201 // update visit time (messages shouldn't occur as new upon next visit)
202 if (ClassUtil
::isInstanceOf($containerActionClassName, 'wcf\data\IVisitableObjectAction')) {
203 $containerAction = new $containerActionClassName(array(($this->container
instanceof DatabaseObjectDecorator ?
$this->container
->getDecoratedObject() : $this->container
)), 'markAsRead');
204 $containerAction->executeAction();
208 'lastPostTime' => $message->time
,
209 'template' => WCF
::getTPL()->fetch($templateName, $application)
215 'url' => $object->getRedirectUrl($this->container
, $message)
221 * Returns the container object.
223 * @return \wcf\data\DatabaseObject
225 public function getContainer() {
226 return $this->container
;