• Модуль: landing
  • Путь к файлу: ~/bitrix/modules/landing/lib/block.php
  • Класс: BitrixLandingBlock
  • Вызов: Block::export
public function export(array $params = [])
{
	$manifest = $this->getManifest();
	$doc = $this->getDom();

	$cards = [];
	$nodes = [];
	$menu = [];
	$styles = [];
	$allAttrs = [];

	// prepare params
	if (!isset($params['clear_form']))
	{
		$params['clear_form'] = true;
	}

	// get actual cards content
	if (isset($manifest['cards']))
	{
		foreach ($manifest['cards'] as $selector => $node)
		{
			$cards[$selector] = [
				'source' => []
			];
			$resultList = $doc->querySelectorAll($selector);
			$resultListCnt = count($resultList);
			foreach ($resultList as $pos => $result)
			{
				$cards[$selector]['source'][$pos] = array(
					'value' => $result->getAttribute('data-card-preset'),
					'type' => Block::PRESET_SYM_CODE
				);
				if (!$cards[$selector]['source'][$pos]['value'])
				{
					//@tmp for menu first item
					if (mb_strpos($this->getCode(), 'menu') !== false)
					{
						$cards[$selector]['source'][$pos]['value'] = $resultListCnt > 0 ? 1 : 0;
					}
					else
					{
						$cards[$selector]['source'][$pos]['value'] = 0;
					}
					$cards[$selector]['source'][$pos]['type'] = Block::CARD_SYM_CODE;
				}
			}
			// attrs
			if (
				isset($node['additional']['attrs']) &&
				is_array($node['additional']['attrs'])
			)
			{
				foreach ($node['additional']['attrs'] as $attr)
				{
					if (isset($attr['attribute']))
					{
						if (!isset($allAttrs[$selector]))
						{
							$allAttrs[$selector] = [];
						}
						$allAttrs[$selector][] = $attr['attribute'];
					}
				}
			}
		}
	}
	// get content nodes
	if (isset($manifest['nodes']))
	{
		foreach ($manifest['nodes'] as $selector => $node)
		{
			/** @var Node $class */
			$class = NodeType::getClassName($node['type']);
			$nodes[$selector] = $class::getNode($this, $selector);
		}
	}
	if (isset($manifest['menu']))
	{
		// recursive getting menu
		$exportMenu = function($resultList) use(&$exportMenu)
		{
			if(!$resultList)
			{
				return [];
			}

			$menu = [];
			foreach ($resultList->getChildNodesArray() as $pos => $node)
			{
				$menu[$pos] = [];
				if ($node->getNodeName() == 'LI')
				{
					foreach ($node->getChildNodesArray() as $nodeInner)
					{
						if ($nodeInner->getNodeName() == 'A')
						{
							$menu[$pos]['text'] = trim($nodeInner->getTextContent());
							$menu[$pos]['href'] = trim($nodeInner->getAttribute('href'));
							$menu[$pos]['target'] = trim($nodeInner->getAttribute('target'));
						}
						else if ($nodeInner->getNodeName() == 'UL')
						{
							$menu[$pos]['children'] = $exportMenu($nodeInner);
						}
					}
				}
				if (!$menu[$pos])
				{
					unset($menu[$pos]);
				}
			}
			return array_values($menu);
		};
		foreach ($manifest['menu'] as $selector => $menuNode)
		{
			$menu[$selector] = $exportMenu($doc->querySelector($selector));
		}
	}
	// get actual css from nodes
	if (isset($manifest['style']['nodes']))
	{
		foreach ($manifest['style']['nodes'] as $selector => $node)
		{
			$nodeStyle = NodeStyle::getStyle($this, $selector);
			if ($nodeStyle)
			{
				$styles[$selector] = $nodeStyle;
			}
			// attrs
			if (
				isset($node['additional']['attrs']) &&
				is_array($node['additional']['attrs'])
			)
			{
				foreach ($node['additional']['attrs'] as $attr)
				{
					if (isset($attr['attribute']))
					{
						if (!isset($allAttrs[$selector]))
						{
							$allAttrs[$selector] = [];
						}
						$allAttrs[$selector][] = $attr['attribute'];
					}
				}
			}
		}
	}
	// get actual css from block wrapper
	if (!empty($manifest['style']['block']))
	{
		$selector = '#wrapper';
		$wrapperStyle = NodeStyle::getStyle($this, $selector);
		if ($wrapperStyle)
		{
			$styles[$selector] = $wrapperStyle;
		}
	}
	// attrs
	if (
		isset($manifest['style']['block']['additional']['attrs']) &&
		is_array($manifest['style']['block']['additional']['attrs'])
	)
	{
		$selector = '#wrapper';
		foreach ($manifest['style']['block']['additional']['attrs'] as $attr)
		{
			if (isset($attr['attribute']))
			{
				if (!isset($allAttrs[$selector]))
				{
					$allAttrs[$selector] = [];
				}
				$allAttrs[$selector][] = $attr['attribute'];
			}
		}
	}
	// get actual attrs from nodes
	if (isset($manifest['attrs']))
	{
		foreach ($manifest['attrs'] as $selector => $item)
		{
			if (isset($item['attribute']))
			{
				if (!isset($allAttrs[$selector]))
				{
					$allAttrs[$selector] = [];
				}
				$allAttrs[$selector][] = $item['attribute'];
			}
			else if (is_array($item))
			{
				foreach ($item as $itemAttr)
				{
					if (isset($itemAttr['attribute']))
					{
						if (!isset($allAttrs[$selector]))
						{
							$allAttrs[$selector] = [];
						}
						$allAttrs[$selector][] = $itemAttr['attribute'];
					}
				}
			}
		}
	}
	// remove some system attrs
	if (
		$params['clear_form'] &&
		isset($allAttrs['.bitrix24forms'])
	)
	{
		unset($allAttrs['.bitrix24forms']);
	}
	// collect attrs
	$allAttrsNew = [];
	if (isset($allAttrs['#wrapper']))
	{
		$allAttrsNew['#wrapper'] = [];
		$nodesArray = $doc->getChildNodesArray();
		$resultList = [array_pop($nodesArray)];
		foreach ($resultList as $pos => $result)
		{
			foreach ($allAttrs['#wrapper'] as $attrKey)
			{
				if (!isset($allAttrsNew['#wrapper'][$pos]))
				{
					$allAttrsNew['#wrapper'][$pos] = [];
				}
				$allAttrsNew['#wrapper'][$pos][$attrKey] = $result->getAttribute($attrKey);
			}
		}
		unset($allAttrs['#wrapper']);
	}
	foreach ($allAttrs as $selector => $attr)
	{
		$resultList = $doc->querySelectorAll($selector);
		foreach ($resultList as $pos => $result)
		{
			if (!isset($allAttrsNew[$selector]))
			{
				$allAttrsNew[$selector] = [];
			}
			if (!isset($allAttrsNew[$selector][$pos]))
			{
				$allAttrsNew[$selector][$pos] = [];
			}
			foreach ($attr as $attrKey)
			{
				$allAttrsNew[$selector][$pos][$attrKey] = $result->getAttribute($attrKey);
			}
			unset($attrVal);
		}
	}
	$allAttrs = $allAttrsNew;
	unset($allAttrsNew);

	return [
		'cards' => $cards,
		'nodes' => $nodes,
		'menu' => $menu,
		'style' => $styles,
		'attrs' => $allAttrs,
		'dynamic' => $this->dynamicParams
	];
}