2namespace Bitrix\Landing\Transfer\Import;
4use Bitrix\Landing\History;
5use Bitrix\Landing\Metrika;
8use Bitrix\Main\ORM\Data\AddResult;
9use Bitrix\Main\Localization\Loc;
10use Bitrix\Main\ModuleManager;
11use Bitrix\Main\Web\Json;
12use Bitrix\Rest\Marketplace;
13use Bitrix\Rest\Configuration;
14use Bitrix\Landing\Hook\Page\Copyright;
15use Bitrix\Landing\Hook\Page\B24button;
16use Bitrix\Landing\Rights;
17use Bitrix\Landing\Site as SiteCore;
18use Bitrix\Landing\Landing as LandingCore;
19use Bitrix\Landing\Site\Type;
20use Bitrix\Landing\Transfer\AppConfiguration;
21use Bitrix\Landing\Block;
22use Bitrix\Landing\File;
23use Bitrix\Landing\Hook;
24use Bitrix\Landing\Template;
25use Bitrix\Landing\TemplateRef;
26use Bitrix\Landing\Manager;
27use Bitrix\Landing\Syspage;
28use Bitrix\Landing\Internals\BlockTable;
29use Bitrix\Landing\Site\Scope;
31Loc::loadMessages(__FILE__);
45 if (!\
Bitrix\
Main\Loader::includeModule(
'rest'))
66 if (
$code ===
'landing_mainpage')
68 $mainpageManager = new \Bitrix\Landing\Mainpage\Manager();
69 $siteId = $mainpageManager->getConnectedSiteId();
72 $manifest[
'SETTING'] = [
93 'ID',
'DOMAIN_ID',
'DATE_CREATE',
'DATE_MODIFY',
94 'CREATED_BY_ID',
'MODIFIED_BY_ID',
'CODE',
96 foreach ($notAllowedKeys as
$key)
107 $check = SiteCore::getList([
125 $data[
'ACTIVE'] =
'Y';
129 foreach (Hook::HOOKS_CODES_FILES as $hookCode)
132 isset(
$data[
'ADDITIONAL_FIELDS'][$hookCode]) &&
133 $data[
'ADDITIONAL_FIELDS'][$hookCode] > 0
136 $unpackFile = $structure->getUnpackFile(
$data[
'ADDITIONAL_FIELDS'][$hookCode]);
145 unset(
$data[
'ADDITIONAL_FIELDS'][$hookCode]);
155 foreach (
$files as $fileId)
173 $ratio =
$event->getParameter(
'RATIO');
174 $contextUser =
$event->getParameter(
'CONTEXT_USER');
177 $additional =
$event->getParameter(
'ADDITIONAL_OPTION');
178 $structure =
new Configuration\Structure($contextUser);
180 'RATIO' => $ratio[
$code] ?? [],
181 'ERROR_EXCEPTION' => [],
194 $isPageImport = $return[
'RATIO'][
'IS_PAGE_IMPORT'] ??
false;
197 if (isset($ratio[
$code][
'SITE_ID']) && (
int)$ratio[
$code][
'SITE_ID'] > 0)
201 elseif ($additional && (
int)$additional[
'siteId'] > 0)
203 $return[
'RATIO'][
'SITE_ID'] = (int)$additional[
'siteId'];
204 $isPageImport = $return[
'RATIO'][
'IS_PAGE_IMPORT'] ??
true;
208 $isReplaceLanding =
false;
209 if (isset($ratio[
$code][
'REPLACE_LID']) && (
int)$ratio[
$code][
'REPLACE_LID'] > 0)
211 $isReplaceLanding =
true;
213 elseif ($additional && (
int)$additional[
'replaceLid'] > 0)
215 $return[
'RATIO'][
'REPLACE_LID'] = (int)$additional[
'replaceLid'];
216 $isReplaceLanding =
true;
219 $isReplaceSiteLandings =
false;
222 $return[
'RATIO'][
'REPLACE_SITE_ID'] = (int)
$settings[
'replaceSiteId'];
223 $return[
'RATIO'][
'SITE_ID'] = (int)
$settings[
'replaceSiteId'];
224 $isReplaceSiteLandings =
true;
227 $siteId = (int)$return[
'RATIO'][
'SITE_ID'];
228 $isReplace = $isReplaceLanding || $isReplaceSiteLandings;
232 $data = self::prepareAdditionalFields(
$data, $additional);
234 if (
$data[
'TYPE'] ===
'MAINPAGE')
236 (new \Bitrix\Landing\Mainpage\Manager())->onStartPageCreation();
239 if ($isReplace && !$isPageStep)
241 $additionalFieldsSite =
$data[
'ADDITIONAL_FIELDS'] ?? [];
242 $additionalFieldsSite = array_filter(
243 $additionalFieldsSite,
245 return in_array(
$code, Hook::HOOKS_CODES_DESIGN);
249 $return[
'RATIO'][
'ADDITIONAL_FIELDS_SITE'] = $additionalFieldsSite;
253 if ($isReplaceSiteLandings)
256 'select' => [
'ID',
'TPL_ID'],
262 while ($landing = $landings->fetch())
264 $lid = (int)$landing[
'ID'];
265 $return[
'RATIO'][
'LANDINGS_BEFORE'][] = $lid;
268 if (!empty($tmpLinking))
270 $return[
'RATIO'][
'TEMPLATE_LINKING_BEFORE'][$lid] = [
271 'TPL_ID' => (int)$landing[
'TPL_ID'],
272 'TEMPLATE_REF' => $tmpLinking,
278 if (!isset($return[
'RATIO'][
'SPECIAL_PAGES']))
280 $return[
'RATIO'][
'SPECIAL_PAGES'] = [
281 'LANDING_ID_INDEX' => isset(
$data[
'LANDING_ID_INDEX']) ? (int)
$data[
'LANDING_ID_INDEX'] : 0,
282 'LANDING_ID_404' => isset(
$data[
'LANDING_ID_404']) ? (int)
$data[
'LANDING_ID_404'] : 0,
283 'LANDING_ID_503' => isset(
$data[
'LANDING_ID_503']) ? (int)
$data[
'LANDING_ID_503'] : 0,
286 $return[
'RATIO'][
'IS_PAGE_IMPORT'] = $isPageImport;
287 $return[
'RATIO'][
'TYPE'] =
$data[
'TYPE'];
289 if (isset(
$data[
'TEMPLATES']) && is_array(
$data[
'TEMPLATES']))
291 $return[
'RATIO'][
'TEMPLATES'] =
$data[
'TEMPLATES'];
295 if (!$isPageImport && !$isPageStep && !$isReplace)
297 $res = self::importSite(
$data, $structure);
298 if (
$res->isSuccess())
300 $return[
'RATIO'][
'BLOCKS'] = [];
301 $return[
'RATIO'][
'BLOCKS_PENDING'] = [];
302 $return[
'RATIO'][
'LANDINGS'] = [];
303 $return[
'RATIO'][
'TEMPLATES'] = $return[
'RATIO'][
'TEMPLATES'] ?? [];
304 $return[
'RATIO'][
'TEMPLATE_LINKING'] = [];
305 $return[
'RATIO'][
'SITE_ID'] =
$res->getId();
306 $return[
'RATIO'][
'FOLDERS_NEW'] =
$data[
'FOLDERS_NEW'] ?? [];
307 $return[
'RATIO'][
'SYS_PAGES'] =
$data[
'SYS_PAGES'];
309 if (isset(
$data[
'TPL_ID']) &&
$data[
'TPL_ID'])
311 $return[
'RATIO'][
'TEMPLATE_LINKING'][-1 *
$res->getId()] = [
312 'TPL_ID' => (int)
$data[
'TPL_ID'],
313 'TEMPLATE_REF' => (
array)(
$data[
'TEMPLATE_REF'] ?? []),
320 $return[
'ERROR_EXCEPTION'] =
$res->getErrorMessages();
326 if ($isReplace && !$isPageStep &&
$siteId)
329 $checkByType = SiteCore::getList([
335 if (!$checkByType->fetch())
337 $return[
'ERROR_EXCEPTION'] = Loc::getMessage(
'LANDING_IMPORT_ERROR_REPLACED_SITE_TYPE_INVALID');
342 $return[
'RATIO'][
'TEMPLATE_LINKING'][-1 *
$siteId] = [
343 'TPL_ID' => (int)
$data[
'TPL_ID'],
344 'TEMPLATE_REF' => (
array)(
$data[
'TEMPLATE_REF'] ?? []),
351 $return[
'ERROR_EXCEPTION'][] = Loc::getMessage(
'LANDING_IMPORT_ERROR_SITE_ID_NOT_FOUND');
356 if (!isset(
$data[
'SITE_ID']))
362 if ($isReplaceLanding)
377 if (!isset(
$data[
'TYPE']))
379 $data[
'TYPE'] =
'PAGE';
397 if (isset($additional[
'theme']) && $additional[
'theme'])
399 $color = $additional[
'theme'];
400 if ($color[0] !==
'#')
402 $color =
'#' . $color;
404 $data[
'ADDITIONAL_FIELDS'][
'THEME_COLOR'] = $color;
405 unset(
$data[
'ADDITIONAL_FIELDS'][
'THEME_CODE']);
406 $data[
'ADDITIONAL_FIELDS'][
'THEME_USE'] =
'Y';
409 if (isset($additional[
'title']) && $additional[
'title'])
411 $data[
'TITLE'] = $additional[
'title'];
417 $buttonKeys = array_keys($buttons);
418 if (!empty($buttonKeys))
420 $data[
'ADDITIONAL_FIELDS'][
'B24BUTTON_CODE'] = $buttonKeys[0];
424 $data[
'ADDITIONAL_FIELDS'][
'B24BUTTON_CODE'] =
'N';
427 $data[
'ADDITIONAL_FIELDS'][
'SPEED_USE_WEBPACK'] =
'Y';
428 $data[
'ADDITIONAL_FIELDS'][
'SPEED_USE_LAZY'] =
'Y';
430 $data[
'ADDITIONAL_FIELDS'][
'COPYRIGHT_SHOW'] =
'Y';
431 $data[
'ADDITIONAL_FIELDS'][
'COPYRIGHT_CODE'] = Copyright::getRandomPhraseId();
435 $data[
'ADDITIONAL_FIELDS'][
'COOKIES_USE'] =
'Y';
449 $replaceEncoded = base64_encode(serialize($replace));
450 $res = BlockTable::getList([
458 while ($row =
$res->fetch())
460 $blockInstance =
new Block($row[
'ID']);
461 if ($blockInstance->exist())
463 $blockInstance->updateNodes([
465 'REPLACE' => $replaceEncoded,
468 $blockInstance->save();
487 'FOLDER_ID' => array_keys($folderMapIds),
490 while ($row =
$res->fetch())
492 if (isset($folderMapIds[$row[
'FOLDER_ID']]))
495 'FOLDER_ID' => $folderMapIds[$row[
'FOLDER_ID']],
516 foreach ($foldersNew as $folderId => $folder)
520 if (!$folder[
'PARENT_ID'])
522 unset($folder[
'PARENT_ID']);
525 if ($folder[
'INDEX_ID'] ??
null)
527 $indexId = $landingMapIds[$folder[
'INDEX_ID']] ??
null;
528 unset($folder[
'INDEX_ID']);
532 if (
$res->isSuccess())
537 'FOLDER_ID' =>
$res->getId(),
539 if ($resLanding->isSuccess())
541 \Bitrix\Landing\Folder::update(
$res->getId(), [
542 'INDEX_ID' => $indexId,
546 $folderMapIds[$folderId] =
$res->getId();
550 $newFolders = SiteCore::getFolders(
$siteId);
551 foreach ($newFolders as $folder)
553 if ($folderMapIds[$folder[
'PARENT_ID']] ??
null)
555 \Bitrix\Landing\Folder::update($folder[
'ID'], [
556 'PARENT_ID' => $folderMapIds[$folder[
'PARENT_ID']],
561 self::updateFolderIds(
$siteId, $folderMapIds);
571 $ratio =
$event->getParameter(
'RATIO');
579 if (isset($ratio[
'LANDING']))
582 $siteType = $ratio[
'LANDING'][
'TYPE'];
583 $siteId = $ratio[
'LANDING'][
'SITE_ID'] ??
null;
584 $blocks = $ratio[
'LANDING'][
'BLOCKS'] ??
null;
585 $landings = $ratio[
'LANDING'][
'LANDINGS'] ?? [];
586 $blocksPending = $ratio[
'LANDING'][
'BLOCKS_PENDING'] ??
null;
587 $foldersRef = $ratio[
'LANDING'][
'FOLDERS_REF'] ??
null;
588 $templatesOld = $ratio[
'LANDING'][
'TEMPLATES'] ?? [];
589 $templateLinking = $ratio[
'LANDING'][
'TEMPLATE_LINKING'] ?? [];
590 $specialPages = $ratio[
'LANDING'][
'SPECIAL_PAGES'] ??
null;
591 $sysPages = $ratio[
'LANDING'][
'SYS_PAGES'] ??
null;
592 $foldersNew = $ratio[
'LANDING'][
'FOLDERS_NEW'] ?? [];
593 $additional =
$event->getParameter(
'ADDITIONAL_OPTION') ?? [];
598 $isPageImport = $ratio[
'LANDING'][
'IS_PAGE_IMPORT'] ??
false;
599 $isReplaceLanding = isset($ratio[
'LANDING'][
'REPLACE_LID']) && (int)$ratio[
'LANDING'][
'REPLACE_LID'] > 0;
600 $isReplaceSiteLandings = (int)($ratio[
'LANDING'][
'REPLACE_SITE_ID'] ?? 0) > 0;
601 $isReplace = $isReplaceLanding || $isReplaceSiteLandings;
602 if ($isReplaceSiteLandings &&
$siteId)
604 self::onFinishReplaceSite(
$event);
609 if (!empty($landings))
611 $mainPageId = reset($landings);
615 && $specialPages[
'LANDING_ID_INDEX']
616 && $landings[$specialPages[
'LANDING_ID_INDEX']]
619 $mainPageId = $landings[$specialPages[
'LANDING_ID_INDEX']];
625 self::linkingPendingBlocks($blocksPending, [
627 'landing' => $landings,
637 $blocks = array_reverse($blocks,
true);
638 $landings = array_reverse($landings,
true);
639 foreach ($blocks as $oldId => $newId)
641 $replace[
'/#block' . $oldId .
'([^\d]{1})/'] =
'#block' . $newId .
'$1';
643 foreach ($landings as $oldId => $newId)
645 $replace[
'/#landing' . $oldId .
'([^\d]{1})/'] =
'#landing' . $newId .
'$1';
648 $res = BlockTable::getList([
653 'ID' => array_values($blocks),
654 '!ID' => $blocksPending,
657 while ($row =
$res->fetch())
660 $row[
'CONTENT'] = preg_replace(
661 array_keys($replace),
662 array_values($replace),
669 BlockTable::update($row[
'ID'], [
670 'CONTENT' => $row[
'CONTENT'],
687 'FOLDER_ID' => array_keys($foldersRef),
690 while ($row =
$res->fetch())
693 'FOLDER_ID' => $foldersRef[$row[
'FOLDER_ID']],
699 self::addFolders(
$siteId, $foldersNew, $landings);
702 if (!$isPageImport || $isReplaceSiteLandings)
712 while ($row =
$res->fetch())
714 $templatesNew[$row[
'XML_ID']] = $row[
'ID'];
716 foreach ($templatesOld as $oldId => $oldXmlId)
718 if (is_string($oldXmlId) && isset($templatesNew[$oldXmlId]))
720 $templatesRefs[$oldId] = $templatesNew[$oldXmlId];
725 foreach ($templateLinking as
$entityId => $templateItem)
727 $tplId = $templateItem[
'TPL_ID'];
729 if (isset($templatesRefs[$tplId]))
731 $tplId = $templatesRefs[$tplId];
732 foreach ($templateItem[
'TEMPLATE_REF'] as $areaId => $landingId)
734 if (intval($landingId) && isset($landings[$landingId]))
736 $tplRefs[$areaId] = $landings[$landingId];
759 foreach ($specialPages as
$code => $id)
761 $specialPages[
$code] = isset($landings[$id]) ? $landings[$id] : 0;
763 SiteCore::update(
$siteId, $specialPages);
767 if (is_array($sysPages) &&
$siteId)
769 foreach ($sysPages as $sysPage)
771 if (isset($landings[$sysPage[
'LANDING_ID']]))
780 if ($mainPageId && !$isReplaceLanding)
782 self::setAdditionalPageFields($mainPageId, $additional);
789 'class' =>
'ui-btn ui-btn-md ui-btn-success ui-btn-round',
790 'data-is-site' =>
'Y',
797 $linkAttrs[
'data-is-landing'] =
'Y';
798 $linkAttrs[
'data-landing-id'] = $mainPageId;
800 $linkText = Loc::getMessage(
'LANDING_IMPORT_FINISH_GOTO_SITE');
801 if ($siteType ===
'KNOWLEDGE')
803 $linkAttrs[
'href'] = \Bitrix\Landing\Site::getPublicUrl(
$siteId);
805 elseif ($siteType ===
'PAGE' && empty($additional))
807 $linkText = Loc::getMessage(
'LANDING_IMPORT_FINISH_GOTO_PAGE');
809 if (
$url ===
'' && ModuleManager::isModuleInstalled(
'bitrix24'))
811 $linkAttrs[
'href'] =
'/sites/';
815 $linkAttrs[
'href'] = str_replace(
828 elseif ($siteType ===
'MAINPAGE')
830 $linkText = Loc::getMessage(
'LANDING_IMPORT_FINISH_GOTO_MAINPAGE');
831 if (Loader::includeModule(
'intranet'))
833 $manager = new \Bitrix\Landing\Mainpage\Manager();
840 if ($isReplaceLanding)
842 $linkAttrs[
'data-replace-lid'] = (int)$ratio[
'LANDING'][
'REPLACE_LID'];
849 'attrs' => $linkAttrs,
855 if (mb_strpos($linkAttrs[
'href'],
'#') !== 0)
857 $script =
"setTimeout(() => {
858 top.window.location.href='{$linkAttrs['href']}';
870 && array_key_exists(
'st_category', $additional)
871 && array_key_exists(
'st_event', $additional)
872 &&
Metrika\Categories::tryFrom($additional[
'st_category'])
873 &&
Metrika\Events::tryFrom($additional[
'st_event'])
877 Metrika\Categories::tryFrom($additional[
'st_category']),
878 Metrika\Events::tryFrom($additional[
'st_event']),
880 $metrika->setStatus(
Metrika\Statuses::Success);
881 $metrika->setType(
Metrika\Types::template);
883 if (array_key_exists(
'st_section', $additional))
885 $metrika->setSection(
Metrika\Sections::tryFrom($additional[
'st_section']));
888 ->setParam(1,
'appCode', $additional[
'appCode'] ??
'')
889 ->setParam(3,
'siteId',
$siteId)
895 'CREATE_DOM_LIST' => $domList,
898 'publicUrl' => \Bitrix\Landing\Site::getPublicUrl(
$siteId),
911 $additionalFields = [];
914 if (!empty($additional))
916 if (isset($additional[
'title']))
918 $additionalFields[
'METAMAIN_TITLE'] = $additional[
'title'];
919 $additionalFields[
'METAOG_TITLE'] = $additional[
'title'];
922 'TITLE' => $additional[
'title'],
925 if (isset($additional[
'description']))
927 $additionalFields[
'METAMAIN_DESCRIPTION'] = $additional[
'description'];
928 $additionalFields[
'METAOG_DESCRIPTION'] = $additional[
'description'];
942 $ratio =
$event->getParameter(
'RATIO');
943 $siteId = $ratio[
'LANDING'][
'SITE_ID'] ??
null;
950 History::deactivate();
952 $landingsBefore = $ratio[
'LANDING'][
'LANDINGS_BEFORE'] ?? [];
953 $landings = $ratio[
'LANDING'][
'LANDINGS'] ?? [];
954 foreach ($landingsBefore as $lidToDelete)
957 LandingCore::markDelete($lidToDelete);
960 $specialPages = $ratio[
'LANDING'][
'SPECIAL_PAGES'] ??
null;
963 && $specialPages[
'LANDING_ID_INDEX']
964 && $landings[$specialPages[
'LANDING_ID_INDEX']]
967 $index = $landings[$specialPages[
'LANDING_ID_INDEX']];
970 'LANDING_ID_INDEX' => $index ?? 0
973 $additionalFieldsSiteBefore = $ratio[
'LANDING'][
'ADDITIONAL_FIELDS_SITE_BEFORE'] ?? [];
974 $additionalFieldsSite = $ratio[
'LANDING'][
'ADDITIONAL_FIELDS_SITE'] ?? [];
975 if (!empty($additionalFieldsSite))
977 SiteCore::saveAdditionalFields(
$siteId, $additionalFieldsSite);
984 $templateLinkingBefore = $ratio[
'LANDING'][
'TEMPLATE_LINKING_BEFORE'] ?? [];
985 $templateLinking = $ratio[
'LANDING'][
'TEMPLATE_LINKING'] ?? [];
989 $history->push(
'REPLACE_SITE_LANDINGS', [
992 'landingsBefore' => $landingsBefore,
993 'landings' => $landings,
995 'templateLinkingBefore' => $templateLinkingBefore,
996 'templateLinking' => $templateLinking,
998 'additionalFieldsSiteBefore' => $additionalFieldsSiteBefore,
999 'additionalFieldsSite' => $additionalFieldsSite,
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
static addToSite(int $id, int $fileId, bool $temp=false)
static saveAdditionalFields(Entity\Event $event)
static getOption($code, $default=null)
static getUrlFromFile($file)
static getList(array $params=array())
static setContextUserId(int $uid)
static getPublicationPath()
static set($id, $type, $lid=false)
static getForLanding($id)
static setForLanding($id, array $data=array())
static setForSite($id, array $data=array())
static saveFile(array $file)
const SYSTEM_COMPONENT_REST_PENDING
static getAdditionalFieldsForReplaceBySite(int $siteId)
static replaceLanding(Event $event)
static importLanding(Event $event)
static importSite(array $data, Configuration\Structure $structure)
static updateFolderIds(int $siteId, array $folderMapIds)
static setAdditionalPageFields($landingId, array $additional)
static linkingPendingBlocks(array $pendingIds, array $replace)
static prepareAdditionalFields(array $data, ?array $additional)
static nextStep(Event $event)
static getInitManifest(Event $event)
static getUrl(string $type)
static onFinish(Event $event)
static onFinishReplaceSite(Event $event)
static addFolders(int $siteId, array $foldersNew, array $landingMapIds)
static prepareData(array $data)
static update($primary, array $data)
static getList(array $parameters=array())
static getConfigurationImportManifestUrl($code)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
randString($pass_len=10, $pass_chars=false)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if(empty($signedUserToken)) $key