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