Your IP : 18.118.12.248


Current Path : /home/bitrix/ext_www/klimatlend.ua/bitrix/modules/socialnetwork/lib/livefeed/
Upload File :
Current File : /home/bitrix/ext_www/klimatlend.ua/bitrix/modules/socialnetwork/lib/livefeed/forumpost.php

<?php
namespace Bitrix\Socialnetwork\Livefeed;

use Bitrix\Forum\ForumTable;
use Bitrix\Main\Config\Option;
use Bitrix\Main\Loader;
use Bitrix\Main\Localization\Loc;
use Bitrix\Forum\MessageTable;
use Bitrix\Socialnetwork\LogCommentTable;
use Bitrix\Socialnetwork\LogTable;

Loc::loadMessages(__FILE__);

final class ForumPost extends Provider
{
	const PROVIDER_ID = 'FORUM_POST';
	const CONTENT_TYPE_ID = 'FORUM_POST';

	public static function getId()
	{
		return static::PROVIDER_ID;
	}

	public function getEventId()
	{
		return array(
			'forum',
			'tasks_comment',
			'calendar_comment',
			'timeman_entry_comment',
			'report_comment',
			'photo_comment',
			'wiki_comment',
			'lists_new_element_comment'
		);
	}

	public function getType()
	{
		return Provider::TYPE_COMMENT;
	}

	public function initSourceFields()
	{
		$messageId = $this->entityId;

		if (
			$messageId > 0
			&& Loader::includeModule('forum')
		)
		{
			$res = MessageTable::getList(array(
				'filter' => array(
					'=ID' => $messageId
				),
				'select' => array('ID', 'POST_MESSAGE')
			));
			if ($message = $res->fetch())
			{
				$logId = false;

				$res = LogCommentTable::getList(array(
					'filter' => array(
						'SOURCE_ID' => $messageId,
						'@EVENT_ID' => $this->getEventId(),
					),
					'select' => array('LOG_ID')
				));
				if ($logComentFields = $res->fetch())
				{
					$logId = intval($logComentFields['LOG_ID']);
				}

				if ($logId)
				{
					$res = \CSocNetLog::getList(
						array(),
						array(
							'=ID' => $logId
						),
						false,
						false,
						array('ID', 'EVENT_ID'),
						array(
							"CHECK_RIGHTS" => "Y",
							"USE_FOLLOW" => "N",
							"USE_SUBSCRIBE" => "N"
						)
					);
					if ($logFields = $res->fetch())
					{
						$this->setLogId($logFields['ID']);
						$this->setSourceFields(array_merge($message, array('LOG_EVENT_ID' => $logFields['EVENT_ID'])));
						$this->setSourceDescription($message['POST_MESSAGE']);

						$title = htmlspecialcharsback($message['POST_MESSAGE']);
						$title = preg_replace(
							"/\[USER\s*=\s*([^\]]*)\](.+?)\[\/USER\]/is".BX_UTF_PCRE_MODIFIER,
							"\\2",
							$title
						);
						$CBXSanitizer = new \CBXSanitizer;
						$CBXSanitizer->delAllTags();
						$title = preg_replace(array("/\n+/is".BX_UTF_PCRE_MODIFIER, "/\s+/is".BX_UTF_PCRE_MODIFIER), " ", $CBXSanitizer->sanitizeHtml($title));
						$this->setSourceTitle(truncateText($title, 100));
						$this->setSourceAttachedDiskObjects($this->getAttachedDiskObjects($messageId));
						$this->setSourceDiskObjects($this->getDiskObjects($messageId, $this->cloneDiskObjects));
					}
				}
			}
		}
	}

	protected function getAttachedDiskObjects($clone = false)
	{
		global $USER_FIELD_MANAGER;
		static $cache = array();

		$messageId = $this->entityId;

		$result = array();
		$cacheKey = $messageId.$clone;

		if (isset($cache[$cacheKey]))
		{
			$result = $cache[$cacheKey];
		}
		else
		{
			$messageUF = $USER_FIELD_MANAGER->getUserFields("FORUM_MESSAGE", $messageId, LANGUAGE_ID);
			if (
				!empty($messageUF['UF_FORUM_MESSAGE_DOC'])
				&& !empty($messageUF['UF_FORUM_MESSAGE_DOC']['VALUE'])
				&& is_array($messageUF['UF_FORUM_MESSAGE_DOC']['VALUE'])
			)
			{
				if ($clone)
				{
					$this->attachedDiskObjectsCloned = self::cloneUfValues($messageUF['UF_FORUM_MESSAGE_DOC']['VALUE']);
					$result = $cache[$cacheKey] = array_values($this->attachedDiskObjectsCloned);
				}
				else
				{
					$result = $cache[$cacheKey] = $messageUF['UF_FORUM_MESSAGE_DOC']['VALUE'];
				}
			}
		}

		return $result;
	}

	public static function canRead($params)
	{
		return true;
	}

	protected function getPermissions(array $post)
	{
		$result = self::PERMISSION_READ;

		return $result;
	}

	public function getLiveFeedUrl()
	{
		static $urlCache = array();
		$result = '';

		$entityUrl = false;

		$logId = $this->getLogId();

		if ($logId)
		{
			if (isset($urlCache[$logId]))
			{
				$entityUrl = $urlCache[$logId];
			}
			else
			{
				$res = LogTable::getList(array(
					'filter' => array(
						'ID' => $logId
					),
					'select' => array('EVENT_ID', 'SOURCE_ID', 'RATING_ENTITY_ID', 'PARAMS')
				));
				if ($logEntryFields = $res->fetch())
				{
					$provider = false;

					$providerTasksTask = new TasksTask();
					if (in_array($logEntryFields['EVENT_ID'], $providerTasksTask->getEventId()))
					{
						$provider = $providerTasksTask;
						$provider->setEntityId(intval($logEntryFields['SOURCE_ID']));
						$provider->initSourceFields();
						$entityUrl = $provider->getLiveFeedUrl().'?commentId='.$this->getEntityId().'#com'.$this->getEntityId();
					}

					if (!$provider)
					{
						$providerCalendarEvent = new CalendarEvent();
						if (in_array($logEntryFields['EVENT_ID'], $providerCalendarEvent->getEventId()))
						{
							$provider = $providerCalendarEvent;
							$provider->setEntityId(intval($logEntryFields['SOURCE_ID']));
							$provider->initSourceFields();
							$entityUrl = $provider->getLiveFeedUrl().'?commentId='.$this->getEntityId().'#com'.$this->getEntityId();
						}
					}

					if (!$provider)
					{
						$providerTimemanEntry = new TimemanEntry();
						if (in_array($logEntryFields['EVENT_ID'], $providerTimemanEntry->getEventId()))
						{
							$provider = $providerTimemanEntry;
							$provider->setEntityId(intval($logEntryFields['SOURCE_ID']));
							$provider->initSourceFields();
							$entityUrl = $provider->getLiveFeedUrl();
						}
					}

					if (!$provider)
					{
						$providerTimemanReport = new TimemanReport();
						if (in_array($logEntryFields['EVENT_ID'], $providerTimemanReport->getEventId()))
						{
							$provider = $providerTimemanReport;
							$provider->setEntityId(intval($logEntryFields['SOURCE_ID']));
							$provider->initSourceFields();
							$entityUrl = $provider->getLiveFeedUrl();
						}
					}

					if (!$provider)
					{
						$providerPhotogalleryPhoto = new PhotogalleryPhoto();
						if (in_array($logEntryFields['EVENT_ID'], $providerPhotogalleryPhoto->getEventId()))
						{
							$provider = $providerPhotogalleryPhoto;
							$provider->setEntityId(intval($logEntryFields['SOURCE_ID']));
							$provider->initSourceFields();
							$entityUrl = $provider->getLiveFeedUrl();
						}
					}

					if (!$provider)
					{
						$providerWiki = new Wiki();
						if (in_array($logEntryFields['EVENT_ID'], $providerWiki->getEventId()))
						{
							$provider = $providerWiki;
							$provider->setEntityId(intval($logEntryFields['SOURCE_ID']));
							$provider->initSourceFields();
							$entityUrl = $provider->getLiveFeedUrl();
						}
					}

					if (!$provider)
					{
						$providerListsItem = new ListsItem();
						if (in_array($logEntryFields['EVENT_ID'], $providerListsItem->getEventId()))
						{
							$provider = $providerListsItem;
							$provider->setEntityId(intval($logEntryFields['SOURCE_ID']));
							$provider->initSourceFields();
							$entityUrl = $provider->getLiveFeedUrl().'?commentId='.$this->getEntityId().'#com'.$this->getEntityId();
						}
					}

					if (!$provider)
					{
						$providerForumTopic = new ForumTopic();
						if (in_array($logEntryFields['EVENT_ID'], $providerForumTopic->getEventId()))
						{
							if (
								!empty($logEntryFields["PARAMS"])
								&& unserialize($logEntryFields["PARAMS"])
							)
							{
								$paramsList = unserialize($logEntryFields["PARAMS"]);
								if (!empty($paramsList["PATH_TO_MESSAGE"]))
								{
									$entityUrl = \CComponentEngine::makePathFromTemplate($paramsList["PATH_TO_MESSAGE"], array("MID" => $this->getEntityId()));
								}
							}
						}
					}
				}
			}
		}

		if (!empty($entityUrl))
		{
			$result = $entityUrl;
		}

		return $result;
	}

	public function getSuffix()
	{
		$logEventId = $this->getLogEventId();

		if (!empty($logEventId))
		{
			$providerTasksTask = new TasksTask();
			if (in_array($logEventId, $providerTasksTask->getEventId()))
			{
				return 'TASK';
			}

			$providerCalendarEvent = new CalendarEvent();
			if (in_array($logEventId, $providerCalendarEvent->getEventId()))
			{
				return 'CALENDAR';
			}

			$providerForumTopic = new ForumTopic();
			if (in_array($logEventId, $providerForumTopic->getEventId()))
			{
				return 'FORUM_TOPIC';
			}
		}
		return '';
	}

	public function add($params = array())
	{
		global $USER, $DB;

		static $parser = null;

		$siteId = (
			isset($params['SITE_ID'])
			&& strlen($params['SITE_ID']) > 0
				? $params['SITE_ID']
				: SITE_ID
		);

		$authorId = (
			isset($params['AUTHOR_ID'])
			&& intval($params['AUTHOR_ID']) > 0
				? intval($params['AUTHOR_ID'])
				: $USER->getId()
		);

		$message = (
			isset($params['MESSAGE'])
			&& strlen($params['MESSAGE']) > 0
			? $params['MESSAGE']
			: ''
		);

		if (
			strlen($message) <= 0
			|| !Loader::includeModule('forum')
		)
		{
			return false;
		}

		$forumId = self::getForumId(array(
			'SITE_ID' => $siteId
		));

		if (!$forumId)
		{
			return false;
		}

		$logId = $this->getLogId();

		if (!$logId)
		{
			return false;
		}

		$this->setLogId($logId);
		$feedParams = $this->getFeedParams();

		if (empty($feedParams))
		{
			return false;
		}

		$feed = new \Bitrix\Forum\Comments\Feed(
			$forumId,
			$feedParams,
			$authorId
		);

		$forumComment = $feed->add(array(
			'POST_MESSAGE' => $message,
			'AUTHOR_ID' => $authorId,
			'USE_SMILES' => 'Y',
			'AUX' => (isset($params['AUX']) && $params['AUX'] == 'Y' ? $params['AUX'] : 'N')
		));

		if (!$forumComment)
		{
			return false;
		}

		$sonetCommentId = false;

		if ($params['AUX'] == 'Y')
		{
			if ($parser === null)
			{
				$parser = new \CTextParser();
			}

			$sonetCommentFields = array(
				"ENTITY_TYPE" => $this->getLogEntityType(),
				"ENTITY_ID" => $this->getLogEntityId(),
				"EVENT_ID" => $this->getCommentEventId(),
				"MESSAGE" => $message,
				"TEXT_MESSAGE" => $parser->convert4mail($message),
				"MODULE_ID" => "tasks",
				"SOURCE_ID" => $forumComment['ID'],
				"LOG_ID" => $logId,
				"RATING_TYPE_ID" => "FORUM_POST",
				"RATING_ENTITY_ID" => $forumComment['ID'],
				"USER_ID" => $authorId,
				"=LOG_DATE" => $DB->currentTimeFunction(),
			);

			if (!empty($params['SHARE_DEST']))
			{
				$sonetCommentFields['SHARE_DEST'] = $params['SHARE_DEST'];
			}

			$sonetCommentId = \CSocNetLogComments::add($sonetCommentFields, false, false);
		}
		else // comment is added on event
		{
			$res = LogCommentTable::getList(array(
				'filter' => array(
					'EVENT_ID' => $this->getCommentEventId(),
					'SOURCE_ID' => $forumComment['ID']
				),
				'select' => array('ID')
			));
			if ($sonetCommentFields = $res->fetch())
			{
				$sonetCommentId = $sonetCommentFields['ID'];
			}
		}

		return $sonetCommentId;
	}

	private static function getForumId($params = array())
	{
		$siteId = (
			isset($params['SITE_ID'])
			&& strlen($params['SITE_ID']) > 0
				? $params['SITE_ID']
				: SITE_ID
		);

		$result = Option::get('tasks', 'task_forum_id', 0, $siteId);

		if (intval($result) <= 0)
		{
			$res = ForumTable::getList(array(
				'filter' => array(
					'=XML_ID' => 'intranet_tasks'
				),
				'select' => array('ID')
			));
			if ($forumFields = $res->fetch())
			{
				$result = intval($forumFields['ID']);
			}
		}

		return $result;
	}

	private function getCommentEventId()
	{

		$result = false;

		$logEventId = $this->getLogEventId();
		if (!$logEventId)
		{
			return $result;
		}

		switch($logEventId)
		{
			case 'tasks':
				$result = 'tasks_comment';
				break;
			case 'calendar':
				$result = 'calendar_comment';
				break;
			case 'forum':
				$result = 'forum';
				break;
			default:
				$result = false;
		}

		return $result;
	}

	private function getFeedParams()
	{
		$result = array();

		$logId = $this->getLogId();

		if (!$logId)
		{
			return $result;
		}

		$res = LogTable::getList(array(
			'filter' => array(
				'ID' => $logId
			),
			'select' => array('EVENT_ID', 'SOURCE_ID')
		));
		if (
			($logFields = $res->fetch())
			&& (!empty($logFields['EVENT_ID']))
			&& (intval($logFields['SOURCE_ID']) > 0)
		)
		{
			$this->setLogEventId($logFields['EVENT_ID']);

			$providerTasksTask = new TasksTask();
			if (in_array($logFields['EVENT_ID'], $providerTasksTask->getEventId()))
			{
				$result = array(
					"type" => "TK",
					"id" => intval($logFields['SOURCE_ID']),
					"xml_id" => "TASK_".intval($logFields['SOURCE_ID'])
				);
			}

			$providerCalendarEvent = new CalendarEvent();
			if (in_array($logFields['EVENT_ID'], $providerCalendarEvent->getEventId()))
			{
				$result = array(
					"type" => "EV",
					"id" => intval($logFields['SOURCE_ID']),
					"xml_id" => "EVENT_".intval($logFields['SOURCE_ID'])
				);
			}

			$providerForumTopic = new ForumTopic();
			if (in_array($logFields['EVENT_ID'], $providerForumTopic->getEventId()))
			{
				$result = array(
					"type" => "DEFAULT",
					"id" => intval($logFields['SOURCE_ID']),
					"xml_id" => "TOPIC_".intval($logFields['SOURCE_ID'])
				);
			}
		}

		return $result;
	}

}