%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/landing/lib/publicaction/ |
| Current File : //home/bitrix/www/bitrix/modules/landing/lib/publicaction/landing.php |
<?php
namespace Bitrix\Landing\PublicAction;
use \Bitrix\Landing\Manager;
use \Bitrix\Landing\File;
use \Bitrix\Landing\Block as BlockCore;
use \Bitrix\Landing\TemplateRef;
use \Bitrix\Landing\Landing as LandingCore;
use \Bitrix\Landing\PublicActionResult;
use \Bitrix\Landing\Internals\HookDataTable;
use \Bitrix\Main\Localization\Loc;
Loc::loadMessages(__FILE__);
class Landing
{
/**
* Clear disallow keys from add/update fields.
* @param array $fields
* @return array
*/
protected static function clearDisallowFields($fields)
{
$disallow = array('RULE', 'TPL_CODE', 'ACTIVE');
if (is_array($fields))
{
foreach ($fields as $k => $v)
{
if (in_array($k, $disallow))
{
unset($fields[$k]);
}
}
}
return $fields;
}
/**
* Get preview picture of landing.
* @param int $lid Id of landing.
* @return \Bitrix\Landing\PublicActionResult
*/
public static function getPreview($lid)
{
$result = new PublicActionResult();
$landing = LandingCore::createInstance($lid);
if ($landing->exist())
{
$result->setResult($landing->getPreview());
}
$result->setError($landing->getError());
return $result;
}
/**
* Get public url of landing.
* @param int $lid Id of landing.
* @return \Bitrix\Landing\PublicActionResult
*/
public static function getPublicUrl($lid)
{
$result = new PublicActionResult();
$landing = LandingCore::createInstance($lid);
if ($landing->exist())
{
$result->setResult(
$landing->getPublicUrl()
);
}
$result->setError($landing->getError());
return $result;
}
/**
* Get additional fields of landing.
* @param int $lid Id of landing.
* @return \Bitrix\Landing\PublicActionResult
*/
public static function getAdditionalFields($lid)
{
$result = new PublicActionResult();
$landing = LandingCore::createInstance($lid);
if ($landing->exist())
{
$fields = $landing->getAdditionalFields($landing->getId());
foreach ($fields as $key => $field)
{
$fields[$key] = $field->getValue();
if (!$fields[$key])
{
unset($fields[$key]);
}
}
$result->setResult(
$fields
);
}
$result->setError($landing->getError());
return $result;
}
/**
* Publication of landing.
* @param int $lid Id of landing.
* @return \Bitrix\Landing\PublicActionResult
*/
public static function publication($lid)
{
$result = new PublicActionResult();
$landing = LandingCore::createInstance($lid);
if ($landing->exist())
{
if ($landing->publication())
{
$result->setResult(true);
}
}
$result->setError($landing->getError());
return $result;
}
/**
* Cancel publication of landing.
* @param int $lid Id of landing.
* @return \Bitrix\Landing\PublicActionResult
*/
public static function unpublic($lid)
{
$result = new PublicActionResult();
$landing = LandingCore::createInstance($lid);
if ($landing->exist())
{
$result->setResult(
$landing->unpublic()
);
}
$result->setError($landing->getError());
return $result;
}
/**
* Add new block to the landing.
* @param int $lid Id of landing.
* @param array $fields Data array of block.
* @return \Bitrix\Landing\PublicActionResult
*/
public static function addBlock($lid, $fields)
{
LandingCore::setEditMode();
$result = new PublicActionResult();
$landing = LandingCore::createInstance($lid);
if ($landing->exist())
{
$data = array(
'PUBLIC' => 'N'
);
if (isset($fields['ACTIVE']))
{
$data['ACTIVE'] = $fields['ACTIVE'];
}
if (isset($fields['CONTENT']))
{
$data['CONTENT'] = Manager::sanitize(
$fields['CONTENT'],
$bad
);
}
// sort
if (isset($fields['AFTER_ID']))
{
$blocks = $landing->getBlocks();
if (isset($blocks[$fields['AFTER_ID']]))
{
$data['SORT'] = $blocks[$fields['AFTER_ID']]->getSort() + 1;
}
}
else
{
$data['SORT'] = -1;
}
$newBlockId = $landing->addBlock(
isset($fields['CODE']) ? $fields['CODE'] : '',
$data
);
// re-sort
$landing->resortBlocks();
// want return content ob block
if (
isset($fields['RETURN_CONTENT']) &&
$fields['RETURN_CONTENT'] == 'Y'
)
{
$return = BlockCore::getBlockContent($newBlockId, true);
}
else
{
$return = $newBlockId;
}
$result->setResult($return);
}
$result->setError($landing->getError());
return $result;
}
/**
* Delete the block from the landing.
* @param int $lid Id of landing.
* @param int $block Block id.
* @return \Bitrix\Landing\PublicActionResult
*/
public static function deleteBlock($lid, $block)
{
LandingCore::setEditMode();
$result = new PublicActionResult();
$landing = LandingCore::createInstance($lid);
if ($landing->exist())
{
$result->setResult($landing->deleteBlock($block));
$landing->resortBlocks();
}
$result->setError($landing->getError());
return $result;
}
/**
* Mark delete or not the block.
* @param int $lid Id of landing.
* @param int $block Block id.
* @param boolean $mark Mark.
* @return \Bitrix\Landing\PublicActionResult
*/
public static function markDeletedBlock($lid, $block, $mark = true)
{
LandingCore::setEditMode();
$result = new PublicActionResult();
$landing = LandingCore::createInstance($lid);
if ($landing->exist())
{
$result->setResult(
$landing->markDeletedBlock($block, $mark)
);
$landing->resortBlocks();
}
$result->setError($landing->getError());
return $result;
}
/**
* Mark undelete the block.
* @param int $lid Id of landing.
* @param int $block Block id.
* @return \Bitrix\Landing\PublicActionResult
*/
public static function markUnDeletedBlock($lid, $block)
{
return self::markDeletedBlock($lid, $block, false);
}
/**
* Sort the block on the landing.
* @param int $lid Id of landing.
* @param int $block Block id.
* @param string $action Code: up or down.
* @return \Bitrix\Landing\PublicActionResult
*/
private static function sort($lid, $block, $action)
{
$result = new PublicActionResult();
$landing = LandingCore::createInstance($lid);
if ($landing->exist())
{
if ($action == 'up')
{
$result->setResult($landing->upBlock($block));
}
else
{
$result->setResult($landing->downBlock($block));
}
$landing->resortBlocks();
}
$result->setError($landing->getError());
return $result;
}
/**
* Sort up the block on the landing.
* @param int $lid Id of landing.
* @param int $block Block id.
* @return \Bitrix\Landing\PublicActionResult
*/
public static function upBlock($lid, $block)
{
LandingCore::setEditMode();
return self::sort($lid, $block, 'up');
}
/**
* Sort down the block on the landing.
* @param int $lid Id of landing.
* @param int $block Block id.
* @return \Bitrix\Landing\PublicActionResult
*/
public static function downBlock($lid, $block)
{
LandingCore::setEditMode();
return self::sort($lid, $block, 'down');
}
/**
* Show/hide the block on the landing.
* @param int $lid Id of landing.
* @param int $block Block id.
* @param string $action Code: show or hide.
* @return \Bitrix\Landing\PublicActionResult
*/
private static function activate($lid, $block, $action)
{
$result = new PublicActionResult();
$landing = LandingCore::createInstance($lid);
if ($landing->exist())
{
if ($action == 'show')
{
$result->setResult($landing->showBlock($block));
}
else
{
$result->setResult($landing->hideBlock($block));
}
}
$result->setError($landing->getError());
return $result;
}
/**
* Activate the block on the landing.
* @param int $lid Id of landing.
* @param int $block Block id.
* @return \Bitrix\Landing\PublicActionResult
*/
public static function showBlock($lid, $block)
{
LandingCore::setEditMode();
return self::activate($lid, $block, 'show');
}
/**
* Dectivate the block on the landing.
* @param int $lid Id of landing.
* @param int $block Block id.
* @return \Bitrix\Landing\PublicActionResult
*/
public static function hideBlock($lid, $block)
{
LandingCore::setEditMode();
return self::activate($lid, $block, 'hide');
}
/**
* Copy/move other block to this landing.
* @param int $lid Id of landing.
* @param int $block Block id.
* @param array $params Params array.
* @return \Bitrix\Landing\PublicActionResult
*/
private static function changeParentOfBlock($lid, $block, $params)
{
$result = new PublicActionResult();
$landing = LandingCore::createInstance($lid);
$afterId = isset($params['AFTER_ID']) ? $params['AFTER_ID'] : 0;
if ($landing->exist())
{
if ($params['MOVE'])
{
$res = $landing->moveBlock($block, $afterId);
}
else
{
$res = $landing->copyBlock($block, $afterId);
}
if (
isset($params['RETURN_CONTENT']) &&
$params['RETURN_CONTENT'] == 'Y'
)
{
$result->setResult(array(
'result' => $res > 0,
'content' => BlockCore::getBlockContent($res, true)
));
}
else
{
$result->setResult($res);
}
}
$result->setError($landing->getError());
return $result;
}
/**
* Copy other block to this landing.
* @param int $lid Id of landing.
* @param int $block Block id.
* @param array $params Params array.
* @return \Bitrix\Landing\PublicActionResult
*/
public static function copyBlock($lid, $block, $params = array())
{
if (!is_array($params))
{
$params = array();
}
$params['MOVE'] = false;
LandingCore::setEditMode();
return self::changeParentOfBlock($lid, $block, $params);
}
/**
* Move other block to this landing.
* @param int $lid Id of landing.
* @param int $block Block id.
* @param array $params Params array.
* @return \Bitrix\Landing\PublicActionResult
*/
public static function moveBlock($lid, $block, $params = array())
{
if (!is_array($params))
{
$params = array();
}
$params['MOVE'] = true;
LandingCore::setEditMode();
return self::changeParentOfBlock($lid, $block, $params);
}
/**
* Remove entities of Landing - images / blocks.
* @param int $lid Landing id.
* @param array $data Data for remove.
* @return PublicActionResult
*/
public static function removeEntities($lid, $data)
{
$result = new PublicActionResult();
LandingCore::setEditMode();
$landing = LandingCore::createInstance($lid);
if ($landing->exist())
{
$blocks = $landing->getBlocks();
if (isset($data['blocks']) && is_array($data['blocks']))
{
foreach ($data['blocks'] as $block)
{
self::deleteBlock($lid, $block);
unset($blocks[$block]);
}
}
if (isset($data['images']) && is_array($data['images']))
{
foreach ($data['images'] as $item)
{
if (isset($blocks[$item['block']]))
{
File::deleteFromBlock($item['block'], $item['image']);
}
}
}
$result->setResult(true);
}
$result->setError($landing->getError());
return $result;
}
/**
* Get available landings.
* @param array $params Params ORM array.
* @return \Bitrix\Landing\PublicActionResult
*/
public static function getList($params = array())
{
$result = new PublicActionResult();
if (isset($params['get_preview']))
{
$preview = !!$params['get_preview'];
unset($params['get_preview']);
}
else
{
$preview = false;
}
$params['select'] = ['*'];
$params['check_area'] = true;
if (isset($params['check_area']))
{
$checkArea = !!$params['check_area'];
unset($params['check_area']);
}
else
{
$checkArea = false;
}
$data = array();
$res = LandingCore::getList($params);
while ($row = $res->fetch())
{
if ($preview && isset($row['ID']))
{
$landing = LandingCore::createInstance($row['ID']);
$row['PREVIEW'] = $landing->getPreview();
}
if ($checkArea && isset($row['ID']))
{
$data[$row['ID']] = $row;
}
else
{
$checkArea = false;
$data[] = $row;
}
}
// landing is area?
if ($checkArea)
{
$areas = TemplateRef::landingIsArea(
array_keys($data)
);
foreach ($areas as $lid => $isA)
{
$data[$lid]['IS_AREA'] = $isA;
}
}
$result->setResult(array_values($data));
return $result;
}
/**
* Create new landing.
* @param array $fields Landing data.
* @return \Bitrix\Landing\PublicActionResult
*/
public static function add($fields)
{
$result = new PublicActionResult();
$error = new \Bitrix\Landing\Error;
$fields = self::clearDisallowFields($fields);
$fields['ACTIVE'] = 'N';
$res = LandingCore::add($fields);
if ($res->isSuccess())
{
$result->setResult($res->getId());
}
else
{
$error->addFromResult($res);
$result->setError($error);
}
return $result;
}
/**
* Update landing.
* @param int $lid Landing id.
* @param array $fields Landing new data.
* @return \Bitrix\Landing\PublicActionResult
*/
public static function update($lid, $fields)
{
$result = new PublicActionResult();
$error = new \Bitrix\Landing\Error;
$fields = self::clearDisallowFields($fields);
$res = LandingCore::update($lid, $fields);
if ($res->isSuccess())
{
$result->setResult(true);
}
else
{
$error->addFromResult($res);
$result->setError($error);
}
return $result;
}
/**
* Delete landing.
* @param int $lid Landing id.
* @return \Bitrix\Landing\PublicActionResult
*/
public static function delete($lid)
{
$result = new PublicActionResult();
$error = new \Bitrix\Landing\Error;
$res = LandingCore::delete($lid);
if ($res->isSuccess())
{
$result->setResult(true);
}
else
{
$error->addFromResult($res);
$result->setError($error);
}
return $result;
}
/**
* Copy landing.
* @param int $lid Landing id.
* @param int $toSiteId Site id (if you want copy in another site).
* @return \Bitrix\Landing\PublicActionResult
*/
public static function copy($lid, $toSiteId = false)
{
$result = new PublicActionResult();
$error = new \Bitrix\Landing\Error;
LandingCore::disableCheckDeleted();
$landingRow = LandingCore::getList(array(
'filter' => array(
'ID' => $lid
)
))->fetch();
$landing = LandingCore::createInstance($lid);
if ($landing->exist())
{
if (!$toSiteId)
{
$toSiteId = $landing->getSiteId();
}
$res = LandingCore::add(array(
'CODE' => $landingRow['CODE'],
'ACTIVE' => $landingRow['ACTIVE'],
'PUBLIC' => $landingRow['PUBLIC'],
'TITLE' => $landingRow['TITLE'],
'XML_ID' => $landingRow['XML_ID'],
'DESCRIPTION' => $landingRow['DESCRIPTION'],
'TPL_ID' => $landingRow['TPL_ID'],
'SITE_ID' => $toSiteId,
'SITEMAP' => $landingRow['SITEMAP'],
'FOLDER' => $landingRow['FOLDER'],
'FOLDER_ID' => ($toSiteId == $landing->getSiteId())
? $landingRow['FOLDER_ID']
: null
));
// landing allready create, just copy the blocks
if ($res->isSuccess())
{
LandingCore::setEditMode();
$landingNew = LandingCore::createInstance($res->getId());
if ($landingNew->exist())
{
$landingNew->copyAllBlocks($landing->getId());
// copy hook data
\Bitrix\Landing\Hook::copyLanding(
$landingRow['ID'],
$landingNew->getId()
);
$result->setResult($landingNew->getId());
}
$result->setError(
$landingNew->getError()
);
}
else
{
$error->addFromResult($res);
$result->setError($error);
}
}
$result->setError($landing->getError());
LandingCore::enableCheckDeleted();
return $result;
}
/**
* Mark entity as deleted.
* @param int $lid Entity id.
* @param boolean $mark Mark.
* @return \Bitrix\Landing\PublicActionResult
*/
public static function markDelete($lid, $mark = true)
{
$result = new PublicActionResult();
$error = new \Bitrix\Landing\Error;
if ($mark)
{
$res = LandingCore::markDelete($lid);
}
else
{
$res = LandingCore::markUnDelete($lid);
}
if ($res->isSuccess())
{
$result->setResult($res->getId());
}
else
{
$error->addFromResult($res);
$result->setError($error);
}
return $result;
}
/**
* Mark entity as undeleted.
* @param int $lid Entity id.
* @return \Bitrix\Landing\PublicActionResult
*/
public static function markUnDelete($lid)
{
return self::markDelete($lid, false);
}
/**
* Upload file by url or from FILE.
* @param int $lid Landing id.
* @param string $picture File url / file array.
* @param string $ext File extension.
* @param array $params Some file params.
* @return \Bitrix\Landing\PublicActionResult
*/
public static function uploadFile($lid, $picture, $ext = false, $params = array())
{
static $internal = true;
$result = new PublicActionResult();
$error = new \Bitrix\Landing\Error;
$landing = LandingCore::createInstance($lid);
if ($landing->exist())
{
$file = Manager::savePicture($picture, $ext, $params);
if ($file)
{
File::addToLanding($lid, $file['ID']);
$result->setResult(array(
'id' => $file['ID'],
'src' => $file['SRC']
));
}
else
{
$error->addError(
'FILE_ERROR',
Loc::getMessage('LANDING_FILE_ERROR')
);
$result->setError($error);
}
}
$result->setError($landing->getError());
return $result;
}
/**
* Set some content to the Head section.
* @param int $lid Landing id.
* @param $content Some content.
* @return \Bitrix\Landing\PublicActionResult
*/
public static function updateHead($lid, $content)
{
static $internal = true;
$result = new PublicActionResult();
$landing = LandingCore::createInstance($lid);
$result->setResult(false);
if ($landing->exist())
{
// fix module security
$content = str_replace('<st yle', '<style', $content);
$content = str_replace('<li nk ', '<link ', $content);
$fields = array(
'ENTITY_ID' => $lid,
'ENTITY_TYPE' => \Bitrix\Landing\Hook::ENTITY_TYPE_LANDING,
'HOOK' => 'FONTS',
'CODE' => 'CODE'
);
$res = HookDataTable::getList(array(
'select' => array(
'ID'
),
'filter' => $fields
));
if ($row = $res->fetch())
{
HookDataTable::update(
$row['ID'],
array(
'VALUE' => $content
)
);
}
else
{
$fields['VALUE'] = $content;
HookDataTable::add($fields);
}
$result->setResult(true);
}
$result->setError($landing->getError());
return $result;
}
}