1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
widgetvue.php
См. документацию.
1<?php
2
3namespace Bitrix\Landing\Subtype;
4
5use Bitrix\Landing\Assets\Manager;
6use Bitrix\Landing\Block;
7use Bitrix\Landing\Repo;
8use Bitrix\Landing\Mainpage;
9use Bitrix\Landing;
10use Bitrix\Main\Loader;
11use Bitrix\Main\Localization\Loc;
12use Bitrix\Main\UI\Extension;
13use Bitrix\Main\Web\DOM;
14use Bitrix\Main\Web\Json;
15use Bitrix\Rest\UsageStatTable;
16
21{
22 private const APP_DEBUG_OPTION_NAME = 'widgetvue_debug';
23
31 public static function prepareManifest(array $manifest, ?Block $block = null, array $params = []): array
32 {
33 if (!self::checkParams($block, $params))
34 {
35 return $manifest;
36 }
37
38 $manifest['nodes'] = [];
39 $manifest['assets'] = [
40 'ext' => [
41 'landing.widgetvue',
42 'main.loader',
43 ],
44 ];
45
46 $manifest['style'] = [
47 'block' => [
48 'type' => ['widget'],
49 ],
50 ];
51
52 $assets = Manager::getInstance();
53 $assets->addString(self::getVueScript($block, $params));
54
55 if (
57 && Loader::includeModule('rest')
58 )
59 {
60 $app = self::getAppInfo($block);
61 if (isset($app['CLIENT_ID']))
62 {
63 UsageStatTable::logLandingWidget($app['CLIENT_ID'], 'render');
64 UsageStatTable::finalize();
65 }
66 }
67
68 // add callbacks
69 $manifest['callbacks'] = [
70 'afterAdd' => function (Block $block) use ($params)
71 {
72 $content = $block->getContent();
73 $doc = new DOM\Document();
74 try
75 {
76 $doc->loadHTML($content);
77 }
78 catch (\Exception $e)
79 {}
80
81 $rootNode = $doc->querySelector($params['rootNode']);
82 if (!$rootNode)
83 {
84 return;
85 }
86
87 $newId = self::getRootNodeId($block);
88 $rootNode->setAttribute('id', $newId);
89 $rootNode->setInnerHTML(
90 self::getLoaderString($block)
91 . self::getInitScript($block)
92 );
93
94 $parentNode = $rootNode->getParentNode();
95
96 $wrapperNode = $doc->createElement('div');
97 $wrapperNode->setClassName('landing-block');
98
99 $wrapperNode->setChildNodesArray([$rootNode]);
100 $parentNode->setChildNodesArray([$wrapperNode]);
101
102 $block->saveContent($doc->saveHTML());
103 $block->save();
104 },
105 ];
106
107 return $manifest;
108 }
109
110 private static function getAppInfo(Block $block): ?array
111 {
112 static $apps = [];
113
114 $repoId = $block->getRepoId();
115 if ($repoId)
116 {
117 if (!isset($apps[$repoId]))
118 {
119 $apps[$repoId] = Repo::getAppInfo($repoId);
120 }
121
122 return $apps[$repoId];
123 }
124
125 return null;
126 }
127
128 private static function getRootNodeId(Block $block, bool $loader = false): string
129 {
130 $id = $loader ? 'mp_widget_loader' : 'mp_widget';
131 $id .= $block->getId();
132
133 return $id;
134 }
135
136 private static function checkParams(?Block $block, array $params): bool
137 {
138 if (!$block)
139 {
140 return false;
141 }
142
143 if (!isset($params['rootNode']) || !is_string($params['rootNode']))
144 {
145 return false;
146 }
147
148 return true;
149 }
150
151 private static function getVueScript(Block $block, array $params): string
152 {
153 $rootNodeId = self::getRootNodeId($block);
154 $vueParams = [
155 'blockId' => $block->getId(),
156 'rootNode' => '#' . $rootNodeId,
157 'lang' => self::getLangPhrases($params),
158 ];
159
160 $app = self::getAppInfo($block);
161 if ($app && isset($app['ID']))
162 {
163 $vueParams['appId'] = (int)$app['ID'];
164
165 $vueParams['appAllowedByTariff'] = true;
166 if ($app['PAYMENT_ALLOW'] !== 'Y')
167 {
168 $vueParams['appAllowedByTariff'] = false;
169 }
170 }
171
172 $content = Block::getContentFromRepository($block->getCode());
173 $vueParams['template'] = $content ?? '';
174
175 if (
176 isset($params['style'])
177 && is_string($params['style'])
178 )
179 {
180 $vueParams['style'] = $params['style'];
181 }
182
183 $vueParams['useDemoData'] = Mainpage\Manager::isUseDemoData();
184 if (
185 is_array($params['demoData'])
186 && !empty($params['demoData'])
187 )
188 {
189 $vueParams['demoData'] = $params['demoData'];
190 }
191
192 if (
193 isset($params['handler'])
194 && is_string($params['handler'])
195 && mb_strlen($params['handler']) > 0
196 )
197 {
198 $vueParams['fetchable'] = true;
199 }
200
201 $vueParams['debug'] = false;
202 if (isset($app['CODE']))
203 {
204 $vueParams['debug'] = self::isAppDebugEnabled($app['CODE']);
205 }
206
207 $vueParams = Json::encode($vueParams);
208 $type = Landing\Site\Scope::getCurrentScopeId();
209
210 return "
211 <script>
212 (() => {
213 if (BX.Landing.Env)
214 {
215 BX.Landing.Env.getInstance().setType('{$type}');
216 }
217
218 const init = () => {
219 (new BX.Landing.WidgetVue(
220 {$vueParams}
221 )).mount();
222 };
223
224 if (BX('{$rootNodeId}'))
225 {
226 init();
227 }
228 else
229 {
230 BX.addCustomEvent('BX.Landing.WidgetVue:initNode', blockId => {
231 if (blockId === '$rootNodeId')
232 {
233 init();
234 }
235 });
236 }
237 })();
238 </script>
239 ";
240 }
241
242 private static function getLangPhrases(array $params): array
243 {
244 $phrases = '{}';
245
246 $lang = Loc::getCurrentLang();
247 $defaultLang = 'en';
248
249 if (is_array($params['lang']))
250 {
251 if (
252 isset($params['lang'][$lang])
253 || isset($params['lang'][$defaultLang])
254 )
255 {
256 $lang = isset($params['lang'][$lang]) ? $lang : $defaultLang;
257 $phrases = $params['lang'][$lang];
258 }
259 }
260
261 return $phrases;
262 }
263
264 private static function getLoaderString(Block $block): string
265 {
266 $loaderNodeId = self::getRootNodeId($block, true);
267
268 return "
269 <div id=\"$loaderNodeId\"></div>
270 <script>
271 (() => {
272 const loaderNode = BX('$loaderNodeId');
273 (new BX.Loader({
274 target: loaderNode,
275 })).show();
276 })();
277 </script>
278 <style>
279 #{$loaderNodeId} {
280 height: 200px;
281 position: relative;
282 }
283 </style>
284 ";
285 }
286
287 private static function getInitScript(Block $block): string
288 {
289 $rootNodeId = self::getRootNodeId($block);
290
291 return "
292 <script>
293 BX.onCustomEvent('BX.Landing.WidgetVue:initNode', ['$rootNodeId']);
294 </script>
295 ";
296 }
297
304 public static function setAppDebug(string $appCode, bool $enable): void
305 {
306 $data = Landing\Manager::getOption(self::APP_DEBUG_OPTION_NAME, '{}');
307 try
308 {
309 $data = Json::decode($data);
310 $data[$appCode] = $enable;
311 Landing\Manager::setOption(self::APP_DEBUG_OPTION_NAME, Json::encode($data));
312 }
313 catch (\Exception $exception)
314 {
315 return;
316 }
317 }
318
324 private static function isAppDebugEnabled(string $appCode): bool
325 {
326 $data = Landing\Manager::getOption(self::APP_DEBUG_OPTION_NAME, '');
327 try
328 {
329 $data = Json::decode($data);
330
331 return $data[$appCode] ?? false;
332 }
333 catch (\Exception $exception)
334 {
335 return false;
336 }
337 }
338}
$type
Определения options.php:106
getRepoId()
Определения block.php:1544
static getOption($code, $default=null)
Определения manager.php:160
static setOption($code, $value)
Определения manager.php:171
static isAjaxRequest()
Определения manager.php:1049
static getAppInfo(array|int $id)
Определения repo.php:245
static prepareManifest(array $manifest, ?Block $block=null, array $params=[])
Определения widgetvue.php:31
static setAppDebug(string $appCode, bool $enable)
Определения widgetvue.php:304
$content
Определения commerceml.php:144
$data['IS_AVAILABLE']
Определения .description.php:13
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$app
Определения proxy.php:8
if(!defined('SITE_ID')) $lang
Определения include.php:91
Определения agent.php:3
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799