Документация для разработчиков
Темная тема

Корзина удаленных сущностей

Модуль управления корзиной удаленных сущностей (задач и шаблонов).

Перед использованием модуля необходимо проверить установлен ли он, и подключить его при помощи конструкции:

\Bitrix\Main\Loader::includeModule('recyclebin');

Класс Описание С версии
Recyclebin Класс содержит методы для работы с корзиной удаленных сущностей (задач и шаблонов). 18.0.1


Пример

(написание своего обработчика для работы с корзиной сущностей "Задачи")

В первую очередь необходимо создать класс менеджера, который будет возвращать необходимые данные при запросе Корзиной:

\Bitrix\Tasks\Integration\Recyclebin\Manager

class Manager
{
	const TASKS_RECYCLEBIN_ENTITY = 'tasks_task';
	const TASKS_TEMPLATE_RECYCLEBIN_ENTITY = 'tasks_template';
	const MODULE_ID = 'tasks';

	public static function OnModuleSurvey()
	{
		$data = [];

		$data[self::TASKS_RECYCLEBIN_ENTITY] = array(
			'NAME'    => Loc::getMessage('TASKS_RECYCLEBIN_ENTITY_NAME'), // Название сущности
			'HANDLER' => \Bitrix\Tasks\Integration\Recyclebin\Task::class // Класс обработчик сущности
		);

		$data[self::TASKS_TEMPLATE_RECYCLEBIN_ENTITY] = array(
			'NAME'    => Loc::getMessage('TASKS_TEMPLATE_RECYCLEBIN_ENTITY_NAME'),
			'HANDLER' => \Bitrix\Tasks\Integration\Recyclebin\Template::class
		);

		return new EventResult(
			EventResult::SUCCESS, [
			'NAME' => Loc::getMessage('TASKS_RECYCLEBIN_MODULE_NAME'),
			'LIST' => $data
			], self::MODULE_ID
		);
	}
}
 

Затем необходимо "зарегистрировать" этот менеджер в события Корзины:

$eventManager = \Bitrix\Main\EventManager::getInstance();

//Recyclebin
$eventManager->registerEventHandler(
	'recyclebin',
	'OnModuleSurvey',
	'tasks',
	'\Bitrix\Tasks\Integration\Recyclebin\Manager',
	'OnModuleSurvey'
);
 

Теперь, когда мы открываем корзину, она выполняет метод \Bitrix\Recyclebin\Recyclebin::getAvailableModules(), который сообщает ей, с какими сущностями она готова работать.

Далее необходимо описать "Класс обработчик сущности". В нем и будут происходить главные действия. Обработчик должен реализовывать интерфейс \Bitrix\Recyclebin\Internals\Contracts\Recyclebinable для того, чтобы иметь возможность работать с корзиной.

interface Recyclebinable
{

	/**
	* Метод восстановления из корзины
	* 
	* @param Entity $entity
	*
	* @return boolean
	*/
	public static function moveFromRecyclebin(Entity $entity);

	/**
	* Метод удаления из корзины
	* 
	* @param Entity $entity
	*
	* @return boolean
	*/
	public static function removeFromRecyclebin(Entity $entity);

	/**
	* Метод предпросмотра в корзине
	* 
	* @param Entity $entity
	*
	* @return boolean
	*/
	public static function previewFromRecyclebin(Entity $entity);


	/**
	* Метод, который предоставляет переводы результатов действий. 
	* NOTIFY - Задача успешно удалена/Восстановлена 
	* CONFIRM - Вы уверены, что хотите восстановить/удалить задачу?
	* 
	* @return array
	*
	* [
	*	'NOTIFY'=> [
	*		'RESTORE' => Loc::getMessage(''),
	*		'REMOVE' => Loc::getMessage(''),
	*	],
	*	'CONFIRM' => [
	*		'RESTORE' => Loc::getMessage(''),
	*		'REMOVE' => Loc::getMessage('')
	*	]
	*/
	public static function getNotifyMessages();
}
 

Такие обработчики нужно описывать для каждой восстанавливаемой сущности (со своими переводами).

Когда задача будет удаляться, вызовется метод OnBeforeTaskDelete (это событие надо зарегистрировать отдельно).

use Bitrix\Recyclebin\Internals\Entity;

public static function OnBeforeTaskDelete($taskId, array $task = [])
{
	$recyclebin = new Entity($taskId, Manager::TASKS_RECYCLEBIN_ENTITY, Manager::MODULE_ID); // создаем объект корзины
	$recyclebin->setTitle($task['TITLE']); // задаем заголовок

	$additionalData = self::collectTaskAdditionalData($taskId); //каким либо образом собираем информацию, которую необходимо сохранить в корзине в формате действие-данные
// например [MEMBERS=>[1,2,3,4,5]], затем по ключу MEMBERS мы будем знать, что восстанавливать
	if ($additionalData)
	{
		foreach ($additionalData as $action => $data)
		{
			$recyclebin->add($action, $data);  // добавляем в корзину
		}
	}

	$result = $recyclebin->save(); // сохраняем в корзине
	$resultData = $result->getData();

	return $resultData['ID']; // получаем ID созданной корзины
}
 

Восстановление:

use Bitrix\Recyclebin\Internals\Entity;

public static function moveFromRecyclebin(Entity $entity)
{
	$result = new Result();

	$connection = Application::getConnection();

		$connection->queryExecute(
			'UPDATE '.TaskTable::getTableName().' SET ZOMBIE=\'N\' WHERE ID='.$entity->getEntityId()
		); // восстановил задачу (в данном случае пришлось в обход АПИ, потому что не поддерживается такой функционал

		$arLogFields = array(
			"TASK_ID" => $entity->getEntityId(),
			"USER_ID" => User::getId(),
			"CREATED_DATE" => new DateTime(),
			"FIELD" => 'RENEW'
		);

	$log = new \CTaskLog();
	$log->Add($arLogFields); // добавил в лог задачи информацию об востановлении


	$dataEntity = $entity->getData(); // получил сохраненные данные из корзины


	if ($dataEntity)
	{
		foreach ($dataEntity as $value)
		{
			$data = unserialize($value['DATA']);
			$action = $value['ACTION'];

			self::restoreTaskAdditionalData($entity->getEntityId(), $action, $data); // на основе сохраненного массива восстанавливаем данные
		}
	}

	$task = \CTaskItem::getInstance($entity->getEntityId(), 1);
	$task->update([], ['FORCE_RECOUNT_COUNTER'=>'Y']); // пересчитываем счетчики задач


	return $result; // результат работы 
}
 

© «Битрикс», 2001-2024, «1С-Битрикс», 2024