%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/landing/lib/publicaction/ |
| Current File : //home/bitrix/www/bitrix/modules/landing/lib/publicaction/demos.php |
<?php
namespace Bitrix\Landing\PublicAction;
use \Bitrix\Main\Localization\Loc;
use \Bitrix\Landing\Demos as DemoCore;
use \Bitrix\Landing\PublicActionResult;
Loc::loadMessages(__FILE__);
class Demos
{
/**
* Get demo items from files in component.
* @param string $type Type of demo-template (page, store, etc...).
* @param bool $page If true, list of pages, not site.
* @return \Bitrix\Landing\PublicActionResult
*/
protected static function getFilesList($type, $page = false)
{
$result = new PublicActionResult();
$componentName = 'bitrix:landing.demo';
$className = \CBitrixComponent::includeComponentClass($componentName);
$demoCmp = new $className;
$demoCmp->initComponent($componentName);
$demoCmp->arParams = array(
'TYPE' => strtoupper($type)
);
if ($page)
{
$data = $demoCmp->getDemoPage();
}
else
{
$data = $demoCmp->getDemoSite();
}
if (is_array($data))
{
foreach ($data as &$item)
{
if (isset($item['DATA']['items']))
{
// always convert to UTF-8 for REST
$item['DATA']['encoded'] = true;
$item['DATA']['charset'] = 'UTF-8';
$item['DATA']['items'] = \Bitrix\Main\Text\Encoding::convertEncoding(
$item['DATA']['items'],
SITE_CHARSET,
'UTF-8'
);
}
}
unset($item);
}
$result->setResult($data);
return $result;
}
/**
* Get demo sites.
* @param string $type Type of demo-template (page, store, etc...).
* @return \Bitrix\Landing\PublicActionResult
*/
public static function getSiteList($type)
{
return self::getFilesList($type);
}
/**
* Get demo pages.
* @param string $type Type of demo-template (page, store, etc...).
* @return \Bitrix\Landing\PublicActionResult
*/
public static function getPageList($type)
{
return self::getFilesList($type, true);
}
/**
* Get preview of url by code.
* @param string $code Code of page.
* @param string $type Code of content.
* @return \Bitrix\Landing\PublicActionResult
*/
public static function getUrlPreview($code, $type)
{
$result = new PublicActionResult();
$componentName = 'bitrix:landing.demo';
$className = \CBitrixComponent::includeComponentClass($componentName);
$demoCmp = new $className;
$demoCmp->initComponent($componentName);
$demoCmp->arParams = array(
'TYPE' => strtoupper($type)
);
$result->setResult($demoCmp->getUrlPreview($code));
return $result;
}
/**
* Register new demo template (site [and pages]).
* @param array $data Full data from \Bitrix\Landing\Site::fullExport.
* @see \Bitrix\Landing\Site::fullExport
* @return \Bitrix\Landing\PublicActionResult
*/
public static function register($data = array())
{
$result = new PublicActionResult();
$error = new \Bitrix\Landing\Error;
$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 = \Bitrix\Landing\PublicAction::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
);
if (isset($item['code']))
{
$fields['XML_ID'] = trim($item['code']);
}
if (isset($item['name']))
{
$fields['TITLE'] = $item['name'];
}
foreach ($fieldCode as $code)
{
$codel = strtolower($code);
if (isset($item[$codel]))
{
$fields[$code] = $item[$codel];
}
}
$fields['MANIFEST'] = serialize((array)$item);
\Bitrix\Landing\Manager::sanitize(
$fields['MANIFEST'],
$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[] = $res->getId();
}
else
{
$error->addFromResult($res);
$result->setError($error);
$deleteAdded($success);
return $result;
}
}
$result->setResult($return);
return $result;
}
/**
* Unregister demo template.
* @param string $code Code of item.
* @return \Bitrix\Landing\PublicActionResult
*/
public static function unregister($code)
{
$result = new PublicActionResult();
$error = new \Bitrix\Landing\Error;
$result->setResult(false);
// search and delete
if ($code)
{
// set app code
$app = \Bitrix\Landing\PublicAction::restApplication();
$res = DemoCore::getList(array(
'select' => array(
'ID'
),
'filter' =>
isset($app['CODE'])
? array(
'=XML_ID' => $code,
'=APP_CODE' => $app['CODE']
)
: array(
'=XML_ID' => $code
)
));
while ($row = $res->fetch())
{
// delete block from repo
$resDel = DemoCore::delete($row['ID']);
if ($resDel->isSuccess())
{
$result->setResult(true);
}
else
{
$error->addFromResult($resDel);
$result->setError($error);
return $result;
}
}
}
return $result;
}
/**
* Get items of current app.
* @param array $params Params ORM array.
* @return \Bitrix\Landing\PublicActionResult
*/
public static function getList($params = array())
{
$result = new PublicActionResult();
if (!is_array($params))
{
$params = array();
}
if (
!isset($params['filter']) ||
!is_array($params['filter'])
)
{
$params['filter'] = array();
}
// set app code
if (($app = \Bitrix\Landing\PublicAction::restApplication()))
{
$params['filter']['APP_CODE'] = $app['CODE'];
}
else
{
$params['filter']['APP_CODE'] = false;
}
$data = array();
$res = DemoCore::getList($params);
while ($row = $res->fetch())
{
$row['MANIFEST'] = unserialize($row['MANIFEST']);
$data[] = $row;
}
$result->setResult($data);
return $result;
}
}