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