Корзина удаленных сущностей
Модуль управления корзиной удаленных сущностей (задач и шаблонов).
Перед использованием модуля необходимо проверить установлен ли он, и подключить его при помощи конструкции:
\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; // результат работы }