- Модуль: landing
- Путь к файлу: ~/bitrix/modules/landing/lib/publicaction/block.php
- Класс: Bitrix\Landing\PublicAction\Block
- Вызов: Block::updateNodes
static function updateNodes($lid, $block, array $data, array $additional = array(), bool $preventHistory = false)
{
$error = new \Bitrix\Landing\Error;
$result = new PublicActionResult();
$attributes = array();
$components = array();
$content = array();
$data = (array) $data;
$dynamicParamsExists = false;
$block = intval($block);
Landing::setEditMode();
$preventHistory ? History::deactivate() : History::activate();
// save dynamic cards settings
if (isset($data['dynamicState']) || isset($data['dynamicBlock']))//@tmp refactor
{
$dynamicParamsExists = true;
$landing = Landing::createInstance($lid, [
'blocks_id' => $block
]);
if ($landing->exist())
{
if ($blockCurrent = $landing->getBlockById($block))
{
$manifest = $blockCurrent->getManifest();
if (
!isset($manifest['block']['dynamic']) ||
$manifest['block']['dynamic'] !== false
)
{
// get dynamic data from request or from block
if (isset($data['dynamicParams']))
{
$dynamicParams = $data['dynamicParams'];
unset($data['dynamicParams']);
}
else
{
$dynamicParams = $blockCurrent->getDynamicParams();
}
// if some dynamic is off
if (isset($data['dynamicState']))
{
foreach ((array) $data['dynamicState'] as $selector => $flag)
{
if (!Utils::isTrue($flag) && isset($dynamicParams[$selector]))
{
unset($dynamicParams[$selector]);
}
}
}
$blockCurrent->saveDynamicParams(
$dynamicParams
);
}
$result->setResult(true);
}
else
{
$error->addError(
'BLOCK_NOT_FOUND',
Loc::getMessage('LANDING_BLOCK_NOT_FOUND')
);
$result->setError($error);
}
}
$result->setError($landing->getError());
}
// break on error
if (!$result->getError()->isEmpty())
{
return $result;
}
// collect selectors in right array
foreach ($data as $selector => $value)
{
if (mb_strpos($selector, '@') !== false)
{
[$selector, $position] = explode('@', $selector);
}
else
{
$position = -1;
}
if (!isset($data[$selector]))
{
$data[$selector] = array();
}
if (isset($value['attrs']) && count($value) == 1)
{
if (mb_strpos($selector, ':') !== false)
{
$components[$selector] = $value['attrs'];
}
else
{
$attributes[$selector][$position] = $value['attrs'];
}
}
else
{
if (!isset($content[$selector]))
{
$content[$selector] = array();
}
$content[$selector][max(0, $position)] = $value;
}
}
// data is not empty
if (!empty($content) || !empty($attributes) || !empty($components))
{
if (!isset($landing))
{
$landing = Landing::createInstance($lid, [
'blocks_id' => $block
]);
}
// try find the block in landing instance
if ($landing->exist())
{
$blocks = $landing->getBlocks();
if (isset($blocks[$block]))
{
if (!empty($content))
{
$blocks[$block]->updateNodes($content, $additional);
}
if (!empty($attributes))
{
$blocks[$block]->setAttributes($attributes);
}
if (!empty($components))
{
// fix for security waf
if (!$blocks[$block]->getRepoId())
{
$manifest = $blocks[$block]->getManifest();
foreach ($components as $selector => &$attrs)
{
if (
isset($manifest['nodes'][$selector]['waf_ignore']) &&
$manifest['nodes'][$selector]['waf_ignore']
)
{
$rawData = \Bitrix\Landing\PublicAction::getRawData();
if (isset($rawData['data'][$selector]['attrs']))
{
$rawAttrs = $rawData['data'][$selector]['attrs'];
foreach ($attrs as $attCode => &$attValue)
{
$attValue = $rawAttrs[$attCode];
$attValue = \Bitrix\Main\Text\Encoding::convertEncoding(
$attValue,
'utf-8',
SITE_CHARSET
);
}
}
unset($attValue);
}
}
unset($attrs);
$blocks[$block]->updateNodes($components, $additional);
}
}
$blocks[$block]->saveContent(
str_replace(
'contenteditable="true"',
'',
$blocks[$block]->getContent()
)
);
$result->setResult($blocks[$block]->save());
$result->setError($blocks[$block]->getError());
if ($blocks[$block]->getError()->isEmpty())
{
$landing->touch();
}
}
else
{
$error->addError(
'BLOCK_NOT_FOUND',
Loc::getMessage('LANDING_BLOCK_NOT_FOUND')
);
}
}
$result->setError($landing->getError());
}
else if (!$dynamicParamsExists)
{
$error->addError(
'NODES_NOT_FOUND',
Loc::getMessage('LANDING_BLOCK_NODES_NOT_FOUND')
);
}
$result->setError($error);
return $result;
}