42 $this->landingId = $this->landingInstance->getId();
57 foreach ($this->siteData->getBlocks() as $block)
59 $this->updateBlock($block);
70 private function updateBlock(
Data\
Block $blockData): void
72 $blockId = $blockData->getId();
74 if (!$blockId || $blockId <= 0)
79 $blockInstance = $this->landingInstance->getBlockById($blockId);
80 $blockNodes = $blockData->getNodes();
81 if ($blockInstance && $blockNodes)
84 foreach ($blockNodes as $blockNode)
86 $code = $blockNode->getCode();
87 $nodesArray[
$code] = $blockNode->getValues();
89 $blockInstance->updateNodes($nodesArray);
90 $blockInstance->save();
92 $this->updateBlockStyles($blockInstance, $blockData);
96 private function updateBlockStyles(\
Bitrix\
Landing\Block $blockInstance, Data\Block $blockData): void
100 $styles = $this->updateBackgroundStyles($styles, $blockData, $blockInstance);
101 $styles = $this->updateNodeStyles($styles, $blockData, $blockInstance);
103 $this->applyStylesToBlock($blockData, $styles);
106 private function updateBackgroundStyles(
108 Data\Block $blockData,
109 \
Bitrix\Landing\Block $blockInstance
112 $updatedStyles = $styles;
113 $blockStyles = $blockData->getStyles();
115 $styleManifest = $blockInstance->getManifest()[
'style'] ?? [];
116 $typesWithBackground = [
119 'block-default-background',
120 'block-default-background-height-vh',
125 isset($styleManifest[
'block'][
'type'])
128 $typesWithBackground,
129 $styleManifest[
'block'][
'type']
134 $wrapperSelector =
'#block' . $blockInstance->getId();
135 $blockContent = $blockInstance->getContent();
136 $wrapperSelectorClasses = explode(
' ', Data\Block\Operator::extractWrapperClasses($blockContent));
139 isset($blockStyles[
'background']) && $blockStyles[
'background'] !==
''
140 && !in_array(
'g-bg-image', $wrapperSelectorClasses,
true)
143 $preparedSelectorClasses = [];
144 $bgStyleClass =
'g-bg';
145 foreach ($wrapperSelectorClasses as $class)
148 $class === $bgStyleClass
149 || (!str_starts_with($class,
'g-bg-') && !str_starts_with($class,
'g-theme-'))
152 $preparedSelectorClasses[] = $class;
155 if (!in_array($bgStyleClass, $preparedSelectorClasses,
true))
157 $preparedSelectorClasses[] = $bgStyleClass;
159 $updatedStyles[$wrapperSelector] = [
160 'style' => [
'--bg' => $blockStyles[
'background']],
161 'classList' => $preparedSelectorClasses,
166 return $updatedStyles;
169 private function updateNodeStyles(
171 Data\Block $blockData,
172 \Bitrix\Landing\Block $blockInstance
175 $blockStyles = $blockData->getStyles();
177 $styleManifest = $blockInstance->getManifest()[
'style'] ?? [];
178 $nodesWithProperty = [
183 if (isset($styleManifest[
'nodes']))
185 foreach ($styleManifest[
'nodes'] as $codeNode => $styleNode)
187 $nodesWithProperty = $this->processStyleNode(
196 $updatedStyles = $this->applyColorStyles($styles, $blockData, $nodesWithProperty[
'color'], $blockInstance);
198 return $this->applyFontFamilyStyles(
201 $nodesWithProperty[
'fontFamily'],
206 private function processStyleNode(
210 array $nodesWithProperty,
213 $updatedNodesWithProperty = $nodesWithProperty;
215 if (is_string($styleNode[
'type']))
217 $styleNode[
'type'] = [$styleNode[
'type']];
220 if (!is_array($styleNode[
'type']))
222 return $updatedNodesWithProperty;
226 (isset($blockStyles[
'textsColor']) && $blockStyles[
'textsColor'] !==
'')
227 || (isset($blockStyles[
'headersColor']) && $blockStyles[
'headersColor'] !==
'')
230 $typesWithColor = [
'color',
'typo',
'typo-link',
'button'];
231 if (!empty(array_intersect($typesWithColor, $styleNode[
'type'])))
233 $updatedNodesWithProperty[
'color'][] = $codeNode;
238 (isset($blockStyles[
'textsFontName']) && $blockStyles[
'textsFontName'] !==
'')
239 || (isset($blockStyles[
'headersFontName']) && $blockStyles[
'headersFontName'] !==
'')
242 $typesWithFontFamily = [
'color',
'typo',
'typo-link',
'button'];
243 if (!empty(array_intersect($typesWithFontFamily, $styleNode[
'type'])))
245 $updatedNodesWithProperty[
'fontFamily'][] = $codeNode;
249 return $updatedNodesWithProperty;
252 private function applyColorStyles(
254 Data\Block $blockData,
255 array $nodesWithPropertyColor,
256 \Bitrix\Landing\Block $blockInstance
259 $updatedStyles = $styles;
260 if (empty($nodesWithPropertyColor))
262 return $updatedStyles;
265 $blockStyles = $blockData->getStyles();
267 $styleNodesSelectorClasses = [];
269 $blockContent = $blockInstance->getContent();
270 foreach ($nodesWithPropertyColor as $codeNode)
272 $styleNodesSelectorClasses = $this->prepareNodeSelectorClasses(
273 $styleNodesSelectorClasses,
280 $updatedStyles[$codeNode][
'style'][
'--color'] = $blockStyles[
'textsColor'];
281 $updatedStyles[$codeNode][
'classList'] = $styleNodesSelectorClasses[$codeNode];
284 return $updatedStyles;
287 private function applyFontFamilyStyles(
289 Data\Block $blockData,
290 array $nodesWithPropertyFontFamily,
291 \Bitrix\Landing\Block $blockInstance
294 $updatedStyles = $styles;
295 if (empty($nodesWithPropertyFontFamily))
297 return $updatedStyles;
300 $blockStyles = $blockData->getStyles();
302 $styleNodesSelectorClasses = [];
303 $blockContent = $blockInstance->getContent();
304 foreach ($nodesWithPropertyFontFamily as $codeNode)
306 $styleNodesSelectorClasses = $this->prepareNodeSelectorClasses(
307 $styleNodesSelectorClasses,
310 'g-font-' . strtolower(str_replace(
' ',
'-', $blockStyles[
'textsFontName'])),
312 [
'g-font-size-',
'g-font-weight-',
'g-font-style-']
314 $updatedStyles[$codeNode][
'affect'][] =
'font-family';
315 $updatedStyles[$codeNode][
'classList'] = $styleNodesSelectorClasses[$codeNode];
318 $content = Fonts::generateFontTags($blockStyles[
'textsFontName']);
322 return $updatedStyles;
325 private function prepareNodeSelectorClasses(
326 array $styleNodesSelectorClasses,
328 string $blockContent,
330 array $setPrefixToRemove,
331 array $setPrefixNotRemove
334 $preparedStyleNodesSelectorClasses = $styleNodesSelectorClasses;
336 if (!isset($preparedStyleNodesSelectorClasses[$codeNode]))
338 $preparedStyleNodesSelectorClasses[$codeNode] = explode(
340 Data\Block\Operator::extractNodeClasses(
346 $preparedSelectorClasses = [];
348 foreach ($preparedStyleNodesSelectorClasses[$codeNode] as $class)
353 $class === $classToAdd
354 || !$this->
canRemoveClass($class, $setPrefixToRemove, $setPrefixNotRemove)
358 $preparedSelectorClasses[] = $class;
361 if (!in_array($classToAdd, $preparedSelectorClasses,
true))
363 $preparedSelectorClasses[] = $classToAdd;
366 $preparedStyleNodesSelectorClasses[$codeNode] = $preparedSelectorClasses;
368 return $preparedStyleNodesSelectorClasses;
371 private function applyStylesToBlock(Data\Block $blockData,
array $styles): void
373 $blockId = $blockData->getId();
380 $blockInstance = $this->landingInstance->getBlockById($blockId);
383 Block::updateStyles($this->landingId, $blockInstance->getId(), $styles,
true);
389 foreach ($prefixes as $prefix)
391 if (!str_starts_with($class, $prefix))
396 foreach ($prefixesNotRemove as $prefixeNotRemove)
398 if (str_starts_with($class, $prefixeNotRemove))