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;
}