Your IP : 18.118.186.62


Current Path : /home/bitrix/ext_www/crm.klimatlend.ua/bitrix/modules/recyclebin/lib/
Upload File :
Current File : /home/bitrix/ext_www/crm.klimatlend.ua/bitrix/modules/recyclebin/lib/recyclebin.php

<?php
namespace Bitrix\Recyclebin;

use Bitrix\Main\AccessDeniedException;
use Bitrix\Main\Event;
use Bitrix\Main\EventResult;
use Bitrix\Recyclebin\Internals\Entity;
use Bitrix\Recyclebin\Internals\Models\RecyclebinDataTable;
use Bitrix\Recyclebin\Internals\Models\RecyclebinFileTable;
use Bitrix\Recyclebin\Internals\Models\RecyclebinTable;
use Bitrix\Recyclebin\Internals\User;

class Recyclebin
{
	public static function restore($recyclebinId, array $params = [])
	{
		$entity = self::getEntityData($recyclebinId);
		if (!$entity)
		{
			return false;
		}

		if($entity->getOwnerId() != User::getCurrentUserId() && !User::isSuper())
		{
			throw new AccessDeniedException('Access Denied');
		}

		$handler = self::getHandler($entity);

		$result = call_user_func([$handler, 'moveFromRecyclebin'], $entity);

		if ($result)
		{
			self::removeRecyclebinInternal($recyclebinId);
		}

		return $result;
	}

	public static function getEntityData($recyclebinId)
	{
		try
		{
			$recyclebin = RecyclebinTable::getById($recyclebinId)->fetch();

			$data = $files = [];
			if ($recyclebin)
			{
				$recyclebinData = RecyclebinDataTable::getList(['filter' => ['=RECYCLEBIN_ID' => $recyclebinId]])->fetchAll();
				if ($recyclebinData)
				{
					foreach ($recyclebinData as $action => $value)
					{
						$data[$action] = $value;
					}
				}

				$recyclebinFiles = RecyclebinFileTable::getList(['filter' => ['=RECYCLEBIN_ID' => $recyclebinId]])->fetchAll();
				if ($recyclebinFiles)
				{
					foreach ($recyclebinFiles as $storage)
					{
						unset($storage['ID'], $storage['RECYCLEBIN_ID']);

						$files[$storage['FILE_ID']] = $storage;
					}
				}
			}

			$entity = new Entity($recyclebin['ENTITY_ID'], $recyclebin['ENTITY_TYPE'], $recyclebin['MODULE_ID']);
			$entity->setId($recyclebinId);
			if(isset($recyclebin['NAME']))
			{
				$entity->setTitle($recyclebin['NAME']);
			}
			$entity->setData($data);
			$entity->setFiles($files);
			$entity->setOwnerId($recyclebin['USER_ID']);

			return $entity;
		}
		catch (\Exception $e)
		{
		}

		return false;
	}

	private static function getHandler(Entity $entity)
	{
		$modules = self::getAvailableModules();
		$module = $modules[$entity->getModuleId()];
		$entityData = $module['LIST'][$entity->getEntityType()];

		return $entityData['HANDLER'];
	}

	/**
	 * @return array
	 */
	public static function getAdditionalData(): array
	{
		$additionalData = [];

		$event = new Event("recyclebin", "onAdditionalDataRequest");
		$event->send();

		if ($event->getResults())
		{
			foreach ($event->getResults() as $eventResult)
			{
				if ($eventResult->getType() === EventResult::SUCCESS)
				{
					$params = $eventResult->getParameters();
					if (empty($params) || !isset($params['ADDITIONAL_DATA']) || empty($params['ADDITIONAL_DATA']))
					{
						continue;
					}

					$moduleId = $eventResult->getModuleId();
					$additionalData[$moduleId] = $params;
				}
			}
		}

		return $additionalData;
	}

	public static function getAvailableModules()
	{
		static $list = null;

		if (!$list)
		{
			$event = new Event("recyclebin", "OnModuleSurvey");
			$event->send();
			if ($event->getResults())
			{
				foreach ($event->getResults() as $eventResult)
				{
					if ($eventResult->getType() == EventResult::SUCCESS)
					{
						$params = $eventResult->getParameters();
						if (empty($params) || !isset($params['LIST']) || empty($params['LIST']))
						{
							continue;
						}

						$moduleId = $eventResult->getModuleId();

						$list[$moduleId] = $params;
					}
				}
			}
		}

		return $list;
	}

	private static function removeRecyclebinInternal($recyclebinId)
	{
		try
		{
			if (RecyclebinTable::delete($recyclebinId))
			{
				RecyclebinDataTable::deleteByRecyclebinId($recyclebinId);
				RecyclebinFileTable::deleteByRecyclebinId($recyclebinId);
			}

			return true;
		}
		catch (\Exception $e)
		{
			return false;
		}
	}

	public static function remove($recyclebinId, array $params = [])
	{
		$entity = self::getEntityData($recyclebinId);
		if (!$entity)
		{
			return false;
		}
		if (
			!User::isSuper()
			&& !User::isAdmin()
			&& empty($params['skipAdminRightsCheck'])
		)
		{
			throw new AccessDeniedException('Access Denied');
		}

		$handler = self::getHandler($entity);

		$result = call_user_func([$handler, 'removeFromRecyclebin'], $entity);

		if ($result)
		{
			self::removeRecyclebinInternal($recyclebinId);
		}

		return $result;
	}

	public static function preview($recyclebinId, array $params = [])
	{
		return false;
	}

	public static function findId($moduleId, $entityType, $entityId)
	{
		$fields = RecyclebinTable::getRow(
			[
				'filter' => [ '=MODULE_ID' => $moduleId, '=ENTITY_TYPE' => $entityType, '=ENTITY_ID' => $entityId ],
				'select' => [ 'ID' ]
			]
		);
		return is_array($fields) ? (int)$fields['ID'] : 0;
	}
}