• Модуль: landing
  • Путь к файлу: ~/bitrix/modules/landing/lib/publicaction/demos.php
  • Класс: BitrixLandingPublicActionDemos
  • Вызов: Demos::register
static function register(array $data = array(), array $params = array())
{
	$result = new PublicActionResult();
	$error = new BitrixLandingError;
	$themeCode = null;
	$themeCodeTypo = null;

	// make line array from site and pages
	if (
		isset($data['items'])
	)
	{
		if (is_array($data['items']))
		{
			$dataPages = $data['items'];
		}
		else
		{
			$dataPages = array();
		}
		unset($data['items']);
		// set theme codes from sites to pages
		if (isset($data['fields']['ADDITIONAL_FIELDS']['THEME_CODE']))
		{
			$themeCode = $data['fields']['ADDITIONAL_FIELDS']['THEME_CODE'];
		}
		if (isset($data['fields']['ADDITIONAL_FIELDS']['THEME_CODE_TYPO']))
		{
			$themeCodeTypo = $data['fields']['ADDITIONAL_FIELDS']['THEME_CODE_TYPO'];
		}
		foreach ($dataPages as &$page)
		{
			if (
				!isset($page['fields']) ||
				!is_array($page['fields'])
			)
			{
				$page['fields'] = array();
			}
			if (
				!isset($page['fields']['ADDITIONAL_FIELDS']) ||
				!is_array($page['fields']['ADDITIONAL_FIELDS'])
			)
			{
				$page['fields']['ADDITIONAL_FIELDS'] = array();
			}
			if (!isset($page['fields']['ADDITIONAL_FIELDS']['THEME_CODE']))
			{
				$page['fields']['ADDITIONAL_FIELDS']['THEME_CODE'] = $themeCode;
			}
			if (!isset($page['fields']['ADDITIONAL_FIELDS']['THEME_CODE_TYPO']))
			{
				$page['fields']['ADDITIONAL_FIELDS']['THEME_CODE_TYPO'] = $themeCodeTypo;
			}
		}
		unset($page);

		$data['items'] = array_keys($dataPages);
		$data['tpl_type'] = DemoCore::TPL_TYPE_SITE;
		$data = array_merge([$data], $dataPages);
	}

	if (empty($data) || !is_array($data))
	{
		$error->addError(
			'REGISTER_ERROR_DATA',
			Loc::getMessage('LANDING_DEMO_REGISTER_ERROR_DATA')
		);
		$result->setError($error);
		return $result;
	}

	// set app code
	if (($app = BitrixLandingPublicAction::restApplication()))
	{
		$appCode = $app['CODE'];
	}
	else
	{
		$appCode = null;
	}

	$deleteAdded = function(array $added)
	{
		foreach ($added as $id)
		{
			DemoCore::delete($id);
		}
	};

	// add item separate
	$success = $return = array();
	$fieldCode = array(
		'TYPE', 'TPL_TYPE', 'SHOW_IN_LIST', 'TITLE', 'DESCRIPTION',
		'PREVIEW_URL', 'PREVIEW', 'PREVIEW2X', 'PREVIEW3X'
	);
	foreach ($data as $item)
	{
		// collect fields
		$fields = array(
			'XML_ID' => null,
			'APP_CODE' => $appCode,
			'TPL_TYPE' => DemoCore::TPL_TYPE_PAGE,
			'LANG' => []
		);
		if (isset($params['site_template_id']))
		{
			$fields['SITE_TEMPLATE_ID'] = $params['site_template_id'];
		}
		else
		{
			$fields['SITE_TEMPLATE_ID'] = '';
		}
		if (isset($item['code']))
		{
			$fields['XML_ID'] = trim($item['code']);
		}
		if (isset($item['name']))
		{
			$fields['TITLE'] = $item['name'];
		}
		if (isset($params['lang']))
		{
			$fields['LANG']['lang'] = $params['lang'];
		}
		if (isset($params['lang_original']))
		{
			$fields['LANG']['lang_original'] = $params['lang_original'];
		}
		if (isset($item['items']) && !is_array($item['items']))
		{
			$item['items'] = [];
		}
		foreach ($fieldCode as $code)
		{
			$codel = mb_strtolower($code);
			if (isset($item[$codel]))
			{
				$fields[$code] = $item[$codel];
			}
		}
		// serialize and check content
		$item = (array) $item;
		$fields['LANG'] = (array) $fields['LANG'];
		$fields['MANIFEST'] = serialize($item);
		if ($fields['LANG'])
		{
			$fields['LANG'] = serialize($fields['LANG']);
		}
		else
		{
			unset($fields['LANG']);
		}
		if (isset($item['fields']['ADDITIONAL_FIELDS']))
		{
			unset($item['fields']['ADDITIONAL_FIELDS']);
		}
		BitrixLandingManager::sanitize(
			serialize($item),
			$bad
		);
		if ($bad)
		{
			$error->addError(
				'CONTENT_IS_BAD',
				Loc::getMessage('LANDING_DEMO_CONTENT_IS_BAD') .
				' [code: ' . $fields['XML_ID'] . ']'
			);
			$result->setError($error);
			$deleteAdded($success);
			return $result;
		}
		$check = false;
		// check unique
		if ($fields['XML_ID'])
		{
			$check = DemoCore::getList(array(
				'select' => array(
					'ID'
				),
				'filter' =>
					isset($fields['APP_CODE'])
					? array(
						'=XML_ID' => $fields['XML_ID'],
						'=APP_CODE' => $fields['APP_CODE'],
						'=TPL_TYPE' => $fields['TPL_TYPE']
					)
					: array(
						'=XML_ID' => $fields['XML_ID'],
						'=TPL_TYPE' => $fields['TPL_TYPE']
					)
				)
			)->fetch();
		}
		// register (add / update)
		if ($check)
		{
			$res = DemoCore::update($check['ID'], $fields);
		}
		else
		{
			$res = DemoCore::add($fields);
			if ($res->isSuccess())
			{
				$success[] = $res->getId();
			}
		}
		if ($res->isSuccess())
		{
			$return[] = (int)$res->getId();
		}
		else
		{
			$error->addFromResult($res);
			$result->setError($error);
			$deleteAdded($success);
			return $result;
		}
	}

	$result->setResult($return);

	return $result;
}