• Модуль: landing
  • Путь к файлу: ~/bitrix/modules/landing/lib/block.php
  • Класс: BitrixLandingBlock
  • Вызов: Block::setClasses
public function setClasses($data)
{
	if ($this->access < $this::ACCESS_V)
	{
		$this->error->addError(
			'ACCESS_DENIED',
			Loc::getMessage('LANDING_BLOCK_ACCESS_DENIED')
		);
		return false;
	}

	$doc = $this->getDom();
	$manifest = $this->getManifest();

	// detects position
	$positions = [];
	$position = -1;
	foreach ((array)$data as $selector => $item)
	{
		if (mb_strpos($selector, '@') !== false)
		{
			[$selector, $position] = explode('@', $selector);
		}
		else
		{
			$position = -1;
		}
		if ($selector === '#wrapper')
		{
			$selector = '#block' . $this->id;
		}
		if ($position >= 0)
		{
			if (!isset($positions[$selector]))
			{
				$positions[$selector] = [];
			}
			$positions[$selector][] = (int)$position;
		}
		$data[$selector] = $item;
	}

	// wrapper (not realy exist)
	$wrapper = '#' . $this->getAnchor($this->id);

	// find available nodes by manifest from data
	$styles = $manifest['style']['nodes'];
	$styles[$wrapper] = $manifest['style']['block'];
	foreach ($styles as $selector => $node)
	{
		if (isset($data[$selector]))
		{
			// prepare data
			if (!is_array($data[$selector]))
			{
				$data[$selector] = [
					$data[$selector]
				];
			}

			if (!isset($data[$selector]['classList']))
			{
				$data[$selector] = [
					'classList' => $data[$selector]
				];
			}
			if (!isset($data[$selector]['affect']))
			{
				$data[$selector]['affect'] = [];
			}
			// apply classes to the block
			if ($selector === $wrapper)
			{
				$nodesArray = $doc->getChildNodesArray();
				$resultList = [array_pop($nodesArray)];
			}
			// or by selector
			else
			{
				$resultList = $doc->querySelectorAll($selector);
			}
			foreach ($resultList as $pos => $resultNode)
			{
				$relativeSelector = $selector;
				if (isset($positions[$selector]))
				{
					if (!in_array($pos, $positions[$selector], true))
					{
						continue;
					}
					$relativeSelector .= '@' . $pos;
				}

				$contentBefore = $resultNode->getOuterHTML();

				if ($resultNode)
				{
					if ((int)$resultNode->getNodeType() === $resultNode::ELEMENT_NODE)
					{
						$resultNode->setClassName(
							implode(' ', $data[$relativeSelector]['classList'])
						);
					}

					// affected styles
					if (!empty($data[$relativeSelector]['affect']))
					{
						$this->removeStyle(
							$resultNode,
							$data[$relativeSelector]['affect']
						);
					}

					// inline styles
					if (!empty($data[$relativeSelector]['style']))
					{
						$stylesInline = DOMStyleInliner::getStyle($resultNode, false);
						DOMStyleInliner::setStyle(
							$resultNode,
							array_merge($stylesInline, $data[$relativeSelector]['style'])
						);
					}
					else if (preg_match_all('/background-image:.*;/i', $resultNode->getAttribute('style'), $matches))
					{
						$resultNode->removeAttribute('style');
						$resultNode->setAttribute('style', implode('', $matches[0]));
					}

					if (History::isActive())
					{
						$history = new History($this->getLandingId(), History::ENTITY_TYPE_LANDING);
						$history->push('EDIT_STYLE', [
							'block' => $this,
							'selector' => $selector,
							'isWrapper' => ($selector === $wrapper),
							'position' => $position >= 0 ? (int)$pos : -1,
							'affect' => $data[$relativeSelector]['affect'],
							'contentBefore' => $contentBefore,
							'contentAfter' => $resultNode->getOuterHTML(),
						]);
					}
				}
			}
		}
	}
	// save rebuild html as text
	$this->saveContent($doc->saveHTML());
	AssetsPreProcessing::blockUpdateClassesProcessing($this);
	return true;
}