Your IP : 216.73.216.86


Current Path : /var/www/homesaver/www/bitrix/modules/main/lib/access/auth/
Upload File :
Current File : /var/www/homesaver/www/bitrix/modules/main/lib/access/auth/accesseventhandler.php

<?php


namespace Bitrix\Main\Access\Auth;


use Bitrix\Iblock\SectionTable;
use Bitrix\Main\Access\AccessCode;
use Bitrix\Main\Loader;
use Bitrix\Main\UserAccessTable;

class AccessEventHandler
{
	public static function onBeforeIBlockSectionUpdate(&$fields)
	{
		if (
			!is_array($fields)
			|| !array_key_exists('IBLOCK_ID', $fields)
			|| !array_key_exists('UF_HEAD', $fields)
			|| !array_key_exists('ID', $fields)
		)
		{
			return;
		}

		$iblockId = (int) \COption::GetOptionInt('intranet', 'iblock_structure');
		if (
			!$iblockId
			|| (int) $fields['IBLOCK_ID'] !== $iblockId
		)
		{
			return;
		}

		$ufHead = (int) $fields['UF_HEAD'];
		if ($ufHead > 0)
		{
			(new AccessAuthProvider())->DeleteByUser($ufHead);
		}

		$accessCode = AccessCode::ACCESS_DIRECTOR . $fields['ID'];
		self::deleteByAccessCode($accessCode);
	}

	public static function onBeforeIBlockSectionDelete($sectionId)
	{
		$sectionId = (int) $sectionId;
		if ($sectionId < 1)
		{
			return;
		}

		$iblockId = (int) \COption::GetOptionInt('intranet', 'iblock_structure');
		if (!$iblockId)
		{
			return;
		}

		if (!Loader::includeModule('iblock'))
		{
			return;
		}

		$res = SectionTable::getList([
			'filter' => [
				'=IBLOCK_ID' => $iblockId,
				'=ID' => $sectionId
			]
		]);
		if(!$res->getSelectedRowsCount())
		{
			return;
		}

		$accessCode = AccessCode::ACCESS_DIRECTOR . $sectionId;
		self::deleteByAccessCode($accessCode);
	}

	public static function onBeforeIBlockSectionAdd(&$fields)
	{
		if (
			!is_array($fields)
			|| !array_key_exists('IBLOCK_ID', $fields)
			|| !array_key_exists('UF_HEAD', $fields)
			|| !array_key_exists('IBLOCK_SECTION_ID', $fields)
		)
		{
			return;
		}

		$ufHead = (int) $fields['UF_HEAD'];
		if ($ufHead < 1)
		{
			return;
		}
		(new AccessAuthProvider())->DeleteByUser($ufHead);
	}

	private static function deleteByAccessCode(string $accessCode)
	{
		// find users by access codes
		$res = UserAccessTable::getList([
			'filter' => [
				'=ACCESS_CODE' => $accessCode
			],
			'select' => ['USER_ID']
		]);

		$provider = new AccessAuthProvider();
		while ($row = $res->fetch())
		{
			$provider->DeleteByUser($row['USER_ID']);
		}
	}
}