• Модуль: landing
  • Путь к файлу: ~/bitrix/modules/landing/lib/transfer/import/landing.php
  • Класс: BitrixLandingTransferImportLanding
  • Вызов: Landing::importBlock
static function importBlock(LandingCore $landing, array $block, ConfigurationStructure $structure, bool &$pending = false): int
{
	static $sort = 0;
	static $appChecked = [];

	$blockId = 0;

	// if this is a REST block
	if (
		isset($block['repo_block']['app_code']) &&
		isset($block['repo_block']['xml_id']) &&
		is_string($block['repo_block']['app_code']) &&
		is_string($block['repo_block']['xml_id'])
	)
	{
		unset($block['code']);

		$repoId = self::getRepoId(
			$block['repo_block']['app_code'],
			$block['repo_block']['xml_id']
		);
		if ($repoId)
		{
			$block['code'] = 'repo_' . $repoId;
		}

		// force append REST blocks
		if (
			!isset($block['code']) &&
			!empty($block['repo_info']) &&
			self::$forceAppendRestBlocks
		)
		{
			$appCode = $block['repo_block']['app_code'];
			if (!array_key_exists($appCode, $appChecked))
			{
				$appChecked[$appCode] = BitrixLandingRepo::getAppByCode($appCode);
			}

			if ($appChecked[$appCode])
			{
				$repoInfo = $block['repo_info'];
				$res = Repo::add([
					'APP_CODE' => $block['repo_block']['app_code'],
					'XML_ID' => $block['repo_block']['xml_id'],
					'NAME' => $repoInfo['NAME'] ?? null,
					'DESCRIPTION' => $repoInfo['DESCRIPTION'] ?? null,
					'SECTIONS' => $repoInfo['SECTIONS'] ?? null,
					'PREVIEW' => $repoInfo['PREVIEW'] ?? null,
					'MANIFEST' => serialize(unserialize($repoInfo['MANIFEST'] ?? '', ['allowed_classes' => false])),
					'CONTENT' => $repoInfo['CONTENT'] ?? null
				]);
				if ($res->isSuccess())
				{
					$block['code'] = 'repo_' . $res->getId();
				}
			}
		}

		if (!isset($block['code']))
		{
			$pending = true;
			$blockId = $landing->addBlock(
				AppConfiguration::SYSTEM_BLOCK_REST_PENDING,
				[
					'PUBLIC' => 'N',
					'SORT' => $sort,
					'ANCHOR' => $block['anchor'] ?? '',
					'INITIATOR_APP_CODE' => $block['repo_block']['app_code'] ?? null
				]
			);
			if ($blockId)
			{
				$sort += 500;
				$blockInstance = $landing->getBlockById($blockId);
				if ($blockInstance)
				{
					if (isset($block['nodes']) && is_array($block['nodes']))
					{
						$block['nodes'] = self::addFilesToBlock(
							$blockInstance,
							$block['nodes'],
							$structure,
							true
						);
					}
					$blockInstance->updateNodes([
						AppConfiguration::SYSTEM_COMPONENT_REST_PENDING => [
							'BLOCK_ID' => $blockId,
							'DATA' => base64_encode(serialize($block)),
						],
					]);
					$blockInstance->save();
				}
			}
			return $blockId;
		}
	}

	if (!isset($block['code']))
	{
		return $blockId;
	}

	// add block to the landing
	$blockFields = [
		'PUBLIC' => 'N',
		'SORT' => $sort,
		'ANCHOR' => $block['anchor'] ?? '',
		'INITIATOR_APP_CODE' => $block['repo_block']['app_code'] ?? null
	];
	if ($block['full_content'] ?? null)
	{
		$blockFields['CONTENT'] = str_replace(
			[''],
			['< ?', '? >'],
			$block['full_content']
		);
	}
	if ($block['designed'] ?? null)
	{
		$blockFields['DESIGNED'] = 'Y';
	}
	$blockId = $landing->addBlock(
		$block['code'],
		$blockFields
	);
	if ($blockId)
	{
		$sort += 500;
		$blockInstance = $landing->getBlockById($blockId);
		if (isset($block['nodes']) && is_array($block['nodes']))
		{
			$block['nodes'] = self::addFilesToBlock(
				$blockInstance,
				$block['nodes'],
				$structure
			);
		}
		if ($block['meta']['FAVORITE_META'] ?? [])
		{
			$favoriteMeta = $block['meta']['FAVORITE_META'];
			if ($block['repo_block']['app_code'] ?? null)
			{
				$favoriteMeta['tpl_code'] = $block['repo_block']['app_code'];
			}
			if (intval($favoriteMeta['preview'] ?? 0) > 0)
			{
				$unpackFile = $structure->getUnpackFile($favoriteMeta['preview']);
				if ($unpackFile)
				{
					$favoriteMeta['preview'] = AppConfiguration::saveFile($unpackFile);
					File::addToBlock($blockInstance->getId(), $favoriteMeta['preview']);
				}
				if (!$favoriteMeta['preview'])
				{
					unset($favoriteMeta['preview']);
				}
			}
			$blockInstance->changeFavoriteMeta($favoriteMeta);
			BitrixLandingBlock::clearRepositoryCache();
		}
		if ($blockFields['CONTENT'] ?? null)
		{
			$blockInstance->saveContent($blockFields['CONTENT'], $block['designed'] ?? false);
		}
		self::saveDataToBlock($blockInstance, $block);
		$blockInstance->save();
		// if block is favorite
		if (intval($block['meta']['LID'] ?? -1) === 0)
		{
			$blockInstance->changeLanding(0);
		}
	}

	return $blockId;
}