1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
TaskCreateSite.php
См. документацию.
1<?php
2declare(strict_types=1);
3
4namespace Bitrix\Landing\Copilot\Generation\Step;
5
6use Bitrix\Landing\Copilot\Connector;
7use Bitrix\Landing\Copilot\Generation\GenerationException;
8use Bitrix\Landing\Copilot\Generation\Type\GenerationErrors;
9use Bitrix\Landing\Landing;
10use Bitrix\Landing\Manager;
11use Bitrix\Landing\Rights;
12use Bitrix\Landing\Site;
13use CUtil;
14
16{
17 private const DEFAULT_PAGE_CODE = 'create-by-copilot';
18
24 public function execute(): bool
25 {
26 parent::execute();
27
28 $this->createSite();
29
30 return true;
31 }
32
36 private function createSite(): void
37 {
38 $siteId = $this->addSite();
39 if ($siteId > 0)
40 {
41 $this->siteData->setSiteId($siteId);
42 $landingId = $this->addLanding($siteId);
43 if ($landingId > 0)
44 {
45 $this->siteData->setLandingId($landingId);
47 }
48
49 $previewSrc = $this->siteData->getPreviewImageSrc();
50 if ($previewSrc === null || $previewSrc === '')
51 {
52 $defaultPreview = Manager::getUrlFromFile('/bitrix/images/landing/copilot-preview.jpg');
53 $this->siteData->setPreviewImageSrc($defaultPreview);
54 $previewSrc = $defaultPreview;
55 }
56
57 $additionalFields = [
58 'METAOG_IMAGE' => $previewSrc,
59 ];
61 Landing::saveAdditionalFields($this->siteData->getLandingId(), $additionalFields);
63
64 if ($this->generation->getChatId())
65 {
67 ->setUserId($this->generation->getAuthorId())
68 ->setChatForSite(
69 $siteId,
70 $this->generation->getChatId()
71 )
72 ;
73 }
74 }
75 }
76
82 protected function addSite(): int
83 {
84 $colors = $this->siteData->getColors();
85 $additionalFields = [];
86
87 $this->processColor($colors->theme, 'THEME_COLOR', $additionalFields);
88 $this->processColor($colors->background, 'BACKGROUND_COLOR', $additionalFields);
89 if (isset($additionalFields['BACKGROUND_COLOR']))
90 {
91 $additionalFields['BACKGROUND_USE'] = 'Y';
92 }
93 $this->processColor($colors->headersBg, 'THEMEFONTS_COLOR_H', $additionalFields);
94 $this->processColor($colors->textsBg, 'THEMEFONTS_COLOR', $additionalFields);
95
96 $fonts = $this->siteData->getFonts();
97 $additionalFields['THEMEFONTS_CODE_H'] = $fonts->headers;
98 $additionalFields['THEMEFONTS_CODE'] = $fonts->texts;
99
100 $siteTitle = $this->siteData->getSiteTitle();
101 $siteFields = [
102 'TITLE' => $siteTitle,
103 'CODE' => self::getTranslitedCode($siteTitle),
104 'TYPE' => 'PAGE',
105 'ADDITIONAL_FIELDS' => $additionalFields,
106 ];
108 $siteAddResult = Site::add($siteFields);
110
111 return $siteAddResult->isSuccess() ? $siteAddResult->getId() : 0;
112 }
113
121 protected function addLanding(int $siteId): int
122 {
123 $pageTitle = $this->siteData->getPageTitle();
124 $landingFields = [
125 'SITE_ID' => $siteId,
126 'TITLE' => $pageTitle,
128 ];
129
131 $landingAddResult = Landing::add($landingFields);
133
134 if (!$landingAddResult->isSuccess())
135 {
136 return 0;
137 }
138
139 return $landingAddResult->getId();
140 }
141
142 protected function addAdditionalFieldsToLanding(): void
143 {
144 $pageTitle = $this->siteData->getPageTitle();
145 $pageDescription = $this->siteData->getPageDescription();
146 $additionalFields = [
147 'METAOG_DESCRIPTION' => $pageDescription,
148 'METAMAIN_USE' => 'Y',
149 'METAMAIN_TITLE' => $pageTitle,
150 'METAMAIN_DESCRIPTION' => $pageDescription,
151 'METAMAIN_KEYWORDS' => $this->siteData->getKeywords() ?? '',
152 ];
153
154 $landingId = $this->siteData->getLandingId();
155
157 Landing::saveAdditionalFields($landingId, $additionalFields);
159 }
160
170 private function processColor(string $color, string $fieldKey, array &$additionalFields): void
171 {
172 $code = $this->convertToLowercase($color);
173 if ($this->isValidHexCode($code))
174 {
175 $additionalFields[$fieldKey] = $code;
176 }
177 }
178
186 private function convertToLowercase(string $string): string
187 {
188 return strtr($string, 'ABCDEF', 'abcdef');
189 }
190
198 private function isValidHexCode(string $string): bool
199 {
200 return preg_match('/^#[0-9a-f]{6}$/', $string) === 1;
201 }
202
211 protected static function getTranslitedCode(string $code): ?string
212 {
213 $params = [
214 "max_len" => 30,
215 "change_case" => "L",
216 "replace_space" => "-",
217 "replace_other" => "",
218 "delete_repeat_replace" => true,
219 ];
220 $translitedCode = CUtil::translit(
221 $code,
222 LANGUAGE_ID,
223 $params
224 );
225 $pattern = '/[^-]/';
226 if (LANGUAGE_ID !== 'en' && !preg_match($pattern, $translitedCode))
227 {
228 $translitedCode = CUtil::translit(
229 $translitedCode,
230 'en',
231 $params
232 );
233 }
234 if (!preg_match($pattern, $translitedCode))
235 {
236 $translitedCode = self::DEFAULT_PAGE_CODE;
237 }
238
239 return $translitedCode;
240 }
241
247 public function isFinished(): bool
248 {
249 $siteId = $this->siteData->getSiteId();
250 $landingId = $this->siteData->getLandingId();
251
252 if (is_int($siteId) && is_int($landingId) && $siteId > 0 && $landingId > 0)
253 {
254 return true;
255 }
256
257 if (is_int($siteId) && is_int($landingId))
258 {
259 $exceptionMessage = "Landing id not correct.";
260 }
261 else
262 {
263 $exceptionMessage = "Site id not correct.";
264 }
265
266 throw new GenerationException(
267 GenerationErrors::dataValidation,
268 $exceptionMessage,
269 );
270 }
271}
static saveAdditionalFields(Entity\Event $event)
Определения site.php:1329
static getUrlFromFile($file)
Определения manager.php:1082
static setGlobalOn()
Определения rights.php:116
static setGlobalOff()
Определения rights.php:107
for($fileNumber="";; $fileNumber++) $pageTitle
Определения file_new.php:204
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
Определения options.php:195
$siteId
Определения ajax.php:8
Определения binding.php:2
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
if(!Loader::includeModule('sale')) $pattern
Определения index.php:20