• Модуль: landing
  • Путь к файлу: ~/bitrix/modules/landing/lib/internals/landing.php
  • Класс: BitrixLandingInternalsLandingTable
  • Вызов: LandingTable::prepareChange
static function prepareChange(EntityEvent $event, $actionType)
{
	$result = new EntityEventResult();
	$primary = $event->getParameter('primary');
	$fields = $event->getParameter('fields');
	$modifyFields = array();
	$existFields = array();
	$deleteMode = false;

	// get all fields, which we need
	if ($primary)
	{
		$res = self::getList([
			'select' => [
				'CODE',
				'SITE_ID', 'FOLDER_ID',
				'INITIATOR_APP_CODE',
				'ID_INDEX' => 'SITE.LANDING_ID_INDEX'
			],
			'filter' => [
				'ID' => $primary['ID'],
				'=DELETED' => ['Y', 'N']
			]
		]);
		$existFields = $res->fetch();
		unset($res);
	}

	// check that folder within landing's site
	if (($fields['FOLDER_ID'] ?? null) && ($fields['FOLDER_SKIP_CHECK'] ?? 'N') !== 'Y')
	{
		if (empty($existFields['SITE_ID']))
		{
			$existFields['SITE_ID'] = $fields['SITE_ID'];
		}
		$res = FolderTable::getList([
			'select' => [
				'ID'
			],
			'filter' => [
				'SITE_ID' => $existFields['SITE_ID'],
				'ID' => $fields['FOLDER_ID']
			]
		]);
		if (!$res->fetch())
		{
			$result->setErrors(array(
				new EntityEntityError(
					Loc::getMessage('LANDING_TABLE_ERROR_FOLDER_NOT_FOUND'),
					'FOLDER_NOT_FOUND'
				)
			));
			return $result;
		}
	}

	// check CODE mask
	if (
		isset($fields['CODE']) &&
		(
			!isset($existFields['CODE']) ||
			$existFields['CODE'] != $fields['CODE']
		)
	)
	{
		if (preg_match('#^([w]+)_([d]+)_([d]+)$#', $fields['CODE'], $matches))
		{
			$result->setErrors(array(
				new EntityEntityError(
					Loc::getMessage('LANDING_TABLE_ERROR_WRONG_CODE_FORMAT'),
					'WRONG_CODE_FORMAT'
				)
			));
			return $result;
		}
	}

	// if page have't blocks of page's app, we clear this mark
	if (isset($fields['INITIATOR_APP_CODE']))
	{
		$existFields['INITIATOR_APP_CODE'] = $fields['INITIATOR_APP_CODE'];
	}

	// if delete, set unpublic always
	if (isset($fields['DELETED']))
	{
		$deleteMode = true;
		$modifyFields['ACTIVE'] = 'N';
		$fields['ACTIVE'] = 'N';
		// disable main page deleting
		if ($fields['DELETED'] == 'Y' && $primary)
		{
			if ($existFields['ID_INDEX'] == $primary['ID'])
			{
				// disable only for a few pages in the site
				$sitesCheck = self::getList([
					'select' => [
						'ID'
					],
					'filter' => [
						'SITE_ID' => $existFields['SITE_ID'],
						'=DELETED' => 'N'
					],
					'limit' => 2
				])->fetchAll();
				if (count($sitesCheck) > 1)
				{
					$result->setErrors([
						new EntityEntityError(
							Loc::getMessage('LANDING_TABLE_ERROR_LD_CANT_DELETE_MAIN'),
							'CANT_DELETE_MAIN'
						)
					]);
					return $result;
				}
			}
		}
	}

	// get real site id, for check rights call upper level
	if (array_key_exists('SITE_ID', $fields))
	{
		$res = BitrixLandingSite::getList(array(
			'select' => array(
				'ID'
			),
			'filter' => array(
				'ID' => $fields['SITE_ID']
			)
		));
		if (!$res->fetch())
		{
			$result->setErrors(array(
				new EntityEntityError(
					Loc::getMessage('LANDING_TABLE_ERROR_SITE_NOT_FOUND'),
					'SITE_NOT_FOUND'
				)
			));
			return $result;
		}
	}
	else if ($existFields)
	{
		if ($existFields['SITE_ID'])
		{
			$fields['SITE_ID'] = $existFields['SITE_ID'];
		}
		else
		{
			$result->setErrors(array(
				new EntityEntityError(
					Loc::getMessage('LANDING_TABLE_ERROR_SITE_NOT_FOUND'),
					'SITE_NOT_FOUND'
				)
			));
			return $result;
		}
	}
	else
	{
		$fields['SITE_ID'] = 0;
	}

	// check rights
	if ($fields['SITE_ID'] && Rights::isOn())
	{
		$rights = Rights::getOperationsForSite(
			$fields['SITE_ID']
		);
		if (!BitrixLandingSiteType::isPublicScope())
		{
			$rights[] = Rights::ACCESS_TYPES['public'];
		}
		// can create new landing in site
		if (!$primary)
		{
			if (!in_array(Rights::ACCESS_TYPES['edit'], $rights))
			{
				$errMessage = Loc::getMessage(
					'LANDING_TABLE_ERROR_LD_ACCESS_DENIED_ADD'
				);
				$result->setErrors(array(
					new EntityEntityError(
						$errMessage,
						'ACCESS_DENIED'
					)
				));
				return $result;
			}
		}
		else
		{
			$freeAccessFields = [
				'CREATED_BY_ID',
				'MODIFIED_BY_ID',
				'DATE_CREATE',
				'DATE_MODIFY',
				'SITE_ID',
				'PUBLIC'
			];
			if (in_array(Rights::ACCESS_TYPES['sett'], $rights))
			{
				$freeAccessFields = $fields;
				$higherAccess = [
					'ACTIVE', 'DATE_PUBLIC', 'DELETED'
				];
				foreach ($higherAccess as $key)
				{
					if (isset($freeAccessFields[$key]))
					{
						unset($freeAccessFields[$key]);
					}
				}
				$freeAccessFields = array_keys($freeAccessFields);
			}
			if (in_array(Rights::ACCESS_TYPES['public'], $rights))
			{
				$freeAccessFields[] = 'ACTIVE';
				$freeAccessFields[] = 'DATE_PUBLIC';
			}
			if (in_array(Rights::ACCESS_TYPES['delete'], $rights))
			{
				$freeAccessFields[] = 'DELETED';
				// allow unpublic in delete case
				if ($deleteMode)
				{
					$freeAccessFields[] = 'ACTIVE';
				}
			}
			foreach ($fields as $key => $val)
			{
				if (!in_array($key, $freeAccessFields))
				{
					$errMessage = Loc::getMessage(
						'LANDING_TABLE_ERROR_LD_ACCESS_DENIED_' . $key
					);
					if (!$errMessage)
					{
						$errMessage = Loc::getMessage(
							'LANDING_TABLE_ERROR_LD_ACCESS_DENIED'
						);
					}
					$result->setErrors(array(
						new EntityEntityError(
							$errMessage,
							'ACCESS_DENIED'
						)
					));
					return $result;
				}
			}
		}
	}

	// additional fields save after
	if (array_key_exists('ADDITIONAL_FIELDS', $fields))
	{
		self::$additionalFields = $fields['ADDITIONAL_FIELDS'];
		$result->unsetFields(array('ADDITIONAL_FIELDS'));
	}
	else
	{
		self::$additionalFields = array();
	}

	// slash in CODE is not allowed
	if (
		array_key_exists('CODE', $fields) &&
		mb_strpos($fields['CODE'], '/') !== false
	)
	{
		$result->setErrors(array(
			new EntityEntityError(
				Loc::getMessage('LANDING_TABLE_ERROR_SLASH_IS_NOT_ALLOWED'),
				'SLASH_IS_NOT_ALLOWED'
			)
		));
		return $result;
	}
	// CODE can't be empty
	elseif (
		array_key_exists('CODE', $fields) &&
		$fields['CODE'] == '' &&
		!isset($fields['FOLDER'])
	)
	{
		$result->setErrors(array(
			new EntityEntityError(
				Loc::getMessage('LANDING_TABLE_ERROR_CANT_BE_EMPTY'),
				'CANT_BE_EMPTY'
			)
		));
		return $result;
	}
	elseif (
		$actionType == self::ACTION_TYPE_ADD && array_key_exists('TITLE', $fields) &&
		(!array_key_exists('CODE', $fields) || trim($fields['CODE']) == '')
	)
	{
		$fields['CODE'] = CUtil::translit(
			trim($fields['TITLE']),
			LANGUAGE_ID,
			array(
				'replace_space' => '',
				'replace_other' => ''
			));
		if (!$fields['CODE'])
		{
			$fields['CODE'] = randString(12);
		}
		$modifyFields['CODE'] = $fields['CODE'];
	}

	$result->modifyFields($modifyFields);

	return $result;
}