@toorr2p
https://github.com/Cleverscript

Как работать с объектом ORM в методе обработчике класса описания сущности?

В классе описания сущности ORM добавил обработчик, на котором мне пришлось получит ID записи элемента сущности,
чтобы потом дернуть саму запись и получить ее поле FILE_ID которое содержит ID файла, который надо удалить, при удалении записи.
Но в $event->getParameters() я вижу что есть ключ ['object'] который содержит объект сущности, только он походу без значений в полях, там только описания полей как я понял? Как то можно использовать этот ['object'] чтобы не дергать запись через getByPrimary а сразу получать из $event нужный мне FILE_ID?
Подозреваю что моя реализация с доп. запросом избыточна.

class CertTable extends DataManager
{

	public static function OnBeforeDelete(Event $event)
	{
		if ($id = $event->getParameter('id')) {

			$item = self::getByPrimary($id)->fetchObject();

			// delete file
			if ($fid = $item->get('FILE_ID')) {
				\CFile::Delete($fid);
			}
		}
	}

}
  • Вопрос задан
  • 62 просмотра
Решения вопроса 1
gromdron
@gromdron Куратор тега Битрикс24
Работаю с Bitrix24
В обработчик удаления не передаются другие поля, так что придется все-таки ходить в базу чтобы получить значения.
Удалять файл на событии "перед удалением записи" идея плохая - в итоге запись может быть не удалена, а файла уже нет.

Можно сделать работу обработчиков в паре, для получения воспользоваться объектом.

Для вдохновения можно использовать код:
use \Bitrix\Main\ORM\Event;

class DeleteHandler
{
    static $queue = [];

    public static function beforeDelete(Event $event)
    {
        // Получаем объект
        $item = $event->getParameter('object');

        // Запрашиваем из БД `FILE_ID`
        $item->fill('FILE_ID');

        // Пишем в "стек" удаляемый файл
        static::$queue[ $event->getParameter('ID') ] = (int) $item->get('FILE_ID');
    }

    public static function afterDelete(Event $event)
    {
        if (
            in_array($event->getParameter('ID'), static::$queue )
            && static::$queue[$event->getParameter('ID')]>0
        )
        {
            \CFile::Delete(static::$queue[$event->getParameter('ID')]);

            unset(static::$queue[$event->getParameter('ID')]);
        }
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы