28 private const DEFAULT_PADDING =
'50';
35 private const TITLE_PADDING_BOTTOM =
'15';
42 private const BLOCK_AFTER_TITLE_PADDING_TOP =
'15';
44 private const EVENT_NAME =
'onBlocksCreated';
70 $this->landingInstance = $this->siteData->getLandingInstance();
71 $this->landingId = $this->landingInstance->getId();
78 $siteId = $this->siteData->getSiteId() ?? 0;
79 $metrika->setType(
Metrika\Types::ai)
80 ->setParam(3,
'siteId', (
string)
$siteId)
85 subSection:
'from_ai',
88 Site::publication($this->landingInstance->getSiteId(),
true, $metrikaParams);
91 $this->updateRequestEntityInTable();
105 foreach ($this->siteData->getBlocks() as $block)
107 if ($block->getId() === 0)
110 GenerationErrors::dataValidation,
111 "Block not exist correct id.",
126 $this->generation->getScenario()?->getChatbot()?->sendGenerationEndMessage(
138 foreach ($this->siteData->getBlocks() as $block)
140 $this->addBlock($block);
144 $this->
getEvent()->send(self::EVENT_NAME);
155 $menuBlock = $this->siteData->getMenuBlock();
162 $blockInstance = $this->landingInstance->getBlockById($menuBlock->getId());
169 $linkItemsNodeCode = Collector::getMenuItemsNodeCode($menuBlock->getCode());
170 $linkCardsNodeCode = Collector::getMenuCardsNodeCode($menuBlock->getCode());
171 $blockInstance->updateCards($this->getMenuCardsData($linkItemsNodeCode, $linkCardsNodeCode));
172 $blockInstance->save();
182 private function addBlock(
Data\
Block $blockData): void
184 $blockCode = $blockData->getCode();
188 $blockId = $this->landingInstance->addBlock($blockCode, [
192 $blockInstance = $this->landingInstance->getBlockById($blockId);
193 $blockData->setId($blockId);
195 $blockNodes = $blockData->getNodes();
201 foreach ($blockNodes as $blockNode)
203 $code = $blockNode->getCode();
204 $nodesArray[
$code] = $blockNode->getValues();
206 $blockInstance->updateNodes($nodesArray);
207 $blockInstance->save();
210 $wrapperSelectorClasses = explode(
" ",
Data\
Block\Operator::extractWrapperClasses($blockInstance->getContent()));
211 $blockData->setWrapperClasses($wrapperSelectorClasses);
213 $this->updateBlockStyles($blockInstance, $blockData);
226 private function getMenuCardsData(
string $nodeCode,
string $cardCode):
array
228 $blocks = $this->siteData->getBlocks();
231 foreach ($blocks as $block)
233 $blockMenuTitle = $block->getMenuTitle();
236 $menuData[
'source'][] = [
237 'value' => (string)
$count,
240 $codeKey = sprintf(
'%s@%d', $nodeCode,
$count);
243 'text' => $blockMenuTitle,
244 'href' => sprintf(
'block:#block%d', $block->getId()),
248 $menuData[
'values'][] = $menuDataItem;
253 return [$cardCode => $menuData];
264 private function updateBlockStyles(\Bitrix\Landing\Block $blockInstance, Data\Block $blockData): void
266 $this->updateStylesForBlockWithSpecificSection($blockInstance, $blockData);
269 $this->updateBackgroundColorForWrapperNode($blockInstance, $blockData);
270 $this->updateImageNodesEditingInStyle($blockInstance, $blockData);
273 $this->updateColorStylesForNodesAtBlockWithPrimaryBgType($blockInstance, $blockData);
276 $this->updatePaddingStyles($blockInstance, $blockData);
277 $this->updateTitleStyles($blockInstance, $blockData);
288 private function updateTitleStyles(\Bitrix\Landing\Block $blockInstance, Data\Block $blockData): void
290 $titleNodes = Collector::getTitleNodes($blockData->getCode());
291 if (
count($titleNodes) > 0)
293 $selector = $titleNodes[0];
297 '/class="([^"]*' . substr($selector, 1) .
'[^"]*)"/',
298 $blockInstance->getContent(),
303 $classList = explode(
" ",
$matches[1]);
306 $filteredClassList = array_filter($classList,
static function($className) {
307 return !str_starts_with($className,
'u-heading-v2-');
309 $filteredClassList = array_values($filteredClassList);
310 $filteredClassList[] = $this->siteData->getTitleStyleClass();
314 'classList' => $filteredClassList,
318 Block::updateStyles($this->landingId, $blockInstance->getId(), $styles,
true);
330 private function updateStylesForBlockWithSpecificSection(
331 \Bitrix\Landing\Block $blockInstance,
332 Data\Block $blockData
335 if ($blockData->isSeparator())
337 $this->updateSeparatorStyles($blockInstance, $blockData);
339 elseif ($blockData->isMenu())
341 $this->updateMenuStyles($blockInstance, $blockData);
355 private function updateBackgroundColorForWrapperNode(
356 \Bitrix\Landing\Block $blockInstance,
357 Data\Block $blockData
360 $bgType = $blockData->getBgType();
361 if ($bgType ===
'primary' || $bgType ===
'transparent')
363 $wrapperSelector =
'#block' . $blockInstance->getId();
364 $this->updateBackgroundColorStyles($blockInstance, $blockData, $wrapperSelector);
376 private function updateImageNodesEditingInStyle(\Bitrix\Landing\Block $blockInstance, Data\Block $blockData): void
378 foreach ($blockData->getNodes() as $node)
381 $node->getType() === Data\Type\NodeType::Img
382 && method_exists($node,
'isEditInStyle')
383 && $node->isEditInStyle()
386 $values = $node->getValues();
389 $firstValue = array_shift($values);
390 if (isset($firstValue[
'src']))
392 $this->updateBackgroundImageStyles(
412 private function updateSeparatorStyles(\Bitrix\Landing\Block $blockInstance, Data\Block $blockData): void
414 $selector =
'#block' . $blockInstance->getId();
415 $selectorClasses = $blockData->getWrapperClasses();
416 $bgType = $blockData->getBgType();
419 if ($bgType ===
'primaryToTransparent')
421 $firstColor =
'var(--primary)';
422 $secondColor =
'hsla(0, 0%, 100%, 0)';
424 if ($bgType ===
'transparentToPrimary')
426 $firstColor =
'hsla(0, 0%, 100%, 0)';
427 $secondColor =
'var(--primary)';
430 $separatorsHeight = Collector::getSeparatorsHeight();
431 $code = $blockData->getCode();
432 if (isset($separatorsHeight[
$code][
'heightClass']))
434 $filteredClasses = array_filter($selectorClasses,
static function($class) {
435 return !preg_match(
'/g-height-\d+--md/', $class);
437 $selectorClasses = array_values($filteredClasses);
438 $selectorClasses[] = $separatorsHeight[
$code][
'heightClass'];
444 '--fill-first' => $firstColor,
445 '--fill-second' => $secondColor,
447 'classList' => $selectorClasses,
450 $blockData->setWrapperClasses($selectorClasses);
452 Block::updateStyles($this->landingId, $blockInstance->getId(), $styles,
true);
465 private function updateBackgroundImageStyles(
466 \Bitrix\Landing\Block $blockInstance,
467 Data\Block $blockData,
469 string $imageBackgroundLink =
''
473 $preparedSelectorClasses = [];
476 str_starts_with($selector,
'.')
477 && in_array(substr($selector, 1), $blockData->getWrapperClasses(),
true)
484 $selector =
'#block' . $blockInstance->getId();
485 $selectorClasses = $blockData->getWrapperClasses();
489 $blockContent = $blockInstance->getContent();
490 $selectorClasses = explode(
' ', Data\Block\Operator::extractNodeClasses($selector, $blockContent));
492 $selectorClasses[] =
'g-bg-image';
493 $url =
'url("' . $imageBackgroundLink .
'")';
495 'background-image' =>
'',
497 '--bg-url-2x' =>
$url,
498 '--bg-overlay' =>
'hsla(0, 0%, 0%, 0.5)',
499 '--bg-size' =>
'cover',
500 '--bg-attachment' =>
'scroll',
502 foreach ($selectorClasses as $class)
505 $class ===
'g-bg-image'
506 || (!str_starts_with($class,
'g-bg') && !str_starts_with($class,
'g-theme-'))
509 $preparedSelectorClasses[] = $class;
515 'style' => $wrapperStyle,
516 'classList' => $preparedSelectorClasses,
521 $blockData->setWrapperClasses($preparedSelectorClasses);
524 Block::updateStyles($this->landingId, $blockInstance->getId(), $styles,
true);
536 private function updateBackgroundColorStyles(
537 \Bitrix\Landing\Block $blockInstance,
538 Data\Block $blockData,
542 $preparedSelectorClasses = [];
543 $selectorClasses = $blockData->getWrapperClasses();
544 $selectorClasses[] =
'g-bg';
545 $bgType = $blockData->getBgType();
547 if ($bgType ===
'transparent')
549 $bgStyle =
'hsla(0, 0%, 100%, 0)';
551 if ($bgType ===
'primary')
553 $bgStyle =
'var(--primary)';
558 foreach ($selectorClasses as $class)
562 || (!str_starts_with($class,
'g-bg-') && !str_starts_with($class,
'g-theme-'))
565 $preparedSelectorClasses[] = $class;
571 'style' => $wrapperStyle,
572 'classList' => $preparedSelectorClasses,
576 $blockData->setWrapperClasses($preparedSelectorClasses);
578 Block::updateStyles($this->landingId, $blockInstance->getId(), $styles,
true);
589 private function updatePaddingStyles(\Bitrix\Landing\Block $blockInstance, Data\Block $blockData): void
591 $selectorClasses = $blockData->getWrapperClasses();
592 $bgType = $blockData->getBgType();
595 && !$blockData->isMenu()
596 && !$blockData->isSeparator()
597 && !$blockData->isCover()
600 $filteredClasses = array_filter($selectorClasses,
static function($class) {
601 return !preg_match(
'/g-(pb|pt)-\d+/', $class);
603 $selectorClasses = array_values($filteredClasses);
605 $paddingTopClass =
'g-pt-' . self::DEFAULT_PADDING;
606 $paddingBottomClass =
'g-pb-' . self::DEFAULT_PADDING;
607 if ($blockData->isTitle())
609 $paddingBottomClass =
'g-pb-' . self::TITLE_PADDING_BOTTOM;
613 $blocks = $this->siteData->getBlocks();
614 foreach ($blocks as $block)
616 if ($block === $blockData)
620 $previousBlock = $block;
623 if (isset($previousBlock) && $previousBlock->getSection() ===
'title')
625 $paddingTopClass =
'g-pt-' . self::BLOCK_AFTER_TITLE_PADDING_TOP;
628 $selectorClasses[] = $paddingTopClass;
629 $selectorClasses[] = $paddingBottomClass;
631 $selector =
'#block' . $blockInstance->getId();
634 'classList' => $selectorClasses,
637 $blockData->setWrapperClasses($selectorClasses);
639 Block::updateStyles($this->landingId, $blockInstance->getId(), $styles,
true);
651 private function updateMenuStyles(\Bitrix\Landing\Block $blockInstance, Data\Block $blockData): void
653 $blockContent = $blockInstance->getContent();
655 if (preg_match(
'/class="([^"]*navbar [^"]*)"/', $blockContent,
$matches))
657 $classList = explode(
" ",
$matches[1]);
659 if (
count($classList) > 0)
662 $bgType = $blockData->getBgType();
663 $colors = $this->siteData->getColors();
667 $classList[] =
'u-navbar-color';
668 $style[
'--navbar-color'] =
'var(--theme-color-title)';
671 $classList[] =
'u-navbar-color';
672 $classList[] =
'u-navbar-color--hover';
673 $style[
'--navbar-color'] = $colors->headersTheme;
674 $style[
'--navbar-color--hover'] = $colors->textsTheme;
680 'classList' => $classList,
684 Block::updateStyles($this->landingId, $blockInstance->getId(), $styles,
true);
696 private function updateColorStylesForNodesAtBlockWithPrimaryBgType(
697 \Bitrix\Landing\Block $blockInstance,
698 Data\Block $blockData
701 if ($blockData->getBgType() !==
'primary')
706 $blockWithPrimaryBg = Collector::getStylesDataForBlockWithPrimaryBg($blockData->getCode());
707 if (!$blockWithPrimaryBg)
713 $colors = $this->siteData->getColors();
714 $blockContent = $blockInstance->getContent();
715 foreach ($blockWithPrimaryBg as $styleNodeName => $styleNodeValues)
717 $properties = $styleNodeValues[
'property'];
718 $styleValues = $styleNodeValues[
'styleValue'];
720 foreach ($styleValues as $styleValue)
722 if ($styleValue ===
'colorsHeadersTheme')
724 $value = $colors->headersTheme;
726 elseif ($styleValue ===
'colorsTextsTheme')
728 $value = $colors->textsTheme;
734 $styles[$styleNodeName][
'style'][$properties[
$count]] =
$value;
735 $styles[$styleNodeName][
'classList'][] = Data\Block\Operator::extractNodeClasses($styleNodeName, $blockContent);
740 Block::updateStyles($this->landingId, $blockInstance->getId(), $styles,
true);
743 private function updateRequestEntityInTable(): void
746 $imgNodesUsesPreviewImage = Collector::getImgNodesUsePreviewImage();
747 foreach ($this->siteData->getBlocks() as $block)
749 $codeBlock = $block->getCode();
750 foreach ($block->getNodes() as $node)
752 $codeNode = $node->getCode();
754 isset($imgNodesUsesPreviewImage[$codeBlock])
755 && in_array($codeNode, $imgNodesUsesPreviewImage[$codeBlock])
758 $blockId = $block->getId();
760 $promptGenerator =
new PromptGenerator(
new PromptTemplateProvider(), $this->siteData);
761 $promptTexts = $promptGenerator->getUpdatedPromptTexts((
array)$this->siteData->getPreviewImagePromptText());
762 $node->setPromptTexts($promptTexts);
770 foreach($this->generation->getScenario()?->getMap() as
$stepId => $step)
784 if (!empty($requestIds))
786 $items = RequestToEntitiesTable::getList([
789 'REQUEST_ID' => $requestIds,
790 'LANDING_ID' =>
false,
794 while ($item =
$items->fetch())
796 RequestToEntitiesTable::update(
799 'LANDING_ID' => $this->siteData->getLandingId(),
800 'BLOCK_ID' => $blockId,