- Модуль: 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;
}