6use Bitrix\Main\ArgumentException;
8use Bitrix\Main\Localization\Loc;
9use Bitrix\Main\ModuleManager;
10use Bitrix\Main\ORM\Data\Result;
11use Bitrix\Main\ORM\EntityError;
12use Bitrix\Main\ORM\Event;
13use Bitrix\Main\ORM\Fields\BooleanField;
14use Bitrix\Main\ORM\Fields\DatetimeField;
15use Bitrix\Main\ORM\Fields\IntegerField;
16use Bitrix\Main\ORM\Fields\Relations\Reference;
17use Bitrix\Main\ORM\Fields\StringField;
18use Bitrix\Main\ORM\Fields\TextField;
19use Bitrix\Main\ORM\Query\Join;
20use Bitrix\Main\Type\DateTime;
22Loc::loadMessages(__FILE__);
88 return 'b_forum_message';
93 return 'FORUM_MESSAGE';
96 private static $post_message_hash = [];
97 private static $messageById = [];
107 (
new IntegerField(
"ID", [
"primary" =>
true,
"autocomplete" =>
true])),
110 (
new BooleanField(
"USE_SMILES", [
"values" => [
"N",
"Y"],
"default_value" =>
"Y"])),
111 (
new BooleanField(
"NEW_TOPIC", [
"values" => [
"N",
"Y"],
"default_value" =>
"N"])),
112 (
new BooleanField(
"APPROVED", [
"values" => [
"N",
"Y"],
"default_value" =>
"Y"])),
113 (
new BooleanField(
"SOURCE_ID", [
"values" => [self::SOURCE_ID_EMAIL, self::SOURCE_ID_WEB, self::SOURCE_ID_MOBILE],
"default_value" => self::SOURCE_ID_WEB])),
114 (
new DatetimeField(
"POST_DATE", [
"required" =>
true,
"default_value" =>
function(){
return new DateTime();}])),
115 (
new TextField(
"POST_MESSAGE", [
"required" =>
true])),
118 (
new StringField(
"POST_MESSAGE_CHECK", [
"size" => 32])),
124 (
new StringField(
"AUTHOR_NAME", [
"required" =>
true,
"size" => 255])),
125 (
new StringField(
"AUTHOR_EMAIL", [
"size" => 255])),
127 (
new StringField(
"AUTHOR_REAL_IP", [
"size" => 255])),
132 (
new StringField(
"EDITOR_EMAIL", [
"size" => 255])),
143 (
new Reference(
"TOPIC", TopicTable::class, Join::on(
"this.TOPIC_ID",
"ref.ID"))),
144 (
new Reference(
"FORUM_USER", UserTable::class, Join::on(
"this.AUTHOR_ID",
"ref.USER_ID"))),
145 (
new Reference(
"FORUM_USER_TOPIC", UserTopicTable::class, Join::on(
"this.TOPIC_ID",
"ref.TOPIC_ID"))),
146 (
new Reference(
"USER",
Main\UserTable::class, Join::on(
"this.AUTHOR_ID",
"ref.ID")))
161 private static function modifyMessageFields(
array &
$data)
163 unset(
$data[
"UPLOAD_DIR"]);
164 if (array_key_exists(
"USE_SMILES",
$data))
166 $data[
"USE_SMILES"] =
$data[
"USE_SMILES"] ===
"N" ?
"N" :
"Y";
168 if (array_key_exists(
"NEW_TOPIC",
$data))
170 $data[
"NEW_TOPIC"] =
$data[
"NEW_TOPIC"] ===
"Y" ?
"Y" :
"N";
172 if (array_key_exists(
"APPROVED",
$data))
176 if (array_key_exists(
"SOURCE_ID",
$data))
184 if (in_array($sourceId, [self::SOURCE_ID_WEB, self::SOURCE_ID_MOBILE, self::SOURCE_ID_EMAIL],
true))
188 return self::SOURCE_ID_WEB;
196 $strUploadDir = array_key_exists(
"UPLOAD_DIR",
$data) ?
$data[
"UPLOAD_DIR"] :
"forum";
197 self::modifyMessageFields(
$data);
199 if (array_key_exists(
"ATTACH_IMG",
$data) && !empty(
$data[
"ATTACH_IMG"]))
201 if (!array_key_exists(
"FILES",
$data))
206 unset(
$data[
"ATTACH_IMG"]);
208 if (array_key_exists(
"FILES",
$data))
211 if (!empty(
$data[
"FILES"]))
217 "FORUM_ID" =>
$data[
"FORUM_ID"],
218 "TOPIC_ID" => (
$data[
"NEW_TOPIC"] ===
"Y" ? 0 :
$data[
"TOPIC_ID"]),
220 "USER_ID" =>
$data[
"AUTHOR_ID"]
223 if (!
$res->isSuccess())
230 $object =
$event->getParameter(
"object");
232 $object->sysSetRuntime(
"FILES",
$data[
"FILES"]);
233 $object->sysSetRuntime(
"UPLOAD_DIR", $strUploadDir);
236 unset(
$data[
"FILES"]);
240 $data[
"POST_MESSAGE_CHECK"] = md5(
$data[
"POST_MESSAGE"] . (array_key_exists(
"FILES",
$data) ? serialize(
$data[
"FILES"]) :
""));
243 $forum = Forum\Forum::getById(
$data[
"FORUM_ID"]);
244 $deduplication =
null;
245 if (array_key_exists(
"AUX",
$data))
247 if (
$data[
"AUX"] ==
"Y")
249 $deduplication =
false;
253 if (array_key_exists(
"DEDUPLICATION",
$data))
255 $deduplication =
$data[
"DEDUPLICATION"] ==
"Y";
256 unset(
$data[
"DEDUPLICATION"]);
258 if ($deduplication ===
null)
260 $deduplication = $forum[
"DEDUPLICATION"] ===
"Y";
262 if ($deduplication &&
$data[
"NEW_TOPIC"] !==
"Y")
264 if (self::getLastMessageHashInTopic(
$data[
"TOPIC_ID"]) ===
$data[
"POST_MESSAGE_CHECK"])
266 $result->addError(
new EntityError(Loc::getmessage(
"F_ERR_MESSAGE_ALREADY_EXISTS"),
"onBeforeMessageAdd"));
272 $data[
"POST_MESSAGE"] = Main\Text\Emoji::encode(
$data[
"POST_MESSAGE"]);
275 if (Main\Config\Option::get(
"forum",
"FILTER",
"Y") ==
"Y")
277 $data[
"POST_MESSAGE_FILTER"] = \CFilterUnquotableWords::Filter(
$data[
"POST_MESSAGE"]);
280 foreach ($filteredFields as
$key)
322 if (
Main\
Config\Option::get(
"forum",
"MESSAGE_HTML",
"N") ==
"Y")
325 $object =
$event->getParameter(
"object");
327 if (
$files = $object->sysGetRuntime(
"FILES"))
332 "FORUM_ID" =>
$fields[
"FORUM_ID"],
333 "TOPIC_ID" =>
$fields[
"TOPIC_ID"],
335 "USER_ID" =>
$fields[
"AUTHOR_ID"],
337 ($object->sysGetRuntime(
"UPLOAD_DIR") ?:
"forum/upload"));
338 $object->sysSetRuntime(
"FILES",
$files);
341 $parser = new \forumTextParser(LANGUAGE_ID);
343 $allow[
"SMILES"] = (
$fields[
"USE_SMILES"] !=
"Y" ?
"N" : $allow[
"SMILES"]);
345 "POST_MESSAGE_HTML" => $parser->convert(
$fields[
"POST_MESSAGE_FILTER"] ?:
$fields[
"POST_MESSAGE"], $allow,
"html",
$files)
358 $object =
$event->getParameter(
"object");
360 if (
$files = $object->sysGetRuntime(
"FILES"))
362 $id =
$event->getParameter(
"id");
363 $id = is_array($id) && array_key_exists(
"ID", $id) ? $id[
"ID"] : $id;
368 "FORUM_ID" =>
$fields[
"FORUM_ID"],
369 "TOPIC_ID" =>
$fields[
"TOPIC_ID"],
371 "USER_ID" =>
$fields[
"AUTHOR_ID"],
373 ($object->sysGetRuntime(
"UPLOAD_DIR") ?:
"forum/upload"));
379 if (!array_key_exists($id, self::$messageById))
381 self::$messageById[$id] = self::getList([
383 "filter" => [
"ID" => $id],
389 return self::$messageById[$id];
402 $id =
$event->getParameter(
"id");
404 $strUploadDir = array_key_exists(
"UPLOAD_DIR",
$data) ?
$data[
"UPLOAD_DIR"] :
"forum";
405 self::modifyMessageFields(
$data);
406 if (
Main\
Config\Option::get(
"forum",
"FILTER",
"Y") ==
"Y" &&
407 !empty(array_intersect(self::getFilteredFields(), array_keys(
$data))))
411 array_intersect(self::getFilteredFields(), array_keys(
$data)) !== self::getFilteredFields() &&
415 $forFilter = array_merge(
$message, $forFilter);
418 foreach (self::getFilteredFields() as
$key)
432 if (array_key_exists(
"POST_MESSAGE",
$data))
434 $data[
"POST_MESSAGE"] = Main\Text\Emoji::encode(
$data[
"POST_MESSAGE"]);
435 if (Main\Config\Option::get(
"forum",
"FILTER",
"Y") ==
"Y")
437 $data[
"POST_MESSAGE_FILTER"] = \CFilterUnquotableWords::Filter(
$data[
"POST_MESSAGE"]);
441 unset(
$data[
"DEDUPLICATION"]);
444 if (array_key_exists(
"ATTACH_IMG",
$data) && !empty(
$data[
"ATTACH_IMG"]))
446 if (!array_key_exists(
"FILES",
$data))
451 unset(
$data[
"ATTACH_IMG"]);
453 if (array_key_exists(
"FILES",
$data))
456 if (!empty(
$data[
"FILES"]))
459 $res = Forum\File::checkFiles(
463 "FORUM_ID" => $fileFields[
"FORUM_ID"],
464 "TOPIC_ID" => $fileFields[
"TOPIC_ID"],
466 "USER_ID" => $fileFields[
"AUTHOR_ID"]
469 if (!
$res->isSuccess())
476 $object =
$event->getParameter(
"object");
478 $object->sysSetRuntime(
"FILES",
$data[
"FILES"]);
479 $object->sysSetRuntime(
"UPLOAD_DIR", $strUploadDir);
480 $object->sysSetRuntime(
"FILE_FIELDS", $fileFields);
483 unset(
$data[
"FILES"]);
510 $id =
$event->getParameter(
"id");
515 $object =
$event->getParameter(
"object");
517 if (
$files = $object->sysGetRuntime(
"FILES"))
522 "FORUM_ID" =>
$fields[
"FORUM_ID"],
523 "TOPIC_ID" =>
$fields[
"TOPIC_ID"],
525 "USER_ID" =>
$fields[
"AUTHOR_ID"],
527 ($object->sysGetRuntime(
"UPLOAD_DIR") ?:
"forum/upload"));
529 if (
Main\
Config\Option::get(
"forum",
"MESSAGE_HTML",
"N") ==
"Y")
532 $parser = new \forumTextParser(LANGUAGE_ID);
534 $allow[
"SMILES"] = (
$fields[
"USE_SMILES"] !=
"Y" ?
"N" : $allow[
"SMILES"]);
536 "POST_MESSAGE_HTML" => $parser->convert(
$fields[
"POST_MESSAGE_FILTER"] ?:
$fields[
"POST_MESSAGE"], $allow,
"html",
$files)
548 $id =
$event->getParameter(
"id");
550 unset(self::$messageById[$id]);
570 if (array_key_exists(
"TOPIC_ID",
$data))
572 $topic = \Bitrix\Forum\TopicTable::query()->setSelect([
'STATE'])
573 ->where(
'ID',
$data[
"TOPIC_ID"])
586 catch (\Exception $e)
595 private static function getLastMessageHashInTopic(
int $topicId): ?string
597 $res = MessageTable::query()
598 ->setSelect([
'ID',
'POST_MESSAGE_CHECK'])
599 ->where(
'TOPIC_ID',
'=', $topicId)
600 ->where(
'APPROVED',
'=',
'Y')
601 ->setOrder([
'ID' =>
'DESC'])
606 return $res ?
$res[
'POST_MESSAGE_CHECK'] :
null;
619 if (!($this->data = MessageTable::getById($this->
id)->fetch()))
623 $this->authorId = intval($this->data[
"AUTHOR_ID"]);
632 $this->data = MessageTable::getById(
$result->getId())->fetch();
636 Forum\Topic::getById($this->data[
"TOPIC_ID"]),
650 if ($topic =
Forum\Topic::getById($this->data[
'TOPIC_ID']))
652 $decrementStatisticResult = $topic->decrementStatistic($this->data);
653 if ($this->data[
'NEW_TOPIC'] ===
'Y' && $decrementStatisticResult->getData())
655 if (!($newFirstMessage = $decrementStatisticResult->getData()) || empty($newFirstMessage))
657 $newFirstMessage = MessageTable::getList([
659 'filter' => [
'TOPIC_ID' => $this->
getId()],
660 'order' => [
'ID' =>
'ASC'],
674 $forum->decrementStatistic($this->data);
679 if ($this->data[
'AUTHOR_ID'] > 0 && ($author = User::getById($this->data[
'AUTHOR_ID'])))
681 $author->decrementStatistic($this->data);
690 return (
string)($this->data[
'XML_ID'] ??
'');
699 $topic = Forum\Topic::getInstance($parentObject);
707 $forum = Forum\Forum::getById($topic->getForumId());
710 $topic->incrementStatistic(
$message);
721 $result->setPrimary([
"ID" => $id]);
723 $temporaryFields = [
'AUX',
'AUX_DATA'];
725 foreach (array_merge([
743 ], $temporaryFields) as $field)
745 if (array_key_exists($field,
$fields))
756 if (($events =
GetModuleEvents(
"forum",
"onBeforeMessageUpdate",
true)) && !empty($events))
758 $strUploadDir =
"forum";
760 foreach ($events as $ev)
765 $errorMessage = Loc::getMessage(
"FORUM_EVENT_BEFOREUPDATE_ERROR");
775 $data[
"UPLOAD_DIR"] = $strUploadDir;
778 foreach ($temporaryFields as $field)
780 unset(
$data[$field]);
783 if (isset(
$fields[
'EDITOR_ID']))
786 $authContext->setUserId(
$fields[
'EDITOR_ID']);
789 'auth_context' => $authContext
816 "FORUM_ID" => $topic->getForumId(),
817 "TOPIC_ID" => $topic->getId(),
819 "USE_SMILES" =>
$fields[
"USE_SMILES"],
820 "NEW_TOPIC" => (isset(
$fields[
"NEW_TOPIC"]) &&
$fields[
"NEW_TOPIC"] ===
"Y" ?
"Y" :
"N"),
824 "POST_MESSAGE" =>
$fields[
"POST_MESSAGE"],
825 "ATTACH_IMG" =>
$fields[
"ATTACH_IMG"] ??
null,
826 "FILES" =>
$fields[
"FILES"] ?? [],
828 "AUTHOR_ID" =>
$fields[
"AUTHOR_ID"],
829 "AUTHOR_NAME" =>
$fields[
"AUTHOR_NAME"],
830 "AUTHOR_EMAIL" =>
$fields[
"AUTHOR_EMAIL"],
831 "AUTHOR_IP" =>
$fields[
"AUTHOR_IP"] ??
null,
832 "AUTHOR_REAL_IP" =>
$fields[
"AUTHOR_REAL_IP"] ??
null,
833 "GUEST_ID" =>
$fields[
"GUEST_ID"] ??
null,
842 $temporaryFields = [
'AUX',
'AUX_DATA'];
843 $additionalFields = array_merge([
'SERVICE_TYPE',
'SERVICE_DATA',
'SOURCE_ID',
'PARAM1',
'PARAM2',
'XML_ID'], $temporaryFields);
844 foreach ($additionalFields as
$key)
854 if (($events =
GetModuleEvents(
"forum",
"onBeforeMessageAdd",
true)) && !empty($events))
856 $strUploadDir =
"forum";
859 foreach ($events as $ev)
864 $errorMessage = Loc::getMessage(
"FORUM_EVENT_BEFOREADD_ERROR");
874 $data[
"UPLOAD_DIR"] = $strUploadDir;
877 foreach ($temporaryFields as $field)
879 unset(
$data[$field]);
883 $authContext->setUserId(
$fields[
'AUTHOR_ID']);
887 "auth_context" => $authContext
900 $forum = Forum\Forum::getById($topic->getForumId());
915 $result->addError(
new Main\
Error( Loc::getMessage(
"FORUM_MESSAGE_HAS_NOT_BEEN_FOUND")));
920 if (($events =
GetModuleEvents(
"forum",
"onBeforeMessageDelete",
true))
923 foreach ($events as $ev)
928 $errorMessage = Loc::getMessage(
"FORUM_EVENT_BEFOREDELETE_ERROR");
949 MessageTable::delete($id);
951 if (!($nextMessage = MessageTable::getList([
956 'order' => [
'ID' =>
'ASC'],
962 else if (
$message[
'NEW_TOPIC'] ===
'Y')
964 MessageTable::update($nextMessage[
'ID'], [
'NEW_TOPIC' =>
'Y']);
static checkFiles(Forum $forum, &$files, $params=["TOPIC_ID"=> 0, "MESSAGE_ID"=> 0, "USER_ID"=> 0])
static saveFiles(&$files, $params, $uploadDir="forum/upload")
static deleteBatch(array $filter)
static getMainData(int $forumId, ?string $siteId=null)
static index(Forum\Forum $forum, Forum\Topic $topic, array $message)
static deleteIndex(array $message)
const APPROVED_DISAPPROVED
static add(Forum\Topic $topic, array $fields)
static update($id, array &$fields)
static create($parentObject, array $fields)
static getFilteredFields()
static onAfterUpdate(Main\ORM\Event $event)
static onAdd(Main\ORM\Event $event)
static filterSourceIdParam(string $sourceId)
static getDataById($id, $ttl=84600)
static checkFields(Result $result, $primary, array $data)
static onUpdate(Main\ORM\Event $event)
static onAfterAdd(Main\ORM\Event $event)
const APPROVED_DISAPPROVED
static includeModule($moduleName)
static GetFeatures($arForum)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
global $USER_FIELD_MANAGER
while($arParentIBlockProperty=$dbParentIBlockProperty->Fetch()) $errorMessage
ExecuteModuleEventEx($arEvent, $arParams=[])
IsModuleInstalled($module_id)
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
if(empty($signedUserToken)) $key